【问题标题】:Excel VBA Not Writing to Summary SheetExcel VBA 未写入摘要表
【发布时间】:2026-01-04 21:10:01
【问题描述】:

我正在尝试编写代码以将某些范围的数据从每张表复制到摘要表中。我已经尝试了很多版本(太多了,我无法将它们全部放在这里),但是每个摘要表都有空值。我不明白出了什么问题,我也没有理论。

这是我自己写的版本。我尝试的所有其他变体都是在 Internet 上找到的:

注意:实际的摘要表是在代码的其他地方创建的。另外,我的 sheetIndex 从 6 开始的原因是因为这是我要从中获取数据的第一张表。

Sub PopulateSummary()
Dim nmbrParts As Integer
Dim partIndex As Integer
Dim sheetIndex As Integer
Dim sheetCount As Integer

sheetCount = ThisWorkbook.Sheets.Count
for sheetIndex = 6 To sheetCount
    With Sheets(sheetIndex)
        .Activate
        .Range("B2").Select
        Call SelectFirstToLastInColumn
        nmbrParts = Selection.Count
        Sheets("Summary").Activate
        for partIndex = 1 To nmbrParts
            row = partIndex + 1

            Sheets("Summary").Cells(row, 1).Value = .Cells(row, 1).Value
            Sheets("Summary").Cells(row, 2).Value = .Cells(row, 2).Value
            Sheets("Summary").Cells(row, 3).Value = .Cells(row, 4).Value
            Sheets("Summary").Cells(row, 3).Value = .Cells(row, 3).Value
            Sheets("Summary").Cells(row, 5).Value = .Cells(row, 6).Value

        Next partIndex
    End With
Next sheetIndex

结束子

编辑:我想出了一些办法。由于我是从另一个工作簿调用这些宏,因此我将 ThisWorkbook 更改为 ActiveWorkbook,因此它计算了正确的工作表数。但是问题并没有解决。

【问题讨论】:

  • 您能否逐步运行宏(在 Visual Basic 窗口中按 F8)并暂停“nmbrParts = Selection.Count”。检查单元格是否实际被选中,如果是,则继续执行“.Cells(row, 1).Value”并确定该值是否是您想要的值。添加一个手表以在 Watches 窗口中显示值。

标签: vba excel


【解决方案1】:

将其分解为几部分,并一次一行地逐步执行代码。这将告诉您是否正在选择您认为正在选择的内容,行是否是您认为的内容等。此外,当代码到达您的第一个 Sheets("Summary").Cells... 行时暂停使用即时窗口 (Ctrl+G) 输出目标单元格的值

?.Cells(row, 1).Value

另外,因为你有一个 With 块,你真的不需要激活和选择单元格(而且你不应该在 VBA 中选择大部分时间,因为在工作表中做事很慢),而且您也不必激活 Sheets("Summary") 因为您直接引用它。你可以这样做:

With Sheets(sheetIndex)
    nmbrParts = .Range("B:B").Find(what:="*",searchDirection:=xlPrevious).Row
    for ...
    .
    . 
    .
End With

代码越简单越短,测试就越容易。

【讨论】:

  • 感谢您的建议。我将立即开始测试。
  • 嗯,所以我开始测试,我意识到我的 sheetIndex = 6 To sheetCount 的初始 for 循环的评估方式完全跳过了我的循环。编辑:ThisWorkbook.Sheets.Count 出于某种原因返回 1。
  • 所以我做了你让我做的事情。它输出了我希望它输出的确切值。不过还是没写。
【解决方案2】:

我想通了……

我遇到了一些问题,变量名放在错误的位置。我的宏应该看起来 像这样:

Sub PopulateSummary()
Dim nmbrParts As Integer
Dim partIndex As Integer
Dim sheetIndex As Integer
Dim sheetCount As Integer
Dim row As Integer
row = 2
sheetCount = ActiveWorkbook.Sheets.Count
For sheetIndex = 6 To sheetCount
    With Sheets(sheetIndex)
        .Activate
        .Range("B2").Select
        nmbrParts = .Range("B:B").Find(what:="*", searchDirection:=xlPrevious).row
        For partIndex = 1 To nmbrParts
             destRow = partIndex + 1
             Sheets("Summary").Cells(row, 1).Value = .Cells(destRow, 1).Value
             Sheets("Summary").Cells(row, 2).Value = .Cells(destRow, 2).Value
             Sheets("Summary").Cells(row, 3).Value = .Cells(destRow, 4).Value
             Sheets("Summary").Cells(row, 4).Value = .Cells(destRow, 3).Value
             Sheets("Summary").Cells(row, 5).Value = .Cells(destRow, 6).Value
             row = row + 1
        Next partIndex
    End With
Next sheetIndex
End Sub

不同之处在于我使用了不同的名称来引用我从中提取的工作表上的行。所以,我可以将数字分开。我还发现了我在编辑中提到的一个错误,我必须将 ThisWorkbook 更改为 ActiveWorkbook,以便工作表计数正确。

感谢 redOctober13 的测试建议。你教会了我使用调试器的重要性。

【讨论】: