Excel VBA无法写入摘要表

时间:2014-07-15 14:58:09

标签: excel vba excel-vba

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

这是我自己写的版本。我试过的所有其他变体都可以在互联网上找到:

注意:实际的摘要表在代码中的其他位置创建。另外,我之所以将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

End Sub

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

2 个答案:

答案 0 :(得分:4)

将其分成几部分,一次一行地执行代码。这将告诉您是否选择了您认为自己选择的内容,行是否符合您的想法等等。此外,当代码点击您的第一张表格(“摘要”)时暂停。单元格...行和使用立即窗口(Ctrl + G)输出目标单元格的值

?.Cells(row, 1).Value

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

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

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

答案 1 :(得分:1)

我想通了......

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

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的测试建议。您已经教会了我使用调试器的重要性。