2

セットアップ:データを入力するためのフォームを含むExcelドキュメントがあります。そのフォームのデータは、複数行のデータを簡単に入力できるようにテーブルに入力されます。少なくとも私はそう思った。

だから今私は適切な場所にそのデータを挿入するためにテーブルを選択しようとしています。私の質問は、これだと思います。一度に1つのテーブル行を選択するのか、それともテーブル全体を選択して各行を個別に処理するのか。そして、どうすればそれを行うことができますか?

私は試しSheets("Form").Range("dataForm[#ALL]").Selectてみましたが、いくつかのバリエーションがありましたが、どれも機能しませんでした。

テーブル全体を選択する場合は、各行を個別に処理できる必要があります。また、各行を個別に選択する場合は、データが正しいため、テーブルの先頭から開始できる必要があります。

何か案は?

EDit:詳細を追加します。上記のようなフォームがあり、そのデータは、フォーム内の特定のセルの値に応じて異なるテーブルに挿入する必要があります。説明を簡単にするために、そのセルタイプに名前を付けます。ドロップダウンで定義されているように、3つの可能な値があります。それらの値は、収入、費用、および送金です。これらの値に基づいて、データを追加するテーブルを決定します。収入から収入表への費用から費用へなど

だから私がやろうとしているのは、できるだけ多くの行を選択し、それぞれを正しいテーブルに挿入することです。並べ替えは、説明したよりも少し複雑ですが、最初の並べ替えがわかれば、さらに数回並べ替えるのは簡単です。

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

私のブログには、テーブルに関する2つの投稿があります。最近のものもいくつかの洞察を提供するかもしれません。

編集:以下のコメントに基づいて、OPに編集します:

これは、Activesheet上の2つのテーブル、tblSourceとtblIncomeを想定しています。ソーステーブルをIncomeにフィルタリングし、表示されている行をコピーしてtblIncomeの最後に挿入します。最後に、ソース行(1つを除くすべて)を削除します。

ループを追加して、他の2つのカテゴリで機能させることができます。

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 に答える