1

頭に浮かぶのは、分析・リレーショナルデータベースの概念のないプログラマーが作成した数十万行のExcelファイルです。このファイルには基本的に、3 つの別個のテーブル (A、B、および C) が含まれており、それぞれに独自のフィールド セットがあり、すべてが 1 つの巨大なワークシートにまとめられています。

キーを割り当てるのではなく、各顧客のすべてのレコードを位置別にグループ化し、各行が属するテーブルを「テーブル」列で A、B、または C としてタグ付けします。各レコードは基本的に次のようになります。

Table    Field 1   Field 2    .......
A        X         X
B        X         X
B        X         X
B        X         X
C        X         X

レコードごとに最大 1 つの A と 1 つの C が常に存在します。すべてのレコードに A の行はありませんが、常に C があります。新しいレコードは常に、各 C 行の後に開始されます。VB はこのタスクに最適な選択ではないかもしれませんが、当面の暫定的な解決策を得たいだけです。これは、これまでのコードでの私の試みでした (テーブル インジケーターは列 B にあり、ID を列 O に書き込みたい):

Sub CreateID()
Dim rng As Range
Dim cell As Range
Dim lastcol As Range
Dim firstcol As Range
Dim ID As Integer

ID = 1

Set rng = Range("B4:O100")
Set firstcol = Range("B4:B100")
Set lastcol = Range("O4:O100")
For Each cell In rng
    For Each c In firstcol
        With lastcol
        lastcol.Value = ID
        End With
    If c.Value = "C" Then
        ID = ID + 1
    End If
    Next c
Next cell
End Sub

あなたが VBA を私よりもよく知っているかどうかわかるように、これは列 o のすべてのセルの値を ID に設定し、ID が 1 増加するたびにすべてのセルの値を変更し続けます。さらに、ループが終了していないようです (ID が 1000 を超えた後、ctrl+break しました)。

4

1 に答える 1

0

約束どおり、自分の質問に答えます。私は VBA に非常に慣れていないので、これを行うためのよりエレガントで高速な実行方法があると確信しており、それが何であるかを知りたいと思っています。

Sub CreateID()
Dim rng As Range
Dim cell As Range
Dim firstcol As Range
Dim ID As Integer

ID = 1
counter = 1

Set rng = Range("B4:O100")
Set firstcol = Range("B4:B100")
For Each c In firstcol
    rng(counter, 14) = ID
    counter = counter + 1
    If c = "C" Then
        ID = ID + 1
    End If
Next c
End Sub
于 2013-06-14T13:48:37.247 に答える