2012-04-17 43 views
2

セットアップ: データを入力するためのフォームを持つExcel文書があります。そのフォームのデータは、複数の行のデータを簡単に入力できるように表に入力されています。少なくとも私はそう思った。テーブルの行/テーブルの選択方法は?

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

私はSheets("Form").Range("dataForm[#ALL]").Selectとそのいくつかのバリエーションを試しましたが、どれもうまくいきませんでした。

テーブル全体を選択すると、各行を別々に処理できる必要があります。個別に各行を選択すると、データの必要に応じてテーブルの先頭から開始できる必要があります順番になる。

アイデア?

EDit:詳細を追加します。 私は上記のようなフォームを持っており、そのデータはフォーム内の特定のセルの値に応じて異なるテーブルに挿入する必要があります。議論を簡単にするために、そのセルタイプに名前をつけ、ドロップダウンリストで定義されているように3つの値を取ります。それらの価値は収入、費用、移転です。これらの値に基づいて、データを追加するテーブルを決定します。費用などの所得表の費用への収入

だから私がしようとしているのは、そこにある数の行を選択し、それぞれを正しい表に挿入することです。並べ替えは、私が説明したよりも少し複雑ですが、私は最初の並べ替えを把握することができれば、それを数回並べ替えるのは簡単なはずです。

+0

ソーステーブルが適切なテーブルに挿入された後で、そのテーブルを削除していますか? –

+0

1つを除くすべてを削除し、その1つをクリアします。私はそれらをすべて削除すると、私はテーブルとデータ検証設定(私のドロップダウン)を失う。 – SpeedCrazy

答えて

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つの記事があります。 recent oneもまたいくつかの洞察を提供するかもしれない。

EDIT:OPに以下のコメントや編集に基づいて:

これはActivesheet、tblSourceとtblIncome上の2つのテーブルを前提としています。これは、ソーステーブルをIncomeにフィルタリングし、コピーは可視の行をコピーし、tblIncomeの最後にコピーします。最後に、ソース行(1つを除くすべて)を削除します。

あなたはそれが他の二つのカテゴリーのために働く持つようにループを追加することをお勧めします:

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 
+0

明確化してください、Listobject(1)は何を参照していますか?私はそこにテーブルの名前を入れますか?あなたの助けをありがとう、私はあなたのブログをチェックアウトすることを確認します – SpeedCrazy

+0

はい、ListObjectは、テーブルのVBA名です。 1はシート上の最初のテーブルを参照します。 Listobjects( "Table1")、または名前が何であれ、これも機能します。 –

+0

さて、ありがとう、これを試してみよう、できるだけ早く報告します。 – SpeedCrazy

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 
関連する問題