• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBAで複数行の指定)

VBAで複数行の指定方法と条件に基づいたデータ削除について

このQ&Aのポイント
  • VBAで複数行の指定方法と条件に基づいたデータ削除の方法について教えてください。初心者です。
  • やりたいことは、for next文を使用してbook1のシート内のN~R行に特定の文字が入っている場合、book2のシート内のB行の文字を削除することです。
  • 現在のコードでは、book1のシート内のN行しか反映されていません。複数行のN~Rに反映させる方法がわかりません。教えていただけると助かります。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

>これでは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

kousukebojto
質問者

お礼

for nextの使い方を教えて頂きありがとうございますm(__)m

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (4)

  • bgm38489
  • ベストアンサー率29% (633/2168)
回答No.5

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/17068)
回答No.4

#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/17068)
回答No.3

質問に書いていることがよくわからない。 >シート内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)
回答No.2

こんにちは 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 こんな感じでも。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • VBA教えて下さい

    for nextの使い方がわかりません 変数を使用し条件に当てはまる数値だけ 処理するといった内容です 考えたコード sub test() dim a as variant dim b as variant dim i as variant with workbooks("book1").activesheet set a =.range("A5") set b =.range("B5") end with with workbooks("book2").activesheet for i = 80 to 110 if a = cells(i,1) then b.value = cells(i,2) end if next i end sub このコードにてやりたい事は まず、book1の今開いてるシートを参照し A5セル、B5セルをセットし (例えばA5は2と入力している B5セルは10000と入力している) 次に、book2の今開いてるシートを参照し もし、1行目の80~110どれかのセルの数字が 変数aと同じ値ならば (A行80~110行のセルの数字2があれば 例えば85列) 変数bの数字を2行目の80~110に条件に当てはまるセルに移す (B行85列にB5セルの値10000を移す) ()の部分は例えで書いてます 読みにくかったら無視でお願いしますm(__)m 指定の仕方など間違ってると思うので コードを書いてくれると助かります 回答お願いしますm(__)m

  • VBA フォルダ内にあるブックをすべて開く

    いつもお世話になります。 デスクトップ上にフォルダ「新しいフォルダ」があり、その中に6つエクセルブックがあります。 Book1.xls Book2.xls Book3.xls Book4.xls Book5.xls と test.xls です。 test.xlsに、Book1~Book5を開く というマクロを作り実行したところ、実行時エラー1004 『Book1.xlsがみつかりません』と表示されます。 Sub test() Dim buf As String, i As Long buf = Dir("C:\Documents and Settings\tsasaki\デスクトップ\新しいフォルダ\*.xls") Do While buf <> "" i = i + 1 Workbooks.Open Filename:=buf 'Cells(i, 1) = buf buf = Dir() Loop End Sub どのが間違っているか教えてもらえますか。

  • VBA Excel処理の追加を2点教えてください

    Office2003(SP3) 以下は、昔、教えてもらったExcel VBAスクリプトで、よく使わせて もらってます。「C:\mybooks\」にあるxlsファイル(a001.xls、a002.xls、 a003.xls・・・・)を片っ端から開き、 1つのBookに束ねる動作をします。 これだけでも大変便利なのですが、もう少し改善いたしたく。 (1) 束ねられたBookのSheet名が、Sheet1、Sheet1 (2)、Sheet1 (3)、 Sheet1 (4)・・・ になってしまいます。そこで、ファイル名から拡張子を落 とした文字列をSheet名にセットする記述をご教示下さい。 (2) a001.xls、a002.xls、a003.xls・・・は、それぞれSheet1、Sheet2、 Sheet3を含みます。Sheet1だけが抜き取られてSheet2、Sheet3が残された大量 の残骸Bookが開きっぱなしになります。これら、保存せずに閉じる記述を追加 したいのですが。 よろしくお願い致します。 Sub OpenFiles() Dim i As Integer Dim wb As Workbook Dim fname Dim dirname As String ' i = 1 dirname = "C:\mybooks\" fname = Dir(dirname + "*.htm") If fname <> "" Then Do While fname <> "" If fname <> "." And fname <> ".." Then If i = 1 Then ' 最初のファイルを開く Workbooks.OpenText FileName:=dirname + fname Set wb = ActiveWorkbook ' 最初のファイルを新規ブックに複製して閉じる。 ActiveSheet.Copy wb.Close Set wb = ActiveWorkbook Else ' 2番目以降のファイルは複製した最初のファイルに追加 Workbooks.OpenText FileName:=dirname + fname ActiveSheet.Move After:=wb.Worksheets(wb.Worksheets.Count) End If i = i + 1 End If fname = Dir Loop Else MsgBox "検索条件を満たすファイルはありません。" End If Set wb = Nothing End Sub

  • VBA EXCEL 開かずにデータ操作

    現在下記のようなコードでテストしています。 Sub Sample() Dim TargetBook As Workbook    Set TargetBook = Workbooks.Open("Book2.xls")    TargetBook.Sheets("Sheet1").Cells(1, 5) = Cells(1, 1)    TargetBook.Close End Sub Book2を開いてセルの読み書きはテストできました。 これをBook2をopenせず閉じた状態で操作したいと思っています。 Workbooksの表示されるメソッドを色々試してみますが出来ません。 OpenDatabaseが使用できるのかと思いますが、出来ません。 ご指導よろしくお願いします。

  • excel vba

    テーブル情報に基づきシートをコピーするVBAマクロを記述したい。 ExcelのBook111のSheet1に次のような データが入っています。 (1、2)セルにn=3という数字が入っているものとします。 その数値に合わせて、この場合は3なので Sub Sample01() Workbooks("Book3.xls").Worksheets("booksheet3").Copy After:=Workbooks("Book111.xls").Sheet(1) End Sub のようなつまり、booksheet3なるシートをBook111(固定なBOOK)にコピーしようとしています。 このようなことをVBAで書くにはどうすればいいのでしょうか。 ただしBook名とシート名はあくまでデータの値にもとづいたデータをもってくることになります。 要するに間接参照したデータに基づき処理するのをどのように記述するかという質問です。 A列 B列 1 回数 n=3 2     3     4 Book1.xls book1sheet ←n=1 5 Book2.xls book2sheet ←n=2 6 Book3.xls book3sheet ←n=3 7 Book4.xls book4sheet 8 Book5.xls book5sheet 9 Book6.xls book6sheet ←n=6 10 Abc,xls Defsheet ←n=7

  • VBAで複数シートを新たに作成したBookにコピー

    いつも大変お世話になります。動作環境は、WindowXPSP3、EXCEL2010です。10個の名前付きsheetがあります。Book.xlsmから新たにBook1.xlsxを作成してこのBook1.xlsxに1個のsheet名が「sheet1」を作成します。そして、Book.xlsmにある10個の名前付きsheetをBook1.xlsxに作成した一個のsheet1にコピーします。コピーの仕方は、Book.xlsmの一番左端のsheetから順番にBook1.xlsxに作成した1個のsheet1に下から上に向かってコピーしていきます。最終的には、10個の名前付きsheetが纏められます。後一つの条件は、一番最初にコピーするシートには4行目に項目書かれております。なので、一番最初にコピー4行目だけはコピーして、後は、5行目からコピーしたく、下記のマクロを作成しました。 Option Explicit Option Base 1 Public Sub シートの纏め() Dim i As Long Dim mySheetCnt As Long Dim mySheetName() As String Dim ws As Workbook Dim s As Worksheet '========================================================================== mySheetCnt = ThisWorkbook.Sheets.count ReDim mySheetName(1 To mySheetCnt) For i = 1 To mySheetCnt - 3 mySheetName(i) = Sheets(i).Name 'MsgBox "変数mySheetName(" & i & ")=" & mySheetName(i) Next i '========================================================================== Dim EffectiveRow As Long Dim EffectiveColumn As Long EffectiveRow = Range("B65536").End(xlUp).Row 'MsgBox "EffectiveRow = " & EffectiveRow & "" EffectiveColumn = Cells(4, 256).End(xlToLeft).Column 'MsgBox "EffectiveColumn = " & EffectiveColumn & "" '========================================================================== Dim Book1 As Workbook For i = 1 To mySheetCnt - 3 If mySheetCnt = 11 Then GoTo Label1 'MsgBox "mySheetName(i) = " & mySheetName(i) & "" 'MsgBox "デフォルトで" & Application.SheetsInNewWorkbook & "枚作成されます" Workbooks.Add Application.SheetsInNewWorkbook = 1 Sheets("sheet1").Select Book1 = ActiveWorkbook.Name Workbooks("Bookxlsm").Worksheets("mySheetName(i)").Range("B4:AF58").Copy _   Workbooks("Book1.xls").Worksheets("sheet1").Range("B4") ⇐ここで、実行時エラーが出ます。 Next i Label1: End Sub しかし、実行時エラーで止まってしまいます。もう、1週間格闘しております。どなたか、何卒ご教授して頂きたく、宜しくお願い申し上げます。

  • 別bookのセルを参照するにはどうしたらよいでしょうか

    Next Forを使用したマクロで、そのNext For構文内で、別ブックのセルを参照したいのですが、どうしたらよいでしょうか。 下記のように作成してみたのですが、テストしてみると、同ブック同シートの該当セルを参照しているようで、機能しません。下記の書き方では間違っているのでしょうね・・・。 マクロ初心者で、とても初歩的な質問で申し訳ないのですが、教えていただきたく質問させていただきました。よろしくお願いします。 必要なブックは開いている状態です。 Cells(i,_)はbook1・シート"AAA"のi行・_列目を参照し、 Cells(n,_)はbook2・シート"BBB"のn行・_列目を参照し、 Cells(s,_)はbook2・シート"BBB"のセルを参照してほしいのですが・・・。 (1) book1・シート"AAA"のi行18列目のセルとbook2・シート"BBB"のn行・1列目の値が同じであれば (2) (book2・シート"BBB"のn行・1列目)の1行下をs行目としてs行・4列目のセルとbook1・シート"AAA"のi行28列目のセルが同値であれば (3) s行4列目からs行9列目を”ClearContents”するという内容です。下記のマクロは全て記述しておりませんが、ここが間違っているのは確実だと思います。今後の勉強にも是非生かしていきたいと思っておりますので、どうぞよろしくお願いいたします。 Sub test01() Dim n As Long Dim i As Long Dim s As Long For i = 6 To Workbooks("book1.xlsx").Worksheets("AAA").Cells(Rows.Count, 16).End(xlUp).Row If Cells(i, 16) = "" Then Exit For Else For n = 4 To Workbooks("book2.xlsx").Worksheets("BBB").Cells(Rows.Count, 1).End(xlUp).Row If Cells(i, 16) <> "" And Cells(i, 18).Value = Cells(n, 1).Value Then For s = n + 1 To Workbooks("book2.xlsx").Worksheets("BBB").Cells(Rows.Count, 4).End(xlUp).Row If Cells(s, 1) <> "" Then Exit For ElseIf ..............

  • VBA コード番号がない場合は、次の行へ進む

    OSはXPPro、 Excelは2003を使用しています。 入金データの「支店データ」シートのコード番号がマスタの表にある時、新シート(test)にコピーするマクロを作ろうと悪戦苦闘しています。 下記までは組んだのですが、「インデックスが有効範囲にありません」とエラーになってしまいます。 マスタにないコードだからだと思っているのですが、そういう場合は次の行のコード番号に進めるステートメントをどう組めば良いか分かりません。 どなたかご教示頂けると有り難いです。 よろしくお願い致します。 Sub test() Dim wb As Workbook Dim ws As Worksheet Dim mypath As String Dim fname As String Dim maxgyo As Long 'マスタの最終行 Dim intRow As Long 'マスタの行 Dim strMasCode As Long   'マスタのコード番号 Dim maxgyo2 As Long '入金データの最終行 Dim intRow2 As Long '入金データの行 Dim strSrhCode As Long '入金データのコード番号 Dim shingyo As Long '新シートの書き込み行 Worksheets.Add After:=ActiveSheet, Count:=1 '新しいワークシートを作成 ActiveSheet.Name = "test"            'そのシートの名前は[test] mypath = "C:\Documents and Settings\XXX\My Documents\XXX\" fname = "マスタ.xls" Set wb = Workbooks.Open(mypath & fname) '上記で指定したブックを開く Set ws = wb.Worksheets("担当マスタ")     '[担当マスタ]シートを指定 Workbooks("入金データ").Activate maxgyo = Sheets("支店データ").Cells(Rows.Count, 1).End(xlUp).Row '支店データの最終行 For intRow = 2 To maxgyo strSrhCode = Worksheets("支店データ").Cells(intRow, 6) shingyo = 1 shingyo = singyo + 1 Workbooks("マスタ").Activate maxgyo2 = Sheets("マスタ").Cells(Rows.Count, 2).End(xlUp).Row 'マスタの最終行 For intRow2 = 2 To maxgyo2 strMasCode = Sheets("マスタ").Cells(intRow2, 2) 'マスタのコード番号を代入 If strSrhCode = strMasCode Then 'マスタと支店データのコード番号が一致したら With Workbooks("入金データ").Worksheets("test") .Cells(shingyo, 1) = Worksheets("支店データ").Cells(intRow, 1) .Cells(shingyo, 2) = Worksheets("支店データ").Cells(intRow, 2) End With End If Next intRow2 Next intRow End Sub

  • エクセルVBA 無駄な部分をおしえてください

    VBA初心者です。 多数のシートを条件によって二つのブックに分ける、というVBAを作ろうとしています。 なにぶん素人なので、無駄な文章が多いのではないかと心配で、 お知恵を拝借できればと思い投稿いたしました。どうぞよろしくお願いいたします。 やりたいこと:Book1のA列に100程度の文字列があり、そのいずれかと一致するシート名(Book1のSheets(2)以降)を持つシートはBook2の最終シートの後ろへ、どの文字列ともシート名が一致しないシートはBook3の最終シートの後ろへ移動。(「最終シートの後ろへ移動」がうまくいっていません) VBAの内容:Book1のH1に「=countif(A:A,G1)」と入力しておき、G1にシート名を入力させ H1>0ならば該当シートをBook2へ、それ以外はBook3へ移動 の繰り返し   Application.ScreenUpdating = False Dim j As Integer, k As Integer j = Workbooks("Book2.xls").Worksheets.Count k = Workbooks("Book3.xls").Worksheets.Count Do While Workbooks("Book1.xls").Sheets.Count > 1 Range("G1").Value = Worksheets(2).Name If Range("H1").Value > 0 Then Worksheets(2).Move after:=Workbooks("Book2.xls").Sheets(j) Else Worksheets(2).Move after:=Workbooks("Book3.xls").Sheets(k) End If Loop

  • Excel VBAで他のワークブックからのコピぺの仕方について

    Excel VBAで開いている全てのワークブックから決められたセルの中身とそのシート名をそれぞれ決められた一つのワークブックにコピぺする マクロを作りたいのですが、どうやって作って良いのかが分かりません。 例えば、 Sub Mac() For i = 1 To 100 Workbooks("Book1.xls").Worksheets("sheet1").Range(Cells(2108, 2), Cells(3108, 2)).Cut Destination:=Workbooks("Book1.xls").Worksheets("sheet1").Cells(13, 2) End Sub みたいにすれば良いと思うのですが、開いている全てのファイルからのコピぺってどうやって記述するのでしょうか? 何卒よろしくお願い致します。

【MFC-J4440N】FAXの電話帳登録件数
このQ&Aのポイント
  • 新規購入予定の【MFC-J4440N】で、FAXの電話帳登録件数を知りたいです。
  • お使いの環境について教えてください。パソコンもしくはスマートフォンのOSは何ですか?接続方法はどうされていますか?関連するソフトやアプリはありますか?電話回線の種類は何ですか?
  • ブラザー製品についての質問です。新規購入予定の【MFC-J4440N】で、FAXの電話帳登録件数を教えてください。お使いの環境や接続方法、関連するソフトやアプリ、電話回線の種類についても教えてください。
回答を見る

専門家に質問してみよう