2016-11-02 45 views
0

我的问题有点奇怪......我在Access VBA中有代码。在那里我想在其他Excel文件中运行两个宏。第一个宏运行没有问题,但是当dubbger获得第二个时,我得到运行时错误1004:“无法运行宏'prcPrepareFirstReport'。宏无法在此worbook中使用,或者所有宏都被禁用。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 

Excel的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之间正在失去状态。比使用全局状态变量更可靠的解决方案是将prcPrepareFile转换为返回pSourceName的函数,然后通过prcPrepareFirstReport

的Excel代码:

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