2つの列で構成されるExcelワークシートがあります。1つは文字列で埋められ、もう1つは空です。 VBAを使用して、他の列の隣接する文字列の値に基づいて、空の列のセルの値を割り当てたいと思います。
Dim regexAdmin As Object Set regexAdmin = CreateObject("VBScript.RegExp") regexAdmin.IgnoreCase = True regexAdmin.Pattern = "Admin" Dim i As Integer For i = 1 To 10 "let"s say there is 10 rows Dim j As Integer For j = 1 To 2 If regexAdmin.test(Cells(i, j).Value) Then Cells(i, j + 1).Value = "Exploitation" End If Next j Next i
問題は、このループを大量のデータに使用すると、作業に時間がかかりすぎて、ほとんどの場合、Excelがクラッシュするだけです。
これを行うためのより良い方法を知っている人はいますか?
回答
簡単な回答は次のとおりです。
vba 、数式を使用します。特に、IF
と SEARCH aの組み合わせ>。
=IF(SEARCH($A1,"Admin")>0,"Exploitation","")
しかし、これはコードレビューなので、とにかくやってみましょう。
-
正規表現が遅い。大文字と小文字を区別しないためにのみ使用しているようです。その場合、
StrComp
とvbTextCompare
オプションを使用して、セルの値を直接比較できます。 ( StrCompに関する有用な記事) -
i
およびj
は通常、ループカウンターに使用されますが、row
およびcol
この場合はもっと意味があります。
これは次のようになります。
Dim row As Integer For row = 1 To 10 "let"s say there is 10 rows Dim col As Integer For col = 1 To 2 If StrComp("Admin",Cells(row, col).Value,vbTextCompare) Then Cells(row, col + 1).Value = "Exploitation" End If Next col Next row
回答
単純な文字列の比較は正規表現よりもはるかに高速だと思います。
Dim pattern as string pattern = "Admin" Dim i As Integer For i = 1 To 10 "let"s say there is 10 rows Dim j As Integer For j = 1 To 2 If Cells(i, j) = pattern Then Cells(i, j + 1) = "Exploitation" End If Next j Next i
コメント
- このコードは'大文字と小文字を区別しない比較に対応していませんが、'は正しいです。正規表現はやり過ぎであり、この場合は文字列の比較が優先されます。 (ちなみにコードレビューへようこそ!)
回答
実行時間を50%削減することをお勧めします/努力?
Dim row As Integer For row = 1 To 10 "let"s say there is 10 rows If StrComp("Admin",Cells(row, 1).Value,vbTextCompare) Then Cells(row, 2).Value = "Exploitation" End If Next row
OPが「1つの列をチェックし、隣接する次の列に書き込む」ことについて話していることに誰も気づいていませんでしたか?では、なぜ列をループするのですか? 2番目のパスでは、空のセルまたは「悪用」が含まれているセルのみがチェックされます。
回答
うわー。最初の数行を読んだだけで、次のように疑問に思いました。
- バインドが遅れるのはなぜですか?
- 正規表現を使用するのはなぜですか?
@ ckuhn203はすでに彼の回答で名前を扱っていますが、私はこれを見つけました:
Dim i As Integer For i = 1 To 10 "let"s say there is 10 rows
その結果:
Dim row As Integer For row = 1 To 10 "let"s say there is 10 rows
…コメントはもう必要ありません。
VBAを使用して、他の列の隣接する文字列の値に基づいて、空の列のセルの値を割り当てたいと思います。
VBAの使用は[mis | ab]だと思います:Excel自体は、他に基づいてセル値を割り当てるのに非常に優れていますセルの値。
regexAdmin.Pattern = "Admin"
正規表現を使用していると思います。パターンが単純な単語である場合は、おそらくバズーカで蚊を殺そうとしていると思います。tのツールが間違っています。ここで仕事をします。
回答
Rangeオブジェクトにアクセスするときは常に、1回の読み取り/書き込み操作で実行する必要があります。
forループに入る前に、操作しようとしている範囲全体を読む必要があります。
data = Range(Cells(1,1), Cells(10,2)).Value
これで作業できますデータを使用:
For i = 1 To 10 "let"s say there is 10 rows Dim j As Integer For j = 1 To 2 If regexAdmin.test(data(i, j)) Then data(i, j + 1) = "Exploitation" End If Next j Next i
最後にデータをExcelに書き戻します:
Range(Cells(1,1), Cells(10,2)).Value = data
回答
B1の場合:
=if(upper(A1)="ADMIN","Exploitation","")
次に、入力するだけです。これは大文字と小文字を区別しません。
この自動入力は、ワークシートでインタラクティブに行うか、プログラムで行うことができます。
インタラクティブ: Excelには自動入力機能があります。 B1を選択し、その数式を入力したら、入力ハンドルをダブルクリックします。これは、セルを選択したときにセルの右下隅にある小さな正方形です。Excelは、数式を連続する範囲の最後までインテリジェントにコピーします。データ。つまり、A1-A256に空白のないデータがある場合、B256に自動入力されます。または、空白がある場合は、一番下までスクロールしてB256(または末尾が何であれ)を選択します。次に、Ctrl + Shift +上矢印を押してB1につながる範囲を選択し、Ctrl + Dを押してコピーします(d =同上と考えてください)
VBAの使用… これをプログラムで行う必要がある場合:セルを含む数式を選択して:
Selection.AutoFill Destination:=Range("B1:B19")
いくつかのクールなトリックを行うために自動入力に利用できる他のオプションがあります。数式の代わりにリテラル値をコピーしたり、パターンに基づいてシリーズを埋めたりすることができます。 また、認識できるカスタムパターンを設定することもできます。たとえば、小売店がある場所や都市でよく繰り返す業種などです。
コメント
- コードレビューへようこそ! OPが'列を検索する必要がなかったことを完全に見逃しました! ++ここでの最善の解決策。
回答
他のすべての回答を組み合わせると、大文字と小文字が区別されなくなります。 オリジナルの正規表現では、行数を指定してすべての変数を宣言する必要がなくなりました。これは、Option Explicit
がvbaでの非常に多くのエラーを回避するためです
Option Explicit Sub checkForExploit() Dim row As Integer Dim data() As Variant Dim datarange As Range Set datarange = Range("A1:B10") data = datarange.Value For row = 1 To UBound(data, 1) If LCase(data(row, 1)) = "admin" Then data(row, 2) = "Exploitation" End If Next row datarange.Value = data End Sub