我確實有數百個 excel 檔案。每個 excel 檔案都在“workbooks_open”方法中包含一個 makro。我想打開所有這些檔案,注釋掉代碼,保存并關閉檔案。
使用打開/關閉回圈遍歷所有檔案不是問題,但是隨著 vba 代碼的更改,我不知道。
提前謝謝了!
Sub test()
Dim Path as string = "C:\123\"
Dim cDir As String
cDir = Dir(Path & "*.xlsx")
Do While cDir <> ""
Application.DisplayAlerts = False
'### open
Workbooks.Open Filename:=Path & cDir
'### here i want to deactivate/comment out the makro in the workbook_open method
'### save
ActiveWorkbook.Save
ActiveWorkbook.Saved = True
'### close
ActiveWorkbook.Close False
cDir = Dir
Loop
End Sub
uj5u.com熱心網友回復:
要使用代碼訪問作業簿的代碼,您需要允許通過代碼訪問 VBE - 請參閱https://stackoverflow.com/a/11680865/7599798如何執行此操作。
VBProject您可以使用-Property訪問作業簿的所有編碼內容。- 如果要使用專案的型別和常量,請添加對
Microsoft Visual Basic for Applications Extensibility - VBProject 包含一個 Components 集合
VBComponents,這是您在 VBE 專案視窗中看到的串列,它包含所有模塊、類和表單。 - Workbook-Module 的名稱
ThisWorkbook和型別 = 100(vbext_ct_Document如果您添加了提到的參考,請使用) - 要訪問模塊的代碼,請使用
CodeModule組件的屬性。 - 可以使用
linesCodeModule 的 -property 獲取代碼行,您需要傳遞兩個引數(startrow 和行數)。 - lines-property 是只讀的,如果要更改代碼,可以使用methods
InsertLines和DeleteLinesReplaceLines
看看下一個例程,看看它會是什么樣子。它將簡單地替換Workbook_Open()-routine ,Workbook_Open_BACKUP()以便在打開作業簿時不再觸發。
Sub RemoveOnOpen(wb As Workbook)
Dim i As Long
With wb.VBProject
For i = 1 to .VBComponents.Count
' Debug.Print .VBComponents(i).Type, .VBComponents(i).Name
If .VBComponents(i).Type = vbext_ct_Document And .VBComponents(i).Name = "ThisWorkbook" Then
Dim row As Long
For row = 1 To .VBComponents(i).CodeModule.CountOfLines
Dim module As CodeModule, line As String
Set module = .VBComponents(i).CodeModule
line = Trim(module.Lines(row, 1))
If Left(line, 27) = "Private Sub Workbook_Open()" Then
module.ReplaceLine row, Replace(line, "Workbook_Open()", "Workbook_Open_BACKUP()")
End If
Next
End If
Next i
End With
End Sub
更新:正如 TM 所指出的,如果在不同的語言環境中使用 Workbook 模塊的名稱可能會有所不同,您應該檢查一下。在檢查 Sub 的代碼行時,
我還添加了一個陳述句。Trim
uj5u.com熱心網友回復:
請使用下一個Sub. 它應該由在所有要更改的作業簿之間迭代的代碼呼叫:
Sub ComSpecSub(wb As Workbook, moduleName As String, strLine As String)
Dim objThisWb As VBComponent, CodeM As CodeModule, i As Long, j As Long
Set objThisWb = wb.VBProject.VBComponents("ThisWorkbook")
Set CodeM = objThisWb.CodeModule
If CodeM.Find(strLine, 1, 1, CodeM.CountOfLines, 1, False) = True Then
For i = 1 To CodeM.CountOfLines
If InStr(CodeM.lines(i, 1), strLine) > 0 Then
If left(CodeM.lines(i, 1), 1) = "'" Then Exit Sub 'already commented...
'if running the code again
Do While i j <= CodeM.CountOfLines
CodeM.ReplaceLine i j, "'" & CodeM.lines(i j, 1)
If InStr(CodeM.lines(i j, 1), "End Sub") > 0 Then Exit Do
j = j 1
Loop
End If
Next i
End If
End Sub
上面的代碼需要參考“Microsoft Visual Basic for Applications Extensibility”它應該從您的代碼中呼叫為:
ComSpecSub ActiveWorkbook, "ThisWorkbook", "Private Sub Workbook_Open()"
ActiveWorkbook.Close True
如果添加所需的參考看起來有問題,請先運行下一段代碼,它會自動添加它:
Sub addExtenssibilityReference()
'Add a reference to 'Microsoft Visual Basic for Applications Extensibilty 5.3':
ThisWorkbook.VBProject.References.AddFromGuid _
GUID:="{0002E157-0000-0000-C000-000000000046}", _
Major:=5, Minor:=3
End Sub
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/417869.html
標籤:
上一篇:調整多列的大小
