- ベストアンサー
VBAで複数行の指定方法と条件に基づいたデータ削除について
- VBAで複数行の指定方法と条件に基づいたデータ削除の方法について教えてください。初心者です。
- やりたいことは、for next文を使用してbook1のシート内のN~R行に特定の文字が入っている場合、book2のシート内のB行の文字を削除することです。
- 現在のコードでは、book1のシート内のN行しか反映されていません。複数行のN~Rに反映させる方法がわかりません。教えていただけると助かります。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
>これではbook1のシートに内のN行しか反映されません N行ではなくN列ですよね。 >複数行N~Rに反映させるコードわからないです やりたいことは「book1.xlsアクティブシートのN1~R100に”受入”という文字が入っていたら、book2.xlsアクティブシートのB列を消去する」で宜しいでしょうか。 最小限の修正に抑えるなら、こうなります。 Sub test() Dim c As Variant Dim i As Long Dim j As Integer ' 列ループ用 Set c = Workbooks("book2.xls").ActiveSheet With Workbooks("book1.xls").ActiveSheet For j = 14 To 18 For i = 1 To 100 If .Cells(i, j) Like "*受入*" Then 'もし、N~R列のどれかに『受入』という文字が入っていたら c.Cells(i, 2).Clear '同じ行のB列のセルをクリアする End If Next i Next j End With End Sub
その他の回答 (4)
- bgm38489
- ベストアンサー率29% (633/2168)
for to nextの重複構造の利用ですね。 For j = 14 To 18 For i = 1 To 100 If Cells(i,j) = ・・・ Next i Next j こうすれば、まずJ=14について、I=1から100まで、次にj=15についてI=1から100まで・・・というように処理できます。 Next I、という風に、どの文字を増やすか(どのFor文に戻るか)を指定するのはこのため。二重構造、三重構造などがなければ、 Iの指定はする必要はないのです(昔のBasic言語では、一重の場合は、増やす文字を省略してよかった)。わざわざ指定するのは、重複構造があるためなのです。
- imogasi
- ベストアンサー率27% (4737/17069)
#3です。やってみたので、Find法のコードを追加しておく。 小生は、VBAとしては、理解がむつかしい課題と思うが、有用で、WEBでも沢山解説がある。 ワイルドカードの機能を使わなくても、LookAt:=xlPart指定で、下記のようにすれば、部分一致で、セルを探してくれるようだ。 MsgBox f.Row & "行ー" & f.Column & "列にみつかった" (2か所)のところに、したい処理のコードを入れる(下記では略)。 Sub test02() Dim f As Range Set f = Range("N1:R100").Find(What:="受入", LookAt:=xlPart) If f Is Nothing Then MsgBox "見つからない " Exit Sub '終了 Else MsgBox f.Row & "行ー" & f.Column & "列にみつかった" firstAddress = f.Address '繰返し検索し、条件を満たすすべてのセルを検索する Do Set f = Range("N1:R100").FindNext(f) If f Is Nothing Then Exit Do Else MsgBox f.Row & "行ー" & f.Column & "列にみつかった" End If Loop Until f.Address = firstAddress '最初に見つかったセルに戻ったら終了 End If End Sub
- imogasi
- ベストアンサー率27% (4737/17069)
質問に書いていることがよくわからない。 >シート内N~R行にある は列の間違いか? 初心者とは言いながら、エクセルそのものの知識や表見法(語句。エクセル術語)常識は勉強してからでないと、VBA利用に行くのは早い。 >Set c = Workbooks("book2.xls").ActiveSheet のActiveSheet も気になる。具体的にシート名を記述して表現しては。 どのシートがアクチブになっているか、直前の状態を頼りにするのは危ういのでは。 ーー 多列の(連続列)範囲を問題にするなら、初心者はまず下記(1)から始めるべきでしょう。 別に少し進んで、FindメソッドというものでNーR列の中で「受入」という文字のあるセルを見つける方法もある。 ーー (1)逐次セル繰り返し法で(行と列に分けて考えて繰り返す) Sub test01() f = Range("N1").Column MsgBox Range("N1").Column t = Range("R1").Column MsgBox Range("R1").Column '--- For i = 1 To 3 '行繰り返し,3は小生のテスト用 For j = f To t ′列限定 If Cells(i, j) Like "*受入*" Then MsgBox i & "行," & j & "列で見つかった" '所定処理 End If Next j Next i End Sub ーーー テストデータ 14 受入 16 17 18 金銭受入 受入れ後 で確認
- ushi2015
- ベストアンサー率51% (241/468)
こんにちは Sub test() Dim c As Variant Dim i As Long Dim t As Range Set c = Workbooks("book2.xls").ActiveSheet With Workbooks("book1.xls").ActiveSheet For i = 1 To 100 If c.Cells(i, 2) <> "" Then Set t = .Range("N" & i).Resize(, 5).Find("受入", , xlValues, xlPart) 'もし、14行目のN~R列のセルのどれかに『受入』という文字が入っていたら If Not t Is Nothing Then c.Cells(i, 2).Clear 'その2行の条件に当てはまるセルをクリアする End If Set t = Nothing End If Next i End With End Sub こんな感じでも。
お礼
for nextの使い方を教えて頂きありがとうございますm(__)m