• 締切済み

EXCEL VBA 文字 含む 含まない 実行

マクロ初心者です。 どなたか下記内容のマクロを組みたいのですが、ご教授いただけますでしょうか? 内容 ファイルBのK列には、F・G・Pの記号がランダムに入力されています (各記号は入力されて無い場合があり) 1.ファイルAとファイルBを開き、ファイルBのK列に文字Pが含まれない検索をかけ、該当した場合2へ 該当無しの場合2’へ  2.条件 K列にPを含まないでオートフィルターかけます。 表示されているA2以下の内容をファイルAのA2に貼り付ける 2’.次の処理に移行する 3.ファイルBのK列に文字Pが含まれるで検索をかけ、 該当した場合4へ 該当無しの場合4’へ  4.条件 K列にPを含むでオートフィルターかけます。 表示されているA2以下の内容をファイルAのA58に貼り付けるマクロを終了する 4’マクロを終了する 下記プログラムを組んでみましたがうまくいきません。 Sub() Dim row As Integer row = Range("A" & Rows.Count).End(xlUp).row Book_B.Activate Columns("K").Select If InStr(ActiveCell, "P") = 0 Then ' Pが含まれない   Range("A2").Select   Selection.AutoFilter   Selection.AutoFilter Field:=11, Criteria1:="<>*P*", Operator:=xlAnd  Range("B2:E" & row).Select  Selection.Copy  Book_A.Activate  Range("C4").Select  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False  Book_B.Activate  Selection.AutoFilter End If Book_B.Activate Columns("K").Select If InStr(ActiveCell, "P") > 0 Then ' Pが含まれる  Range("A2").Select  Selection.AutoFilter  Selection.AutoFilter Field:=11, Criteria1:="=*P*", Operator:=xlAnd  Range("C2:C" & row).Select  Application.CutCopyMode = False  Selection.Copy  Book_A.Activate  Range("E58").Select  Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End If End Sub

みんなの回答

  • OtenkiAme
  • ベストアンサー率77% (69/89)
回答No.3

こんにちは。 補足ですが、もし、 > If InStr(Range("K2:K91").Value, "P") = 0 Then という処理を行うのなら、ワークシート関数のCOUNTIF関数を使って If Application.WorksheetFunction.CountIf(Columns("K:K"), "P") = 0 Then を使えばいいと思います。

  • OtenkiAme
  • ベストアンサー率77% (69/89)
回答No.2

こんにちは。 > If InStr(Range("K2:K91").Value, "P") = 0 Then Instr関数のstring1やstring1に指定できるのは文字列式であって、ActiveCell.Valueなら単一の値になりますが、複数のセル範囲の値をまとめて指定することはできません。 それで、Range("K2:K91").Valueの範囲を探して改めてフィルタをかけるのではなく、 最初にフィルタをかけて、該当するデータがあったらコピーする、という処理にされては如何ですか。 AutoFilterをかけると、WorksheetのAutoFilterプロパティで、その範囲のデータだけ調べられるようになりますから、見出し以外にデータがあればコピーするという処理にすればいいと思います。 Worksheets(1)は、質問者さんの環境に合わせて修正してください。 Sub test() Dim myRow As Long 'Book_BのWorksheets(1)で With Book_B.Worksheets(1)   'A列の最終行を取得する   myRow = .Range("A" & .Rows.Count).End(xlUp).row   'K列の定数セル範囲で"P"が含まないデータを抽出する   .Columns("K:K").SpecialCells( _     xlCellTypeConstants, 23).AutoFilter Field:=1, Criteria1:="<>*P*"   '抽出データがあったら   If .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then     'B2からE列の最終行までコピーして     .Range("B2:E" & myRow).Copy     'Book_AのWorksheets(1)のC4セルに値貼り付け     Sht_A.Range("C4").PasteSpecial Paste:=xlPasteValues   End If   'K列の定数セル範囲で"P"を含むデータを抽出する   .Columns("K:K").SpecialCells( _     xlCellTypeConstants, 23).AutoFilter Field:=1, Criteria1:="=*P*"   '抽出データがあったら   If .AutoFilter.Range.SpecialCells(xlCellTypeVisible).Cells.Count > 1 Then     'C2からC列の最終行までコピーして     .Range("C2:C" & myRow).Copy     'Book_AのWorksheets(1)のE58セルに値貼り付け     Book_A.Worksheets(1).Range("E58").PasteSpecial Paste:=xlPasteValues   End If   Application.CutCopyMode = False   'オートフィルタを解除   .AutoFilterMode = False End With End Sub

leo7777
質問者

お礼

