Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 从多个工作表中提取数据并放入汇总工作表的表中(循环错误)_Vba_Excel_For Loop_Excel 2010 - Fatal编程技术网

Vba 从多个工作表中提取数据并放入汇总工作表的表中(循环错误)

Vba 从多个工作表中提取数据并放入汇总工作表的表中(循环错误),vba,excel,for-loop,excel-2010,Vba,Excel,For Loop,Excel 2010,我创建了下面的代码,用于从工作簿中的多个工作表中获取特定数据,并将它们放置在摘要工作表的行中。它要么不填充任何内容,要么一次又一次地填充每一行。它需要自动发生 Sub Summary() Dim WkSht as Worksheet Dim Row as Integer 'A15 - A29: Pull over (A1) if > 0 'B15 - B29: Pull over (C1) if > 0 'C15 - C29: Pull o

我创建了下面的代码,用于从工作簿中的多个工作表中获取特定数据,并将它们放置在摘要工作表的行中。它要么不填充任何内容,要么一次又一次地填充每一行。它需要自动发生

Sub Summary()

    Dim WkSht as Worksheet
    Dim Row as Integer

    'A15 - A29: Pull over (A1) if > 0
    'B15 - B29: Pull over (C1) if > 0
    'C15 - C29: Pull over (D7) if > 0

    For Each WkSht In ThisWorkbook.Sheets
        For Row = 15 To 29
            If WkSht.Name Like "Tr. [0-9]*" Then
                If WkSht.Range("D7").Value > 0 Then
                    If IsEmpty(Row) Then
                        Cells(Row, 1).Value = WkSht.Range("A1").Value
                        Cells(Row, 2).Value = WkSht.Range("C1").Value
                        Cells(Row, 3).Value = WkSht.Range("D7").Value
                    End If
                End If
            End If
        Next Row
    Next WkSht
End Sub

我认为以下更改会有所帮助(在看不到整个工作簿的情况下会有点困难):

  • 将汇总表定义为单独的实体-不要从中刮取数据
  • 与其测试
    isempty(Row)
    ,不如测试希望为空的内容(单元格?
    Row
    是您前面几行设置的变量)
  • 参考汇总表上的
    单元格
    ,而不是“自己”。您无法确定执行此操作时Excel将考虑什么(哪个工作表处于活动状态)
  • 由于在每个循环的
    内有
    For Row=
    循环,因此您正在一次又一次地复制相同的内容。您只需要为找到的每个工作表增加一次
  • 你最终得到的是这个——这有用吗

    Sub Summary()
    
        Dim WkSht as Worksheet
        Dim summarySheet as Worksheet
        Dim Row as Integer
    
        'A15 - A29: Pull over (A1) if > 0
        'B15 - B29: Pull over (C1) if > 0
        'C15 - C29: Pull over (D7) if > 0
    
        Set summarySheet = ThisWorkbook.Sheets("Summary") ' whatever the right name is…
    
        Row = 15
        For Each WkSht In ThisWorkbook.Sheets
            if Not (WkSht.Name = summarySheet.Name) Then
                If WkSht.Name Like "Tr. [0-9]*" Then
                    If WkSht.Range("D7").Value > 0 Then
                        If IsEmpty(summarySheet.Cells(Row,1)) Then
                            summarySheet.Cells(Row, 1).Value = WkSht.Range("A1").Value
                            summarySheet.Cells(Row, 2).Value = WkSht.Range("C1").Value
                            summarySheet.Cells(Row, 3).Value = WkSht.Range("D7").Value
                        End If
                    End If
                End If
                Row = Row + 1
            End If
        Next WkSht
    End Sub
    

    您在代码中的注释表明,如果对象仅大于零,则您希望移动对象,但您的代码仅测试一个值;你打算测试这三个吗

    我不太确定我在这里读到了一个问题,但我建议:用F8遍历此代码,在第一个“Cells(Row,1)…”之后暂停。Ctrl-G到立即窗口,手动检查输入和输出参数。。。范围地址及其值。需要更多地解释代码的意图-确切地说,需要从何处复制到何处。如果总计大于0,则需要将标题(A1)、说明(C1)和总计(D7)从任何名为“Tr.#”的工作表复制到“摘要”表(A15:C29)的表中的行(即,工作表被认为是活动的)。谢谢,Floris。看来解决了我的问题!但愿我几天前能问一下。=DGlad我能帮上忙-显然我的猜测已经足够了…如果你没有花时间试图解决这个问题,你就不会那么感激我了(!!);-)顺便说一句——正如你从一些评论中可以看出的那样:非常精确地制定你的问题对于获得解决方案是一个巨大的帮助。通常,仅仅试图解释你的程序试图做什么就足以让它自己工作。你的问题很模糊——反映出你还没有完全弄清楚事情是如何运作的。这是一项很好的技能。这需要练习,练习,练习…不断提问,不断学习+1我敢肯定,事后猜测OP打算做什么需要付出很多努力:)