我将工作簿中的一系列
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"
中指示的顺序从中提取数据并将其填充到表中。
假设您确实有一个表,使用它的属性和方法将数据添加到表(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
当然,@Jeremy 在 8 年后解决了他的挑战。只是为了让其他读者知道,如果他用
End(xlUp)
而不是 End(x1Up)
,他的方法可能不会失败。