Excel VBA @竣工文件
範例影片:
前言:
工程報竣工後會有一堆文件需要輸出給上級機關簽核,尤其是當下載下來後都是分散的話,每個輸出都要點擊一次列印、調整列印份數,可是會相當麻煩,因此寫了一個VBA來簡化這些問題。
使用方法:
前言:
工程報竣工後會有一堆文件需要輸出給上級機關簽核,尤其是當下載下來後都是分散的話,每個輸出都要點擊一次列印、調整列印份數,可是會相當麻煩,因此寫了一個VBA來簡化這些問題。
| 圖一、上級機關需要的文件的一部分。 |
- 必須先將所有要輸出的文件與"竣工派驗VBA.xlsm"放在同一個資料夾。
- 檢查該文件的工作表名稱及相對應的文件編號(需要在程式碼 Arrange 中更改)。
- 若有資料先清除資料。
- 詳細檢查各個文件的內容正確性。
- 列印。
| 圖二、Arrange中的一部分程式碼(arr與arr2數量需要相同,否則會出錯) |
結論:
因應每家機關需要的文件不同,需要透過更改程式碼量身打造需要的文件名稱與編號,故提供的程式碼僅供參考使用。
程式碼:
Sub main()
Call GetFile
Call MoveData
Call Arrange
Call sortvba
Sheets(1).Select
End Sub
Sub GetFile()
Path = ThisWorkbook.Path '相對路徑
ChDir Path
f = Dir("")
Do Until f = ""
If Not f Like "竣工派驗VBA*" Then
Workbooks.Open f, False
End If
f = Dir()
Loop
End Sub
Sub MoveData()
For Each Workbook In Workbooks
wbn = Workbook.Name
Workbooks(wbn).Activate
If Not wbn Like "竣工派驗VBA*" Then
i = 0
For Each Sheet In Sheets
wpt = InStr(1, wbn, ".")
If wpt <> 0 Then shn = Mid(wbn, 1, wpt - 1)
pt = InStr(1, wbn, "_")
If pt <> 0 Then shn = Mid(wbn, 1, pt - 1)
If Sheets.Count = 1 And i = 0 Then
Sheets(1).Name = shn
Else
i = i + 1
Sheet.Name = shn & "-" & i
End If
Sheet.Move after:=Workbooks(1).Sheets(Sheets.Count)
Next
End If
Next
End Sub
Sub DeleteData()
For Each Sheet In Sheets
If Sheet.Index <> 1 Then
Application.DisplayAlerts = False
Sheet.Delete
Application.DisplayAlerts = True
End If
Next
End Sub
Sub Arrange()
Dim OrderArr(0 To 15, 1 To 2) As Variant
arr = Array("施工過程異動紀錄統計表", "施工品質評量表", "工程驗收單", "工程請款黏貼紙" _
, "工程興辦成本明細表", "工程結算驗收證明書", "工程移管清冊-2", "工程移管清冊-1" _
, "工程報廢單", "工程初驗、驗收、再驗紀錄表", "工程保固切結書", "竣工日期書面通知單")
arr2 = Array(3, 14, 8, 5, 13, 9, "16-2", "16-1", 12, 7, 15, 1)
For i = 0 To UBound(arr)
OrderArr(i, 1) = arr(i)
OrderArr(i, 2) = arr2(i)
Next
For Each Sheet In Sheets
If Sheet.Index > 1 Then
For i = 0 To UBound(arr)
If Sheet.Name = OrderArr(i, 1) Then
Sheet.Name = OrderArr(i, 2)
Exit For
End If
Next
End If
Next
End Sub
Sub printvba()
Dim FileName As String
Dim FIleCopies As Integer
Dim num As Integer
FinalType = InputBox("請問你的工程經費來源是?" & vbCrLf & "1.農委會補助" & vbCrLf & "2.自籌款", "竣工派驗VBA")
msg = MsgBox("請問要預覽列印後再印嗎?(Y/N)", vbYesNo)
If FinalType = 1 Then
PrintCol = 9
ElseIf FinalType = 2 Then
PrintCol = 12
End If
For Each Sheet In Sheets
IsPrint = False
dashLocation = InStr(1, Sheet.Name, "-")
If dashLocation <> 0 Then
num = Mid(Sheet.Name, 1, dashLocation - 1)
IsPrint = True
ElseIf IsNumeric(Sheet.Name) Then
num = Val(Sheet.Name)
IsPrint = True
End If
If IsPrint = True Then
With Sheets(1)
r = 5
If .Range("W" & r + num) = "#" Then
FIleCopies = .Cells(r + num, PrintCol)
Else
FIleCopies = .Cells(r + num, PrintCol) + 2
End If
FileName = .Cells(r + num, 2)
End With
Debug.Print FileName & ":" & FIleCopies
If FIleCopies <> 0 Then
Sheet.Activate
If msg = vbYes Then
Sheet.PrintOut copies:=FIleCopies, preview:=True
Else
Sheet.PrintOut copies:=FIleCopies, preview:=False
End If
End If
End If
Next
End Sub
Sub sortvba()
For i = 1 To 16
For Each Sheet In Sheets
shn = Sheet.Name
If shn Like "*-*" Then
pt = InStr(1, shn, "-")
shn = Mid(shn, 1, pt - 1)
If Val(shn) = i Then Sheet.Move after:=Sheets(Sheets.Count)
End If
If IsNumeric(shn) Then
If Val(shn) = i Then Sheet.Move after:=Sheets(Sheets.Count)
End If
Next
Next
End Sub
留言
張貼留言