Excel に 2 つの列があり、すべてのセルにテキスト文字列が含まれています。列 A には 8000 個のセルが含まれ、列 B には 3000 個のセルが含まれます。列 B の各セルをチェックして、セル A1 の文字列が含まれているかどうかを確認する必要があります。存在する場合は、そのテキストを削除し、残りの文字列はそのままにしておく必要があります。次に、セル A2、A3 など、セル A8000 まで同じことを行う必要があります。これを手動で行うにはとてつもなく時間がかかり、VBA プログラマーにとっては簡単であることはわかっていますが、私はまったくの新人で、どこから始めればよいか悩んでいます。ありがとう。
5 に答える
BULKreplaceを使用する非常に簡単な方法は次のとおりです
Sub Sample()
Dim ws As Worksheet
Dim lRow As Long
Set ws = Sheets("Sheet1")
With ws
lRow = .Range("A" & .Rows.Count).End(xlUp).Row
For i = 1 To lRow
.Columns(2).Replace What:=.Range("A" & i).Value, _
Replacement:="", _
LookAt:=xlPart, _
SearchOrder:=xlByRows, _
MatchCase:=False, _
SearchFormat:=False, _
ReplaceFormat:=False
Next
End With
End Sub
Wolf5370が提案するよりも速い方法があります。列Aのすべてのセルをループして、列Bで見つかった値を置き換えることができます。
このような何かがあなたを始めるはずです。
Option Explicit
Sub Replace()
Dim wks as Worksheet
Set wks = Worksheet("Shee1") 'change to suit your needs
With wks
Dim rngLook as Range, cel as Range
Set rngLook = Intersect(.UsedRange,.UsedRange.Offset(1),.COlumns(1))
For each cel in RngLook
.Columns(2).Replace cel.Value, "", xlPart
Next
End With
End Sub
VBAは必要ありません。この式を列Cに入力するだけです。
=VLOOKUP($B1,A:A,1,0)
データがB1で始まると仮定して、この式をB3000まで入力します。
ここで、列Bの値が列Aにある場合は、一致する値が列Cに表示されます。それ以外の場合は、が表示されます#N/A
。
最後に、列Bと列Cを列Cの値で並べ替えてから、不要なものを削除します。
これには30秒かかります。
上記と同等のVBAを投稿できる人が来ると確信しています。
当初は、並べ替え (各列) と列のウォーク ダウン (マスター/トランザクション スタイル) を考えていました。ただし、部分文字列について話していることに気付いたので、ソート順は役に立ちません。これを行う唯一の方法は、1 つのループを別のループにネストし、8000 個のセルすべてを 3000 回チェックすることです。
dim c1 as integer, c2 as integer
for c2=1 to 3000
for c1=1 to 8000
cells(c1,1).value = Replace(cells(c1,1).value, cells(c2,2).value, "")
next c2
next c1
これは私の頭の上から手作りされていることに注意してください(そのため、タイプミスなどが予想されます)。基本的に、文字列を置換するたびに、私が言及したすべての時間をループしています-セル(c1,1)を変数にコピーして置換を行い、書き戻す前に変更されるかどうかを確認することで実行できます-aでテストします数サイクルして、どちらが速いかを確認します。
編集: いくつかのタイプミスを修正しました (実際には、第 2 項の「値」という単語が抜けていました)
PS: セルがわかりにくい場合は、代わりに Range を使用できCells(c1,1)
ます。Range("A" &c1)
Cells(c2,2)
Range("B"&c2)
VBA に限定されているのか、それとも列の追加が許容されるのかは不明です: 以下のように:
B3 で THIS と IS が削除されたときに、D3 で TH がどのように表示されるかに注目してください。
編集ああ、しかし今、これを「ループ」する必要があることがわかりました。対応を考え直さなければなりません。