2

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

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

我尝试Sheets("Form").Range("dataForm[#ALL]").Select了几种变体,但都没有奏效。

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

有任何想法吗?

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

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

4

2 回答 2

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

我的博客上有两篇关于表格的文章。最近的一篇文章也可能提供一些见解。

编辑:根据下面的评论并编辑到 OP:

这假定 Activesheet 上有两个表,tblSource 和 tblIncome。它将源表过滤到收入,复制可见行并将它们插入到 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
于 2012-04-17T02:03:43.223 回答
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
于 2012-04-18T00:32:41.317 回答