programing

한 Excel 워크북에서 다른 워크북으로 모듈을 복사하는 VBA

megabox 2023. 7. 3. 22:39
반응형

한 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

반응형