Excel VBA:如何在循环例程的表中查找第一个空行?

问题描述 投票:0回答:2

我将工作簿中的一系列

Sheets("Records")
重新格式化为
Table (named "RecordsTable")
,以便更轻松地执行用于生成报告的
INDEX(MATCH,MATCH)
函数......但现在我搞砸了循环例程,用于从输入填充该范围
Sheets("FORM")

以前是:

Set r = Sheets("Records").Range(A & Rows.Count).End(x1Up).Offset(1, 0)

i = 0

   For Each c In Range("dataRange")              
   'dataRange is a list of cells to reference from the FORM input sheet

   r.Offset(0, i).Value = Worksheets("FORM").Range(c)
   i = i + 1
Next

但是,此代码现在选择

"RecordsTable"
末尾的第一行(第 501 行,因为我在表中定义了 500 行)并在那里插入数据。

我尝试将其更改为:

Set r = Sheets("Records").ListObjects("RecordsTable").DataBodyRange("A" & Rows.Count).End(x1Up).Offset(1, 0)

i = 0

   For Each c In Range("dataRange")              

   r.Offset(0, i).Value = Worksheets("FORM").Range(c)
   i = i + 1
Next

但是这段代码仍然选择第 501 行并使该行成为

"RecordsTable"
的一部分。 我怎样才能正确地
Set "r" to =
中的第一个空行
"RecordsTable"

仅供参考,

Column "A" in "RecordsTable"
具有标题
[INV #]
。另外,当我进入
"Set r = ..."
行时,
Rows.Count
返回 100 万+ 的值(即工作表上的总行数) - 如果我理解正确的话,我希望它返回 500 的值(即,总计表中的行) - 这是正确的吗?

编辑

"dataRange"
是单元格引用的单列列表(我确实将它们标记在B列中,正如@chrisneilsen建议的那样:

A

J6

Y6

J8

J10

Y8

等等

它们是

Sheets("FORM")
上的单元格,我需要按照
"dataRange"
中指示的顺序从中提取数据并将其填充到表中。

vba excel loops
2个回答
2
投票

假设您确实有一个表,使用它的属性和方法将数据添加到表(ListObject):

Sub Demo()
    Dim lo As ListObject
    Dim c As Range

    Set lo = Worksheets("Records").ListObjects("RecordsTable")

    For Each c In Sheets("V").Range("dataRange")
        If Not lo.InsertRowRange Is Nothing Then
            lo.InsertRowRange.Cells(1, 1) = Sheets("FORM").Range(c)
        Else
            lo.ListRows.Add.Range.Cells(1, 1) = Sheets("FORM").Range(c)
        End If
    Next
End Sub

注意:在工作表

V
上循环一个范围,并将其用作指向工作表
FORM
上数据的指针,从您的答案中复制 - 我假设您知道自己在做什么

根据OP评论,将数据添加到一个新行

Sub Demo()
    Dim lo As ListObject
    Dim c As Range, TableRange As Range
    Dim i As Long

    Set lo = Worksheetsheets("Records").ListObjects("RecordsTable")

    If Not lo.InsertRowRange Is Nothing Then
        Set TableRange = lo.InsertRowRange
    Else
        Set TableRange = lo.ListRows.Add.Range
    End If
    i = 1
    For Each c In Sheets("V").Range("dataRange")
        TableRange.Cells(1, i) = Sheets("FORM").Range(c)
        i = i + 1
    Next
End Sub

注意,这假设表格列的顺序与

dataRange
的顺序相同。 最好在
dataRange
中包含表字段名称,以避免任何不匹配问题

如更新的OP中所述,如果列标签位于下一列中,则用此替换

For
循环(并将
Dim r as Range, col as long
添加到声明中)

    For Each c In Sheets("V").Range("dataRange")
        If Not c = vbNullString Then
            Set r = Worksheets("FORM").Range(c.Value)
            col = lo.ListColumns(c.Offset(, 1).Value).Index
            TableRange.Cells(1, col) = r.Value
        End If
    Next

0
投票

当然,@Jeremy 在 8 年后解决了他的挑战。只是为了让其他读者知道,如果他用

End(xlUp)
而不是
End(x1Up)
,他的方法可能不会失败。

© www.soinside.com 2019 - 2024. All rights reserved.