【问题标题】:Second macro in Excel doesn't runExcel 中的第二个宏不运行
【发布时间】:2016-11-03 20:52:16
【问题描述】:

我的问题有点奇怪...我在 Access VBA 中有代码。我想在其他 Excel 文件中运行两个宏。第一个宏运行没有问题,但是当 dubbger 获得第二个时,我得到一个运行时错误 1004:“无法运行宏 'prcPrepareFirstReport'。该宏在此工作簿中不可用或所有宏都被禁用。”

访问代码:

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

,但它不起作用......

我已经尝试只运行第二个宏并且它正在运行...

请帮忙。

【问题讨论】:

  • 您似乎没有在第一个代码 (Dim pTargetPath as String) 中定义 pTargetPath。添加它有什么不同吗?
  • prcPrepareFile 是否将工作簿保存为 xlsx 文件?
  • @finjo,抱歉我忘记输入了。在普通代码中是这样。
  • @Comintern 是的,但是其他文件,不是代码所在的这个文件。
  • 你能把那个Sub的代码贴出来吗?我怀疑这就是问题所在。

标签: excel ms-access vba


【解决方案1】:

看起来您的公共变量 pSourceName 在调用代码中对 Application.Run 的两次调用之间正在丢失状态。比使用全局状态变量更强大的解决方案是将 prcPrepareFile 转换为返回 pSourceName 的函数,然后将 that 传递给 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

【讨论】:

  • 我遇到了同样的错误。我注意到了一些奇怪的事情。运行第一个宏后,pExcel 不是我运行的这个 Excel。 pExcel.Name 现在是 H:\DATA\Microsoft Excel.xlsx。
【解决方案2】:

好的,我想通了。 @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

感谢大家的帮助。

【讨论】:

    猜你喜欢
    • 2018-06-03
    • 2017-07-14
    • 2022-11-26
    • 1970-01-01
    • 2019-01-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多