OtenkiAmeさん お礼が遅くなりましたが連絡が遅くなり申し訳ございません。 今日いろいろ他のも含めチャレンジしてうまくいきました。 とても勉強になりました。 今後マクロ頑張って勉強してみます。 本当にありがとうございました。

  • OtenkiAme
  • ベストアンサー率77% (69/89)
回答No.1

こんにちは。 どこがうまくいっていないのか書かれていないので、ざっとみて気になったところを書きます。  変数に指定している row は、VBAですでに使われている予約語ですから別の名前にしてください。  その変数を As Integer と整数型で宣言していますが、その範囲は、-32,768~32,767の範囲しか使用できません。このマクロを実行するブックのワークシートの行数は、Integer型で取得可能ですか? As Long と長整数型で宣言した方が無難ではないですか?  Columns("K").Selectと書いていますが、正しい記述ですか?(K列を選択する処理を記録して確認してみてください。)  K列を選択した直後、Activecellは、K1セルになりますが、Instr関数の中で Range("K1").Value と明確に書かないで ActiveCell と書いているのは、意図があるんですか?  ワークシート名が全く記述されていませんが、大丈夫なんですか?

leo7777
質問者

補足

OtenkiAme様 ご回答・ご指摘ありがとうございます。 ご指摘のrowとAs Longについて修正しました。 Columns("K").SelectについてはColumns("K:K").Selectでした。 ご指摘ありがとうございます。(ネットで調べたのですが間違っていたようです) ワークシート名については、質問用にあえて編集しておりまして 実際はBook_AはThisWorkbook・Book_BはTmpBook(開いたブック)で指定しており問題なく動作しております。 Activecellの箇所を下記コマンドに修正しましたが(型が一致しない)と表示されるですがどこかおかしいでしょうか? If InStr(Range("K2:K91").Value, "P") = 0 Then  素人的質問で大変申し訳ないのですが、宜しくお願いいたします。

