한 Excel 워크북에서 다른 워크북으로 모듈을 복사하는 VBA
저는 VBA를 사용하여 한 엑셀 워크북에서 다른 엑셀 워크북으로 모듈을 복사하려고 합니다.
내 코드:
'Copy Macros
Dim comp As Object
Set comp = ThisWorkbook.VBProject.VBComponents("Module2")
Set Target = Workbooks("Food Specials Rolling Depot Memo 46 - 01.xlsm").VBProject.VBComponents.Add(1)
어떤 이유로, 이것은 모듈을 복사하지만 내부의 VBA 코드는 복사하지 않습니다. 왜죠?
누가 제가 어디서 잘못되고 있는지 보여주실 수 있나요?
감사해요.
Sub CopyModule
아래는 3개의 파라미터를 수신합니다.
워크북. 소스로워북크의서로(▁1)▁1북▁(워의서크▁workbook)Workbook
).
(로 표시).복사할 모듈 이름(as)String
).
워크북. 워크북)Workbook
).
복사 모듈 코드
Public Sub CopyModule(SourceWB As Workbook, strModuleName As String, TargetWB As Workbook)
' Description: copies a module from one workbook to another
' example: CopyModule Workbooks(ThisWorkbook), "Module2",
' Workbooks("Food Specials Rolling Depot Memo 46 - 01.xlsm")
' Notes: If Module to be copied already exists, it is removed first,
' and afterwards copied
Dim strFolder As String
Dim strTempFile As String
Dim FName As String
If Trim(strModuleName) = vbNullString Then
Exit Sub
End If
If TargetWB Is Nothing Then
MsgBox "Error: Target Workbook " & TargetWB.Name & " doesn't exist (or closed)", vbCritical
Exit Sub
End If
strFolder = SourceWB.Path
If Len(strFolder) = 0 Then strFolder = CurDir
' create temp file and copy "Module2" into it
strFolder = strFolder & "\"
strTempFile = strFolder & "~tmpexport.bas"
On Error Resume Next
FName = Environ("Temp") & "\" & strModuleName & ".bas"
If Dir(FName, vbNormal + vbHidden + vbSystem) <> vbNullString Then
Err.Clear
Kill FName
If Err.Number <> 0 Then
MsgBox "Error copying module " & strModuleName & " from Workbook " & SourceWB.Name & " to Workbook " & TargetWB.Name, vbInformation
Exit Sub
End If
End If
' remove "Module2" if already exits in destination workbook
With TargetWB.VBProject.VBComponents
.Remove .Item(strModuleName)
End With
' copy "Module2" from temp file to destination workbook
SourceWB.VBProject.VBComponents(strModuleName).Export strTempFile
TargetWB.VBProject.VBComponents.Import strTempFile
Kill strTempFile
On Error GoTo 0
End Sub
주 코드(포스트의 데이터로 이 코드를 실행하기 위한 것):
Option Explicit
Public Sub Main()
Dim WB1 As Workbook
Dim WB2 As Workbook
Set WB1 = ThisWorkbook
Set WB2 = Workbooks("Food Specials Rolling Depot Memo 46 - 01.xlsm")
Call CopyModule(WB1, "Module2", WB2)
End Sub
사실 임시 파일에 저장할 필요는 전혀 없습니다.대상 모듈의 메서드를 사용하여 소스의 문자열 값을 추가할 수 있습니다.다음 코드를 사용해 보십시오.
Sub CopyModule()
Dim SourceVBProject As VBIDE.VBProject, DestinationVBProject As VBIDE.VBProject
Set SourceVBProject = ThisWorkbook.VBProject
Dim NewWb As Workbook
Set NewWb = Workbooks.Add ' Or whatever workbook object you have for the destination
Set DestinationVBProject = NewWb.VBProject
'
Dim SourceModule As VBIDE.CodeModule, DestinationModule As VBIDE.CodeModule
Set SourceModule = SourceVBProject.VBComponents("Module1").CodeModule ' Change "Module1" to the relevsant source module
' Add a new module to the destination project
Set DestinationModule = DestinationVBProject.VBComponents.Add(vbext_ct_StdModule).CodeModule
'
With SourceModule
DestinationModule.AddFromString .Lines(1, .CountOfLines)
End With
End Sub
스스로 설명할 수 있어야 합니다! 그.AddFomString
메소드는 단순히 문자열 변수를 사용합니다.따라서 이를 얻기 위해 를 사용합니다.원본 모듈의 라인 속성입니다.첫 번째 인수(1
줄이며, 두끝번호입니다.는 시작 줄이며, 두 번째 인수는 끝 줄 번호입니다.이 경우, 우리는 모든 라인을 원하기 때문에, 우리는 다음을 사용합니다..CountOfLines
소유물.
크리스 멜빌의 환상적인 코드, 감사합니다, 제가 몇 가지 추가하고 몇 가지 의견을 추가했습니다.
이 매크로를 실행하기 전에 다음 작업을 수행해야 합니다.
VB Editor > Tools > References > (체크) Microsoft Visual Basic for Applications 확장성 5.3
파일 -> 옵션 -> 신뢰 센터 -> 신뢰 센터 설정 -> 매크로 설정 -> VBA 프로젝트 개체 모델에 대한 신뢰 액세스.
위의 작업을 수행한 후 소스 파일의 아래 코드를 복사하여 붙여넣습니다.
Sub CopyMacrosToExistingWorkbook()
'Copy this VBA Code in SourceMacroModule, & run this macro in Destination workbook by pressing Alt+F8, the whole module gets copied to destination File.
Dim SourceVBProject As VBIDE.VBProject, DestinationVBProject As VBIDE.VBProject
Set SourceVBProject = ThisWorkbook.VBProject
Dim NewWb As Workbook
Set NewWb = ActiveWorkbook ' Or whatever workbook object you have for the destination
Set DestinationVBProject = NewWb.VBProject
'
Dim SourceModule As VBIDE.CodeModule, DestinationModule As VBIDE.CodeModule
Set SourceModule = SourceVBProject.VBComponents("Module1").CodeModule ' Change "Module1" to the relevsant source module
' Add a new module to the destination project
Set DestinationModule = DestinationVBProject.VBComponents.Add(vbext_ct_StdModule).CodeModule
'
With SourceModule
DestinationModule.AddFromString .Lines(1, .CountOfLines)
End With
End Sub
대상 파일에서 "CopyMacrosToExistingWorkbook" 매크로를 실행하면 원본 파일 매크로가 대상 파일에 복사된 것을 볼 수 있습니다.
업무에 대한 이전 답변을 얻는 데 많은 어려움을 겪었기 때문에, 저는 제 해결책을 게시하려고 생각했습니다.이 함수는 원본 워크북에서 새로 만든 워크북으로 모듈을 프로그래밍 방식으로 복사하는 데 사용되며, 이 워크북도 workshot.copy 호출을 사용하여 프로그래밍 방식으로 작성되었습니다.워크시트를 새 워크북에 복사할 때 발생하지 않는 것은 워크시트가 종속된 매크로의 전송입니다.이 절차는 원본 워크북의 모든 모듈을 반복하여 새 워크북에 복사합니다.더 중요한 것은 그것이 실제로 엑셀 2016에서 저에게 효과가 사실입니다.
Sub CopyModules(wbSource As Workbook, wbTarget As Workbook)
Dim vbcompSource As VBComponent, vbcompTarget As VBComponent
Dim sText As String, nType As Long
For Each vbcompSource In wbSource.VBProject.VBComponents
nType = vbcompSource.Type
If nType < 100 Then '100=vbext_ct_Document -- the only module type we would not want to copy
Set vbcompTarget = wbTarget.VBProject.VBComponents.Add(nType)
sText = vbcompSource.CodeModule.Lines(1, vbcompSource.CodeModule.CountOfLines)
vbcompTarget.CodeModule.AddFromString (sText)
vbcompTarget.Name = vbcompSource.Name
End If
Next vbcompSource
End Sub
기능은 가능한 한 단순하고 상당히 자기 설명적이어야 합니다.
시도해 보세요
- 두 워크북을 모두 엽니다.
- VBA Dev 창 열기
- 드롭다운 모듈 및 한 모듈에서 다른 모듈로 복사본을 드래그 앤 드롭합니다.
모듈 이름이 중복되지 않도록 하기 위한 것입니다.또한 동일한 명명된 함수 / Sub를 포함하는 모듈이 있는 경우 충돌이 발생합니다.
이 작업을 수행한 다음 디버그를 실행합니다.잘 작동하는 것 같습니다.
추신: 저는 많은 것들을 제 개인 정보에 복사합니다.xlsb
언급URL : https://stackoverflow.com/questions/40956465/vba-to-copy-module-from-one-excel-workbook-to-another-workbook
'programing' 카테고리의 다른 글
MongoClient.connect()를 사용할 때 sslprep 주의 (0) | 2023.07.03 |
---|---|
Angular2의 입력을 검사합니다. (0) | 2023.07.03 |
SQL Server 2008에서 기존 테이블의 열 순서를 변경하는 방법 (0) | 2023.07.03 |
JTS는 모든 메소드에 데코레이터 적용 / 클래스 메소드 열거 (0) | 2023.07.03 |
Python의 어레이가 느린 이유는 무엇입니까? (0) | 2023.07.03 |