如何选择表格行/完整表格?

时间:2012-04-17 01:39:49

标签: excel-vba excel-2010 vba excel

设置: 我有一个带有用于输入数据的表单的Excel文档,该表单的数据输入到表中以便于输入多行数据。至少我是这么认为的。

所以现在我正在尝试选择表格以将其数据插入适当的位置。我认为,我的问题是:我一次选择一个表行,还是整个表格分别处理每一行。我该怎么做?

我尝试了Sheets("Form").Range("dataForm[#ALL]").Select及其中的一些变体而没有效果。

如果我选择整个表格,我需要能够单独处理每一行,如果我单独选择每一行,我需要能够从表格的顶部开始,因为数据必须是按顺序。

有什么想法吗?

编辑:添加细节。 我有一个如上所述的表格,其数据必须插入不同的表格,取决于表格中某些单元格的价值。为便于讨论,我们将命名该单元格类型,它有三个可能的值,如下拉列表中所定义。这些价值观是收入,支出和转移。根据这些值,我们决定将数据添加到哪个表中。收入表费用收入等费用

所以我要做的是选择尽可能多的行,并将每个行插入正确的表中。排序比我解释的要复杂一些,但是如果我能找出初始排序,那么将它排序几次应该很简单。

2 个答案:

答案 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