2016-11-02 3 views
0

내 문제가 이상합니다. Access VBA에 코드가 있습니다. 다른 Excel 파일에서 두 개의 매크로를 실행하고 싶습니다. 첫 번째 매크로는 문제없이 실행되지만 더빙자가 두 번째가되면 런타임 오류 1004가 발생합니다 : "prcPrepareFirstReport 매크로를 실행할 수 없습니다.이 매크로에서 사용할 수없는 매크로 또는 모든 매크로가 비활성화됩니다."Excel의 두 번째 매크로가 실행되지 않습니다.

액세스의 코드 :

Private Sub cmdRaport_Click() 
    Dim pPath As String    
    Dim pWorkPath As String   
    Dim pExcel As Object 
    Dim pPathToSave As String 
    Dim pTargetPath As String 

    pPath = fncFilePicker() 

    pWorkPath = DLookup("[F_LINK]", "tblLinks", "[F_ID] = 1") 
    Set pExcel = CreateObject("Excel.Application") 

    pExcel.Workbooks.Open (pWorkPath) 
    pMacro = "prcPrepareFile" 

    pPathToSave = DLookup("[F_LINK]", "tblLinks", "[F_ID] = 2") 

    pExcel.Run pMacro, pPath, pPathToSave 'this macro is going fine 

    pMacro = "prcPrepareFirstReport" 

    pTargetPath = DLookup("[F_LINK]", "tblLinks", "[F_ID] = 5") 

    pExcel.Run pMacro, pTargetPath 'on this macro I'm given error 1004 

    pExcel.ActiveWorkbook.Close 
    pExcel.Quit 

    Set pExcel = Nothing 
End Sub 

엑셀 VBA 코드 :

Public pSourceName As String 
Sub prcPrepareFile(pPath As String, pPathToSave As String) 
    Dim pFileToPrepare As Workbook 
    Dim pSheet As Worksheet 
    Dim pLastRow As Long   
    Dim pName As String 
    Dim i As Long 

    With Application 
     .DisplayAlerts = False 
     .ScreenUpdating = False 
    End With 

    Set pFileToPrepare = Workbooks.Open(pPath) 

    Set pSheet = pFileToPrepare.Worksheets(1) 

    pSheet.Rows("1:3").Select 
    Selection.Delete Shift:=xlUp 

    pSheet.Rows("2:5").Select 
    Selection.Delete Shift:=xlUp 

    pLastRow = pSheet.Cells(pSheet.Rows.Count, "A").End(xlUp).Row 

    For i = 2 To pLastRow 
     If pSheet.Cells(i, 1).Value = "" Then 
      pSheet.Rows(i & ":" & i + 5).Select 
      Selection.Delete Shift:=xlUp 
     End If 
    Next i 

    pName = pFileToPrepare.Name 
    pName = pPathToSave & pName 
    Debug.Print pName 
    pFileToPrepare.SaveAs pName 

    pSourceName = pFileToPrepare.Name 

    With Application 
     .DisplayAlerts = True 
     .ScreenUpdating = True 
    End With 
End Sub 

Sub prcPrepareFirstReport(pTargetPath As String) 
    Dim pSourceWorbook As Workbook 
    Dim pTargetWorkbook As Workbook 

    Set pSourceWorbook = Workbooks(pSourceName) 
    Set pTargetWorkbook = Workbooks.Open(pTargetPath) 
End Sub 

내가 해봤 버전 등

pExcel.Application.Run pMacro 
,하지만 작동하지 않습니다 ...

실행 해 보았습니다. 이 두 번째 매크로는 다음과 같습니다.

도와주세요.

+0

첫 번째 코드에서 pTargetPath를 정의한 것처럼 보이지 않습니다 ('Dim pTargetPath as String'). 그 차이를 추가하면 어떤 차이가 있습니까? – finjo

+0

'prcPrepareFile'이 통합 문서를'xlsx' 파일로 저장하고 있습니까? – Comintern

+0

@finjo, 죄송합니다. 입력하는 것을 잊어 버립니다. 정상적인 코드에서는 그렇습니다. – Gadziu

답변

0

좋아, 나는 이것을 생각. @Comintern 및 @Rory의 도움은 필수적이었습니다.

그래서 문제가 발생했습니다. prcPrepareFile을 실행 한 후 다른 Excel이 매크로 코드로 활성화되지 않았습니다. 왜 그런지 (어쩌면 누군가 설명 할 수 있을지 모르겠지만) 변수 pExcel에 VBA 코드가없는이 두 번째 Excel이 있었는데 ...

이 첫 번째 Excel의 이름으로 변수를 준비한 다음 해결 방법을 제시합니다. 첫 번째 Excel의 이름으로이 두 번째 매크로를 실행하십시오. 아래 오른쪽 코드 :

Dim pSourceName As String 
Dim pWorkWorkbookName As String 

pWorkWorkbookName = pExcel.Names.Parent.Name 
pSourceName = pExcel.Run(pMacro, pPath, pPathToSave) 

pMacro = "prcPrepareFirstReport" 

pTargetPath = DLookup("[F_LINK]", "tblLinks", "[F_ID] = 5") 

pExcel.Run "'" & pWorkWorkbookName & "'!" & pMacro, pTargetPath, pSourceName 

감사합니다.

0

공용 변수 pSourceName이 (가) 호출 코드에서 Application.Run 번의 두 호출 사이에서 상태를 잃고있는 것 같습니다. 전역 상태 변수를 사용하는 것보다 훨씬 강력한 솔루션은 prcPrepareFilepSourceName을 반환하는 함수로 변환 한 다음 에서 prcPrepareFirstReport으로 전달하는 것입니다.

엑셀 코드 :

Public Function prcPrepareFile(pPath As String, pPathToSave As String) As String 
    'Snip 
    pName = pFileToPrepare.Name 
    pName = pPathToSave & pName 
    pFileToPrepare.SaveAs pName 

    prcPrepareFile = pFileToPrepare.Name 
    With Application 
     .DisplayAlerts = True 
     .ScreenUpdating = True 
    End With 
End Function 

Sub prcPrepareFirstReport(pTargetPath As String, pSourceName As String) 
    Dim pSourceWorbook As Workbook 
    Dim pTargetWorkbook As Workbook 

    Set pSourceWorbook = Workbooks(pSourceName) 
    Set pTargetWorkbook = Workbooks.Open(pTargetPath) 
End Sub 

국가 번호 :

Dim pSourceName As String 
pSourceName = pExcel.Run(pMacro, pPath, pPathToSave) 

pMacro = "prcPrepareFirstReport" 

pTargetPath = DLookup("[F_LINK]", "tblLinks", "[F_ID] = 5") 

pExcel.Run pMacro, pTargetPath, pSourceName 
+0

동일한 오류가 발생했습니다. 나는 이상한 것을 발견했다. 이 첫 번째 매크로를 실행 한 후 pExcel은 내가 실행 한 Excel이 아니 었습니다. 'pExcel.Name'은 이제 H : \ DATA \ Microsoft Excel.xlsx입니다. – Gadziu

관련 문제