한 워크북의 시트에서 다른 워크북으로 VBA 코드를 복사하시겠습니까?
아래의 라인을 사용하여 워크북 간에 VBA 모듈을 비교해 보았는데 더 쉬운 방법이 있는지는 모르겠지만 잘 작동하고 있습니다.
Set srcVba = srcWbk.VBProject
Set srcModule = srcVba.VBComponents(moduleName)
srcModule.Export (path) 'Export from source
trgtVba.VBComponents.Remove VBComponent:=trgtVba.VBComponents.Item(moduleName) 'Remove from target
trgtVba.VBComponents.Import (path) 'Import to target
하지만 이제 모듈이 아닌 시트에 있는 VBA 코드를 복사해야 합니다.위의 방법은 해당 시나리오에서는 사용할 수 없습니다.
한 워크북에서 다른 워크북으로 시트의 VBA 코드를 복사하는 데 사용할 수 있는 코드는 무엇입니까?
제거한 후 다시 가져올 수 없습니다.VBComponent
그러면 전체 워크시트가 논리적으로 삭제되기 때문입니다.대신 사용해야 합니다.CodeModule
구성 요소 내의 텍스트를 조작합니다.
Dim src As CodeModule, dest As CodeModule
Set src = ThisWorkbook.VBProject.VBComponents("Sheet1").CodeModule
Set dest = Workbooks("Book3").VBProject.VBComponents("ThisWorkbook") _
.CodeModule
dest.DeleteLines 1, dest.CountOfLines
dest.AddFromString src.Lines(1, src.CountOfLines)
Chel의 답변에 해당하는 VSTO를 찾는 다른 사람이 있다면 다음과 같습니다.
void CopyMacros(Workbook src, Workbook dest)
{
var srcModule = src.VBProject.VBComponents.Item(1).CodeModule;
var destModule = dest.VBProject.VBComponents.Add(Microsoft.Vbe.Interop.vbext_ComponentType.vbext_ct_StdModule);
destModule.CodeModule.AddFromString(srcModule.Lines[1, srcModule.CountOfLines]);
}
주의할 사항:
- Microsoft에 대한 참조를 추가해야 합니다.Vbe. 이 일을 하기 위해 개입합니다.
- 대상 워크북에 새 일반 모듈을 추가하기 때문에 전화를 걸 필요가 없었습니다.
DeleteLines
YMMV.
Patrick의 코드는 워크시트에서 작동하지 않습니다(사실, 코드를 잘못된 모듈로 전송합니다).해결 방법은 대상 워크북에 새 시트를 만든 다음 코드를 복사하는 것입니다(옵션으로 워크시트 데이터/함수/포맷을 복사하여 붙여넣을 수도 있습니다).
또 다른 작동하지 않는 것은 사용자 양식입니다.코드를 복사할 수는 있지만 내보내기/가져오기 방법을 사용하지 않고 실제 양식(모든 컨트롤 포함)을 복사할 수 있는 방법을 모르겠습니다.
Patrick 코드 확장 코드:
'Needs reference to : Microsoft Visual Basic for Application Extensibility 5.3 ,
'or run this code : thisworkbook.VBProject.References.AddFromFile "C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
'from immediate window (ctrl+G) or create a small sub
' What works: Successfully tranfsers Modules with code and name
' Copies userform code and name only, but the form is blank (does not transfer controls)
' Copies code in sheets but no content (optionally add code to copy & paste content)
' Successfully transfers Classes with code and name
Option Explicit
Public Sub CopyComponentsModules() 'copies sheets/Thisworkbook/Userforms/Modules/Classes to a new workbook
Dim src As CodeModule, dest As CodeModule
Dim i&
Dim WB_Dest As Workbook
Dim Ref As Reference
Dim Comp As VBComponent
Dim sht As Worksheet
Debug.Print "Starting"
Set WB_Dest = Application.Workbooks.Add
On Error Resume Next 'needed for testing if component already exists in destination WorkBook and for cross-references
For Each Comp In ThisWorkbook.VBProject.VBComponents
Debug.Print Comp.Name & " - "; Comp.Type
Err.Clear
'Set Source code module
Set src = Comp.CodeModule 'ThisWorkbook.VBProject.VBComponents("Sheet1").CodeModule
'Test if destination component exists first
i = 0
i = Len(WB_Dest.VBProject.VBComponents(Comp.Name).Name)
If i <> 0 Then 'or: if err=0 then
Set dest = WB_Dest.VBProject.VBComponents(Comp.Name).CodeModule
Else 'create component
Err.Clear
If Comp.Type = 100 Then
Set sht = WB_Dest.Sheets.Add
Set dest = WB_Dest.VBProject.VBComponents(sht.Name).CodeModule
WB_Dest.VBProject.VBComponents(sht.Name).Name = Comp.Name
sht.Name = Comp.Name
Else
With WB_Dest.VBProject.VBComponents.Add(Comp.Type)
If Err.Number <> 0 Then
MsgBox "Error: Component " & Comp.Name & vbCrLf & Err.Description
Else
.Name = Comp.Name
Set dest = .CodeModule
End If
End With
End If
End If
If Err.Number = 0 Then
'copy module/Form/Sheet/Class 's code:
dest.DeleteLines 1, dest.CountOfLines
dest.AddFromString src.Lines(1, src.CountOfLines)
End If
Next Comp
'Add references as well :
For Each Ref In ThisWorkbook.VBProject.References
WB_Dest.VBProject.References.AddFromFile Ref.FullPath
Next Ref
Err.Clear: On Error GoTo 0
Set Ref = Nothing
Set src = Nothing
Set dest = Nothing
Set Comp = Nothing
Set WB_Dest = Nothing
End Sub
이것은 이 포스트의 다른 소스와 컴파일된 코드입니다.VBE(시트/본 워크북/사용자 양식/모듈/클래스)의 모든 코드를 새 워크북에 복사하는 코드를 제공합니다.
저는 이것을 만들었습니다. 왜냐하면 저는 손상된 워크북을 가지고 있고 코드를 포함하여 손상되지 않은 모든 것을 복구하기 위해 코드를 만들기 때문입니다.(이 파트는 코드 + 참조만 복구합니다):
'needs a reference to : Visual basic for Application Extensibility 5.3 ,
'or run this code : thisworkbook.VBProject.References.AddFromFile "C:\Program Files (x86)\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB"
'from immediate window (ctrl+G) or create a small sub
Option Explicit
Sub CopyComponentsModules() 'copies sheets/Thisworkbook/Userforms/Modules/Classes to a new workbook
Dim src As CodeModule, dest As CodeModule
Dim i&
Dim WB_Dest As Workbook
'Dim sh As Worksheet
Dim Comp As VBComponent
'Set sh = ThisWorkbook.Sheets(1)
'sh.Cells.Clear
Set WB_Dest = Application.Workbooks.Add
On Error Resume Next 'needed for testing if component already exists in destination WorkBook and for cross-references.
For Each Comp In ThisWorkbook.VBProject.VBComponents
'i = i + 1
'sh.Cells(i, 1).Value = Comp.Name
'Set Source code module
Set src = Comp.CodeModule 'ThisWorkbook.VBProject.VBComponents("Sheet1").CodeModule
'test if destination component exists first
i = 0: i = Len(WB_Dest.VBProject.VBComponents(Comp.Name).Name)
If i <> 0 Then 'or: if err=0 then
Set dest = WB_Dest.VBProject.VBComponents(Comp.Name).CodeModule
Else 'create component
With WB_Dest.VBProject.VBComponents.Add(Comp.Type)
.Name = Comp.Name
Set dest = .CodeModule
End With
End If
'copy module/Form/Sheet/Class 's code:
dest.DeleteLines 1, dest.CountOfLines
dest.AddFromString src.Lines(1, src.CountOfLines)
Next Comp
'Add references as well :
Dim Ref As Reference
For Each Ref In ThisWorkbook.VBProject.References
'Debug.Print Ref.Name 'Nom
WB_Dest.VBProject.References.AddFromFile Ref.FullPath
'Debug.Print Ref.FullPath 'Chemin complet
'Debug.Print Ref.Description 'Description de la référence
'Debug.Print Ref.IsBroken 'Indique si la référence est manquante
'Debug.Print Ref.Major & "." & Ref.Minor 'Version
'Debug.Print "---"
Next Ref
Err.Clear: On Error GoTo 0
'WB_Dest.Activate
Set Ref = Nothing
Set src = Nothing
Set dest = Nothing
Set Comp = Nothing
Set WB_Dest = Nothing
End Sub
언급URL : https://stackoverflow.com/questions/18497527/copy-vba-code-from-a-sheet-in-one-workbook-to-another
'it-source' 카테고리의 다른 글
문자열에서 모든 공백을 제거하는 방법은 무엇입니까? (0) | 2023.07.15 |
---|---|
충돌 업데이트 시 삽입 일부 필드를 사용하여 Postgres가 있는 Spring Data/Hibernate 저장 엔티티 (0) | 2023.07.15 |
iOS 시뮬레이터 내에서 앱스토어에 액세스할 수 있습니까? (0) | 2023.07.15 |
MongoDB는 $exists 연산자로 필드의 존재를 확인할 때 인덱스를 사용할 수 있습니까? (0) | 2023.07.15 |
Asp.net Core에서 웹 UI를 만드는 데 레이저 페이지가 권장되는 이유는 무엇입니까? (0) | 2023.07.15 |