【问题标题】:Run Macro in Excel AFTER opening a Workbook打开工作簿后在 Excel 中运行宏
【发布时间】:2018-07-27 11:18:44
【问题描述】:

我想在工作簿打开后立即运行宏,因为某些原因宏需要之前打开工作簿。 Workbook_activate 不是一个选项,因为宏会打开其他文件,因此会导致无限循环。

如果我从 VBA 编辑器运行该宏,它运行得非常好,但它总是抛出

运行时错误 1004:对象 _Global 的方法 Cells 具有 失败

当我真正打开工作簿时。

这是我正在使用的代码:

Private Sub Workbook_Open()
  Call updateColumn("sheet", "Tabelle2", 1, 2)
  Call updateColumn("sheet", "Tabelle2", 5, 1)    
  Call updateSG("Tabelle2", "sheet")
End Sub

updateColumn 通过打开另一个 excel 文件并从那里同步数据来更新给定的列。它工作正常,所以我不会在这里讨论它。

问题总是在updateSG 子中。它与updateColumn 基本相同,但它也会遍历另一个文件并将所需的条目排序到相应的列中。

Private Sub updateSG(sheetname As String, adbSheet As String)
Dim adb As Workbook
Dim report As Workbook
Dim row As Range
Dim fak As String
Dim N As Long
Dim rownumber As Long
Set report = Workbooks("thisfile.xlsm")
Set adb = Workbooks.Open(report.Path & "/ADB.xls")
rownumber = Cells(adb.Sheets(adbSheet).Rows.Count, 1).End(xlUp).row
For i = 2 To rownumber
    fak = adb.Sheets(adbSheet).Cells(i, 1).Value
    Select Case fak
        Case "E"
            N = report.Sheets(sheetname).Cells(Rows.Count, "C").End(xlUp).row + 1
            report.Sheets(sheetname).Cells(N, "C").Value = adb.Sheets(adbSheet).Cells(i, 3)
        Case "G"
            N = report.Sheets(sheetname).Cells(Rows.Count, "D").End(xlUp).row + 1
            report.Sheets(sheetname).Cells(N, "D").Value = adb.Sheets(adbSheet).Cells(i, 3)
        Case "I"
            N = report.Sheets(sheetname).Cells(Rows.Count, "E").End(xlUp).row + 1
            report.Sheets(sheetname).Cells(N, "E").Value = adb.Sheets(adbSheet).Cells(i, 3)
        Case "M"
            N = report.Sheets(sheetname).Cells(Rows.Count, "F").End(xlUp).row + 1
            report.Sheets(sheetname).Cells(N, "F").Value = adb.Sheets(adbSheet).Cells(i, 3)
        Case "P"
           N = report.Sheets(sheetname).Cells(Rows.Count, "G").End(xlUp).row + 1
            report.Sheets(sheetname).Cells(N, "G").Value = adb.Sheets(adbSheet).Cells(i, 3)
        Case "T"
            N = report.Sheets(sheetname).Cells(Rows.Count, "H").End(xlUp).row + 1
            report.Sheets(sheetname).Cells(N, "H").Value = adb.Sheets(adbSheet).Cells(i, 3)
    End Select
Next
For i = 3 To 8
    report.Sheets(sheetname).Columns(i).RemoveDuplicates Columns:=Array(1)
Next
Workbooks("ADB.xls").Close SaveChanges:=False

结束子

问题出在线路上

rownumber = Cells(adb.Sheets(adbSheet).Rows.Count, 1).End(xlUp).row

选择案例中的行将作为

N = report.Sheets(sheetname).Cells(Rows.Count, "C").End(xlUp).row + 1

这些行基本上计算列中的元素。同样,如果我在工作簿打开时运行它,它可以完美运行,但在我实际打开文件时总是抛出错误。

我希望这里有人可以帮助我。

亲切的问候

迈克尔

【问题讨论】:

  • Cells 不符合特定工作簿或工作表的条件。因此,它回退到全局 Cells,默认使用 whatever worksheet is ActiveCells 对象。未能正确确定对象的范围就像 1004 错误的第一大原因。见this

标签: excel vba


【解决方案1】:

Cells 不符合特定工作簿或工作表的条件。因此,它回退到全局Cells,默认使用任何工作表处于活动状态Cells 对象。未能正确确定对象的范围就像 1004 错误的第一大原因。见this

改变这个:

Set adb = Workbooks.Open(report.Path & "/ADB.xls")
rownumber = Cells(adb.Sheets(adbSheet).Rows.Count, 1).End(xlUp).row

因为在上面的Cells 语句中,Cells 指的是ActiveSheet(默认情况下),它可能是也可能不是adbSheet 名称。如果该工作表未处于活动状态,则会出现错误。

为此,为了确保您已将Cells 限定为adb 工作簿对象和adbSheet 工作表。

Set adb = Workbooks.Open(report.Path & "/ADB.xls")
With adb.Sheets(adbSheet)
    rowNumber = .Cells(.Rows.Count,1).End(xlUp).Row
End With

【讨论】:

  • 感谢您的回复。行号现在可以工作,但错误现在会在N = report.Sheets(sheetname).Cells(Rows.Count, "E").End(xlUp).row + 1 中弹出,我不完全确定如何在此处修复它,因为它应该只计算“E”列中的条目。
  • 这两个问题的本质是一样的。您再次拥有Rows.Count,它不符合特定工作表的条件。
  • CellsRowsColumnsRange 等,这些都是Worksheet 的子对象/属性,如果您没有明确分配它们针对特定工作表,Excel 将始终隐含地将它们解释为 ActiveSheet.<property>,由于多种原因,这很容易失败,在这种情况下,您试图定义一个跨越多个工作表的范围 - 这是不允许的。
  • 非常感谢,我想通了。现在可以完美运行了。
猜你喜欢
  • 2015-06-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-01-22
  • 2016-05-15
相关资源
最近更新 更多