関連するQ&A

  • Excelマクロでオートフィルターからコピペ

    ファイルのB列の値から0以外の値をオートフィルターで抽出し、値を、別のファイルのD列の一番下に貼りつけるマクロを作っていますがうまくいきません。 今作ったのは Sub macro1() If ActiveSheet.AutoFilterMode = False Then Range("A:G").Select Selection.AutoFilter Else Selection.AutoFilter Range("A:G").Select Selection.AutoFilter End If Selection.AutoFilter Field:=2, Criteria1:="<>0", Operator:=xlAnd Range("A1").Select Range("B2", Range("B2").End(xlDown)).Select Selection.Copy Windows("貼りつけるファイル名").Activate Cells(Rows.Count, 4).End(xlUp).Offset(1).Select ActiveSheet.Paste End Sub です。 フィルターで0以外の値を抽出しコピーまではできていますが、貼りつけるところでエラーがでます。 Microsoft Visual Basic 400 というエラーです。 何が悪いのか分かりません・・・。 分かる方いましたらご教授ください。よろしくお願いします。

  • EXCELのVBAを実行したら止まってしまいます。。。

    お世話になります。 下記のマクロを作ってみたのですが、シート「読込」にコピーされたところまで確認できるのですが、その後マウスが砂時計になって、動かなくなってしまいます。オートフィルタを解除する部分を削って実行してみましたが、同じところで止まりますので、貼付のところに問題があるようなのですが、何がいけないのでしょうか? また、なんかもっとスマートなプログラムになりませんでしょうか? 宜しくお願いします。 Sub test() Sheets("Normal").Select Range("A2").Select Selection.AutoFilter Field:=1, Criteria1:=Sheets("読込").Range("B2"), _ Operator:=xlAnd, Criteria2:=Sheets("読込").Range("C2") Selection.SpecialCells(xlVisible).Copy Sheets("読込").Select Range("C3").Select ActiveSheet.Paste Sheets("Normal").Select Application.CutCopyMode = False ActiveSheet.ShowAllData Selection.AutoFilter End Sub

  • マクロを使って不特定のファイルからコピー&ペーストしたい(エクセル)

    エクセルのデータの必要な列を別のブックに入っているフォーマットにどんどん追加していけるようなマクロを作りたいと思っています。 マクロの自動記録を使ってみたのですが、特定のファイル名が入っているので、使えません。 中を見てみると Windows("A.xls").Activate Columns("b:b").select Selection.copy workbooks.open Filename:="B.xls" Windows("B.xls").Activate Range("D9").select Windows("A.xls").Activate Application.CutCopyMode = False Range("b:b").select Selection.copy Windows("B.xls").Activate Selection.Pastespecial Paste:=xlValues,Operation:=xlNone,SkipBlanks:=False,Transpose:=False . . . となっています。 このファイルAとなっている部分を、どのファイルでも実行できるようにしたいです。 後、ファイルBに貼り付けるときに一番最終行に追加していくにはどのような構文を足せばいいか教えていただきたいです。 初心者で質問の意図が伝わりにくかったらすみません.. よろしくお願いします。

  • ExcelのVBAでできますか?

    こんにちは。 項目1 項目2 あ a1 あ a2 あ a3 あ a4 い b1 い b2 い b3 い b4 い b5 い b6 い b7 というデータがあり、これを別シートに 項目1 項目2 項目3 項目4 項目5 項目6 項目7 項目8 あ a1 a2 a3 a4 い b1 b2 b3 b4 b5 b6 b7 と表示させたいです。 が、VB初心者なので「あ」のところまでしかできませんでした。 実際のデータは「い」から下もずーっとあるので変数などを使わなくてはいけないのでしょうが、よくわかりません。 どうしたらうまくいくでしょうか? ここまで自分でやってみました。 Range("A2").Select Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:="あ" Range("A2").Select Selection.Copy Sheets.Add ActiveSheet.Paste Sheets("Sheet1").Select Range("B2:B15").Select Application.CutCopyMode = False Selection.Copy Sheets(1).Select Range("B1").Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True

  • オートフィルタをし選択・貼付をマクロにしたいのですが、対象データ表示される行が毎回違うのでうまくいきません。

    いつもお世話になっております。 どなたかご教示いただければ助かります。 ファイル(1)のデータの中からA行が830となっているものを、ファイル(2)のページ1の一番下の行に付け足し 同じようにファイル(1)からA行が1000となっているものを、ファイル(2)のページ2の一番下に付け足す という作業をマクロでしたいのですが、毎回830と1000がセルAの何行目に表示されるのかが異なっており、オートフィルタをかけた状態でマクロにするとマクロ作成時にたまたま表示されていた行数が指定されているので、別の日に違う行数をコピーしてしまい私が作成したマクロではうまくいきません。 どう変更すれば宜しいでしょうか? どうぞ宜しくお願い致します。 Workbooks.Open Filename:="mm.xls"    ←上記文でファイル(1) Sheets(DM).Select Rows("1:1").Select Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:="<>*850*", Operator:=xlAnd, _ Criteria2:="<>*1000*" Range("A2").Select Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select Selection.EntireRow.Delete ActiveSheet.Rows("1:1").Select Selection.AutoFilter Windows("xx.xls").Activate  ←ファイル(2) Sheets("ll").Select   ←ページ1  ActiveSheet.Range("A1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Activate Windows("mm.xls").Activate Rows("1:1").Select Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:="1000" Rows("3:3").Select Selection.Copy Windows("xx.xls").Activate ActiveSheet.Paste Application.CutCopyMode = False Windows("xx.xls").Activate Sheets("pp").Select  ←ページ2 ActiveSheet.Range("A1").Select Selection.End(xlDown).Select ActiveCell.Offset(1, 0).Activate Windows("mm.xls").Activate Rows("1:1").Select Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:="850" Rows("2:2").Select Selection.Copy Windows("xx.xls").Activate ActiveSheet.Paste Application.CutCopyMode = False ActiveWorkbook.Save Windows("mm.xls").Activate ActiveWindow.Close End Sub

  • excel2003マクロの2007での使い方

    OS:windowsXP excel2003で作成したマクロがexcel2007で動かなく困っております。 マクロでやりたいことは 1つ目のブック(以降A)の内容を、2つ目(以降B)のブックに行列を反転しコピー です。Aのブックの列数は不変ですが行数、ファイル名は毎回変化します。 excel2003では動いていたのですが2007ではコピー元がBのブックになってしまいます。 実際のマクロは Workbooks(1).Activate Range("A1").Select Range(Selection, Selection.End(xlDown)).Select Range(Selection, Selection.End(xlToRight)).Select Selection.Copy Windows("B.xls").Activate Sheets("sheet2").Select Range("B1").Select Selection.PasteSpecial Paste:=xlPasteAll, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=True です。 よろしくお願いいたします。

  • Excelでマクロを繰り返したい。

    Excelでマクロを記録したら以下のようになりました このマクロを以下の条件で繰り返したいのですが。 Sub Macro1() '------------- '----------------------- ' Sheets("Sheet1").Select Selection.AutoFilter Field:=4, Criteria1:="=5*", Operator:=xlAnd, _ Criteria2:="<>5@*" Range("A3:A302").Select Selection.Copy Sheets("Sheet2").Select Range("A3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet1").Select Range("A1").Select Selection.AutoFilter Field:=4, Criteria1:="=6*", Operator:=xlAnd, _ Criteria2:="<>6@*" Range("A3:A302").Select Selection.Copy Sheets("Sheet2").Select Range("B3").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet1").Select Selection.AutoFilter Field:=4, Criteria1:="=7*", Operator:=xlAnd, _ Criteria2:="<>7@*" Range("A3:A302").Select Selection.Copy Sheets("Sheet2").Select Range("A103").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Sheets("Sheet1").Select Range("A1").Select Selection.AutoFilter Field:=4, Criteria1:="=8*", Operator:=xlAnd, _ Criteria2:="<>8@*" Range("A3:A302").Select Selection.Copy Sheets("Sheet2").Select Range("B103").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False End Sub 条件= Field:は4~35位まで変動します 一連の動作をコピーして手作業で数字を変えてみたのですが プロージャが大きすぎてエラーになってしまいます。 何か良い方法は無いでしょうか?。

  • エクセル・マクロでグラフを最背面に移動させたい

    エクセルのグラフを3つピッタリと重ねて表示しています 後ろのグラフを選択する時「最背面に移動」させてますが これをマクロにしたいです とりあえずマクロの記録でしてみたら Sub Macro1() ActiveSheet.ChartObjects("グラフ 7").Activate ActiveChart.ChartArea.Select Selection.ShapeRange.ZOrder msoSendToBack ActiveWindow.Visible = False Windows("Book1.xls").Activate Range("A1").Select ActiveSheet.ChartObjects("グラフ 5").Activate ActiveChart.ChartArea.Select Selection.ShapeRange.ZOrder msoSendToBack ActiveWindow.Visible = False Windows("Book1.xls").Activate Range("A1").Select ActiveSheet.ChartObjects("グラフ 2").Activate ActiveChart.ChartArea.Select Selection.ShapeRange.ZOrder msoSendToBack ActiveWindow.Visible = False Windows("Book1.xls").Activate Range("A1").Select End Sub と出来たのですが、マクロの実行そしてみると3列目の Selection.ShapeRange.ZOrder msoSendToBack の所で、 「実行時エラー438 オブジェクトはこのプロパティまたはメソッドをサポートしてません」 となってしまいます、どうすればよいのでしょう ボタンを押したら最前面のグラフが最背面に移動するようにしたいのですが難しいのでしょうか

  • Excel VBAについて

    Excelで、指定したセル範囲の外枠に罫線を引き四角形を作り、B1の数字を変えていくと四角形を横に描いていくというマクロを作成したのですが、B1の数値を変えてマクロを実行すると以前に描いた四角形が残ってしまいます。これを数値を変えてマクロを実行すると、以前の四角形を消して新たに四角形を描くにはどうすればよいのでしょうか。何かいい方法があれば教えてください。宜しくお願いします。以下にコードを示しておきます。 Public Sub Main_Code() a = ThisWorkbook.Worksheets("Sheet1").Range("B1") If a = 2 Then Range("I26:K35").Select Selection.BorderAround Weight:=xlMedium Range("B1").Select ElseIf a > 2 Then Dim i As Integer For i = 3 To a Range("I26:K35").Select Selection.BorderAround Weight:=xlMedium Range("I26:K35").Select Selection.Copy Cells(26, 3 * i + 3).Select ActiveSheet.Paste Application.CutCopyMode = False Range("B1").Select  Next i  End If End Sub

  • エクセルマクロVBAについて

    エクセルマクロVBAについて、こんなこと出来ますか? ■A列からAS列の1行目にヘッダー情報をもつデータベース ■A列に担当者名 ■A列にオートフィルタをかけて各担当ごとにデータを抽出したものを別シートに貼り付けて自動印刷したい ■担当者は都度変わるので、Criteria1:="xxx"というようには直接書けない(担当名を自動で抽出したい) ■担当者の数も都度変わる ■補足 一行のデータを特定の雛形に転記する必要があるので別シートに出したいです ちなみに、アナログで記録したコードは以下です。 Sub test1() Sheets("データ抽出シート").Select ActiveSheet.Range("$A$1:$AS$300").AutoFilter Field:=1, Criteria1:="山田" Range("$A$1:$AS$300").Select Selection.Copy Sheets("抽出データ貼付シート").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveWindow.SelectedSheets.PrintOut Copies:=1 Sheets("データ抽出シート").Select ActiveSheet.Range("$A$1:$AS$300").AutoFilter Field:=1, Criteria1:="斉藤" Range("$A$1:$AS$300").Select Selection.Copy Sheets("抽出データ貼付シート").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveWindow.SelectedSheets.PrintOut Copies:=1 Sheets("データ抽出シート").Select ActiveSheet.Range("$A$1:$AS$300").AutoFilter Field:=1, Criteria1:="田中" Range("$A$1:$AS$300").Select Selection.Copy Sheets("抽出データ貼付シート").Select Range("A1").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False ActiveWindow.SelectedSheets.PrintOut Copies:=1 End Sub これ、担当者の抽出を自動でなんとかなりませんか?

専門家に質問してみよう