2017-01-17 7 views
2

前の質問から、ヘッダー行と最初の列の内容に基づいてダイナミックテーブル内の特定のセルを更新するコードがあります。定数値はコード内の固定値ですが、これを複数のセルを一度に更新できるようにマッピングテーブルに参照できるようにする必要があります。VBAでlistobjectsで定数値としてテーブルを使用する

既存のコードと私が扱う必要があるテーブルの例は以下のとおりです。

sub ChangeTable() 

Dim wsMapping As Worksheet 
Dim wsData As Worksheet 
Dim tbl As ListObject 
Dim x As Long 
Dim i As Long 
Dim hdrCount As Long 

Const ACCT_NO = "ABCD1234" 
Const HEADING = "Analysis/*" 
Const NEW_VAL = "80321" 


Set wsData = Worksheets("Test Sheet") 
Set wsMapping = Worksheets("Mapping") 


Set tbl = wsData.ListObjects("Data") 
hdrCount = tbl.HeaderRowRange.Columns.Count 

For x = 1 To tbl.ListRows.Count 
    With tbl.ListRows(x) 
     If .Range(1, 1).Value2 = ACCT_NO Then 
      For i = 2 To hdrCount 
       If (tbl.HeaderRowRange(i).Value2 Like HEADING) Then 
        If (Not IsEmpty(.Range(1, i).Value)) Then 
        .Range(1, i).Value = NEW_VAL 
        End If 
       End If 
      Next 
     End If 
    End With 
Next 

End Sub 

Excelの別のシートには、アカウント番号と新しい値の列を持つ表があります。変更するアカウント番号は最大10個まで可能ですが、ファイルが作成されるたびに変更される可能性がありますので、コードを使用するたびに可変数の定数を処理できる必要があります。

ABCD1234 80310 
ABCD1235 80311 
ABCD1236 80312 
ABCD1237 80313 
ABCD1238 80314 
ABCD1239 80315 
ABCD1240 80316 

は、私は、テーブルの範囲を定義し、言う必要があるだろうと思い、何かのように:

ない場合のisEmpty(細胞(X、1))次に、(定数ACCT_NO =細胞(X、1)ANDのConst NEW_VAL =セル(x、2))

テーブル内の各行をループします。これは効果がありますか?

+0

あなたはそれにスコットが私を打つ、私は、同様のテーブルを片付けた – AlanB

答えて

0

定数に保存されている値を変更することはできません(定義上、定数、すなわち変更なし)。正しいトラックにあるように聞こえます。

通常の文字列変数(たとえばDim ACCT_NO As String)として現在の定数を宣言してから、ループ内でIf not IsEmpty(Cells(x, 1)) Then ACCT_NO = Cells(x, 1): NEW_VAL = Cells(x, 2)を使用できます。

おそらくあなたのコードは次のように見ていることになります:

Sub ChangeTable() 

    Dim wsMapping As Worksheet 
    Dim wsData As Worksheet 
    Dim tbl As ListObject 
    Dim x As Long 
    Dim i As Long 
    Dim rowAcctNo As Long 
    Dim lastrowAcctNo As Long 
    Dim wsAcctNo As Worksheet 
    Dim hdrCount As Long 

    Dim ACCT_NO As String 
    CONST HEADING = "Analysis/*" 
    Dim NEW_VAL As String 

    Set wsData = Worksheets("Test Sheet") 
    Set wsMapping = Worksheets("Mapping") 
    Set wsAcctNo = Worksheets("AcctNos") 'or whatever the sheet is called 
    'Determine how many account number rows to process 
    With wsAcctNo 
     lastrowAcctNo = .Cells(.Rows.Count, "A").End(xlUp).Row 
    End With 

    Set tbl = wsData.ListObjects("Data") 
    hdrCount = tbl.HeaderRowRange.Columns.Count 

    For rowAcctNo = 1 to lastRowAcctNo 
     If Not IsEmpty(wsAcctNo.Cells(rowAcctNo, 1)) Then 
      ACCT_NO = wsAcctNo.Cells(rowAcctNo, 1).Value 
      NEW_VAL = wsAcctNo.Cells(rowAcctNo, 2).Value 
      For x = 1 To tbl.ListRows.Count 
       With tbl.ListRows(x) 
        If .Range(1, 1).Value2 = ACCT_NO Then 
         For i = 2 To hdrCount 
          If (tbl.HeaderRowRange(i).Value2 Like HEADING) Then 
           If (Not IsEmpty(.Range(1, i).Value)) Then 
            .Range(1, i).Value = NEW_VAL 
           End If 
          End If 
         Next 
        End If 
       End With 
      Next 
     End If 
    Next 
End Sub 
+0

これは御馳走を働いていた、あなたの助けに感謝を – AlanB

関連する問題