首页 文章

Excel VBA无法写入摘要表

提问于
浏览
1

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

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

注意:实际的摘要表在代码中的其他位置创建 . 另外,我之所以将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,因此它计算正确的工作表数 . 但问题并没有解决 .

2 回答

  • 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

    我想到了....

    我有一些问题,变量名称在错误的地方 . 我的宏应该看起来像这样:

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

相关问题