设置: 我有一个带有用于输入数据的表单的Excel文档,该表单的数据输入到表中以便于输入多行数据。至少我是这么认为的。
所以现在我正在尝试选择表格以将其数据插入适当的位置。我认为,我的问题是:我一次选择一个表行,还是整个表格分别处理每一行。我该怎么做?
我尝试了Sheets("Form").Range("dataForm[#ALL]").Select
及其中的一些变体而没有效果。
如果我选择整个表格,我需要能够单独处理每一行,如果我单独选择每一行,我需要能够从表格的顶部开始,因为数据必须是按顺序。
有什么想法吗?
编辑:添加细节。 我有一个如上所述的表格,其数据必须插入不同的表格,取决于表格中某些单元格的价值。为便于讨论,我们将命名该单元格类型,它有三个可能的值,如下拉列表中所定义。这些价值观是收入,支出和转移。根据这些值,我们决定将数据添加到哪个表中。收入表费用收入等费用
所以我要做的是选择尽可能多的行,并将每个行插入正确的表中。排序比我解释的要复杂一些,但是如果我能找出初始排序,那么将它排序几次应该很简单。
答案 0 :(得分:5)
这应该有助于回答你的问题。
Sub TableStuff()
Dim lo As Excel.ListObject
Dim loRow As Excel.ListRow
Dim i As Long
Set lo = ActiveSheet.ListObjects(1)
With lo
'this is the address of the whole table
Debug.Print .Range.Address
For i = 1 To 10
Set loRow = .ListRows.Add(i)
loRow.Range.Cells(1).Value = "test" & i
Next i
Debug.Print .Range.Address
'address of data rows
Debug.Print .DataBodyRange.Address
End With
End Sub
我的博客上有两篇关于桌子的帖子。 recent one也可能会提供一些见解。
编辑:根据以下评论编辑OP:
这假定Activesheet,tblSource和tblIncome上有两个表。它将源表过滤为Income,副本复制可见行并在tblIncome结束时插入它们。最后,它删除源行(除了一行外)。
您需要添加循环以使其适用于其他两个类别:
Sub MoveTableStuff()
Dim loSource As Excel.ListObject
Dim loTarget As Excel.ListObject
Dim SourceDataRowsCount As Long
Dim TargetDataRowsCount As Long
Set loSource = ActiveSheet.ListObjects("tblSource")
Set loTarget = ActiveSheet.ListObjects("tblIncome")
With loSource
.Range.AutoFilter Field:=1, Criteria1:="income"
SourceDataRowsCount = .ListColumns(1).DataBodyRange.SpecialCells(xlCellTypeVisible).Count
End With
With loTarget
TargetDataRowsCount = .DataBodyRange.Rows.Count
.Resize .Range.Resize(.Range.Rows.Count + SourceDataRowsCount, .Range.Columns.Count)
loSource.DataBodyRange.SpecialCells(xlCellTypeVisible).Copy
.DataBodyRange.Cells(TargetDataRowsCount + 1, 1).PasteSpecial (xlPasteValues)
Application.CutCopyMode = False
End With
With loSource
.Range.AutoFilter
.DataBodyRange.Offset(1).Resize(.DataBodyRange.Rows.Count - 1, .DataBodyRange.Columns.Count).Rows.Delete
End With
End Sub
答案 1 :(得分:1)
如果您已经为表格命名,我有一个函数来获取其完整的数据范围:
Public Function GetTableByName(ByVal ws As Worksheet, ByVal tbName As String) As Range
Dim lObj As ListObject
For Each lObj In ws.ListObjects
If Trim(UCase(lObj.Name)) = Trim(UCase(tbName)) Then
Set GetTableByName = lObj.DataBodyRange
Exit Function
End If
Next lObj
End Function