Execl2007のVBAの質問です

このQ&Aのポイント
  • Execl2007でVBAを使用した際に、オートフィルタの解除ができない問題が発生しています。問題の原因を教えてください。
  • Execl2007でVBAを使用して、特定の日付の行を抽出して別のシートに自動コピー・プリントアウトするマクロを作りたいです。その際、問題があるかどうか教えてください。
  • 質問したVBAコードを実行すると、指定した日付の行を抽出し、別のシートにコピーすることができますが、オートフィルタの解除ができません。問題の改善方法を教えてください。
回答を見る
  • ベストアンサー

Execl2007のVBAの質問です

度々申し訳ありませんが、何卒またお教えください。 下記の様なコードを書いたのですが、 オートフィルタの解除ができません。 何故なんでしょうか? ちなみに、ある任意の日付の行だけを抽出して 別のシートにコピー・プリントアウト を自動化するマクロを作りたいと思っています。 他にもコードに問題などありましたら 指摘いただけると幸いです。 よろしくお願いします。 ---------------------------------------------------------------- Sub macro2() 'macro test 2 Dim yyyymmdd As Date yyyymmdd = InputBox("印刷したい日付を入力して下さい。", "印刷日入力") With Worksheets("結果") .ListObjects("リスト1").Range.AutoFilter Field:=1, Criteria1:=yyyymmdd .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _ Worksheets("貼り付け用紙").Range("A1") End With 'ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)" Worksheets("結果").AutoFilterMode = False Application.CutCopyMode = False Worksheets("貼り付け用紙").Range("A1:AM100").ClearContents End Sub

  • kkke
  • お礼率71% (66/92)

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.4

こんにちは。 私個人としては、どうもバグのようなものだと解釈していました。 (軽率にバグだというと、恥をかくこともありますが。) >CurrentRegionはアクティブセル領域を意味しているので、データの途中で空白があるとそこから下は選択されなかったみたいです。 CurrentRegionというのは、日本語で「地続き」というのにふさわしいです。ハスでも、繋がっていれば、範囲を選択します。しかし、こちらで、もう一度、考え直してみましたが、ListObject のRange プロパティから取得したほうが良いのではないかと思います。 本格的に書き直してみました。 '変更箇所  Set rng = objList.Range.SpecialCells(xlCellTypeVisible)  rng.Copy Sh2.Range("A1")   それと、 'ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)" これは、正しいですか? きちんとヘルプなりで調べられればよいのですが、今は日本語ヘルプはありませんから、分からないと思います。 ヘルプより PRINT(印刷範囲, 開始, 終了, 部数, 簡易印刷, プレビュー, 印刷範囲, カラー印刷, 給紙方法, 印刷品質, 縦方向の解像度, 印刷対象) 分からない場合は、VBAコマンドにしたほうがよいです。 以下は、丸々使う必要はありませんが、参考にしてみてください。 '------------------------------------------- Sub ListForOutput1()   'macro test 2   Dim myDate As Variant 'バリアント型   Dim fmt As String   Dim objList As ListObject   Dim rng As Range   Dim Sh1 As Worksheet   Dim Sh2 As Worksheet    '-------------------   Set Sh1 = Worksheets("結果")   Set Sh2 = Worksheets("貼り付け用紙") '--------------------   Sh2.Range("A1:AM100").ClearContents   Do     myDate = Application.InputBox("印刷したい日付を入力して下さい。", "印刷日入力", Type:=2)     If VarType(myDate) = vbBoolean Then Exit Sub     '日付のチェック     If IsDate(myDate) = False Then MsgBox myDate & " は、日付ではありません。"   Loop Until IsDate(myDate)      With Sh1     Set objList = .ListObjects("リスト1")     fmt = .Range("A2").NumberFormatLocal '書式を取る     myDate = Format(myDate, fmt) '入力文字の書式変更     objList.Range.AutoFilter Field:=1, Criteria1:=myDate     Set rng = objList.Range.SpecialCells(xlCellTypeVisible)     rng.Copy Sh2.Range("A1")          objList.Range.AutoFilter Field:=1   End With   Application.CutCopyMode = False   With Sh2    .Select '印刷    .PageSetup.PrintArea = .Range("A1").CurrentRegion.Address    .PrintOut Preview:=True 'False にすると印刷します   End With   Set rng = Nothing   Set objList = Nothing   Set Sh1 = Nothing   Set Sh2 = Nothing End Sub

kkke
質問者

お礼

ありがとうございます! とても勉強になります。 'ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)" はマクロの自動記録で出てきたコードをそのまま流用 しただけで、正直意味は全く分かっていません。 それにしても全然違ったコードになっていたので びっくりしました。 本来はやはりシートやリストも宣言してから 使うべきなのですね。 見たことがない関数?も出ているので じっくり勉強したいと思います。

その他の回答 (3)

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.3

こんばんは。 私は、どうも甘く見ていました。下位バージョンと同じだと思っていました。だから、単に、フィルターの部分をすべて出せばよいと思っていましたが、Excel 2007 の場合は、その範囲がテーブルになっていますから、違いがあるようです。(間違いなく、この部分は安定していません。2007のみのようです。次バージョンで、またここは変わるかもしれません。)まあ、マクロにするなら、オートフィルタのほうが安定して使えると思います。私は、新しいテーブルオブジェクトの経験はほとんどありません。 >>コピーした後の貼り付けもできてませんでした。 >というのは、マクロを実行したとき、コピーペーストの >メソッドがうまく機能しなかった。という意味です。 もともと、VBAから、Date 型の検索文字を、ファルタで検索すること自体に問題はないか、バージョンやローカル仕様の違いがあって、うまくいくか同じコードでも可能か分かりません。 >他にもコードに問題などありましたら >指摘いただけると幸いです 後で見直ししましたが、基本的な流れ自体に、間違いはないでしょうか。エラーは出ていないでしょうか?コードによって、何度か不明なエラーが発生しました。 本来の目的は、もしかしたら、フィルタで選択したものをコピーして、それを印刷するというマクロではありませんか?そうしたら、質問のコード自体が違いますね。 >  'ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)" Ver.4 マクロ関数で印刷が良いか悪いかは別として、わざわざこういうコードを使うというのは、出来れば、ヘルプもマニュアルもある人が使うほうが無難です。(Excel 2007 までです。) 2007でためしてみて、一応、コピー&ペースは成功しています。フィルターも解除されています。しかし、下位バージョンではうまく行かない可能性もあります。以下で一度試してみてください。 '------------------------------------------- Sub macro3R()   'macro test 2   Dim yyyymmdd As Variant '←念のためバリアント型に変えた   Worksheets("貼り付け用紙").Range("A1:AM100").ClearContents   yyyymmdd = InputBox("印刷したい日付を入力して下さい。", "印刷日入力")   With Worksheets("結果")     .ListObjects("リスト1").Range.AutoFilter Field:=1, Criteria1:=yyyymmdd     .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _     Worksheets("貼り付け用紙").Range("A1")     .ListObjects("リスト1").Range.AutoFilter Field:=1   End With   Application.CutCopyMode = False   Worksheets("貼り付け用紙").Select   '印刷   'ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)" End Sub

kkke
質問者

お礼

重ね重ねありがとうございます。 フィルターの解除はうまくいきました! でも何故か .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _     Worksheets("貼り付け用紙").Range("A1") の行が機能しません。 元データーの「見出しの行?」は貼り付けられているので、 コピーペーストはうまくいってるみたいです。 抽出もできています。 ですので抽出したセルのセレクトができていない ということでしょうか。。。 ちょっとCurrentRegion.SpecialCells(xlCellTypeVisible) を勉強してきます。 またここでご報告致します。

kkke
質問者

補足

やっと分かりました! CurrentRegionはアクティブセル領域を意味して いるので、データの途中で空白があると そこから下は選択されなかったみたいです。 これで自作初のマクロが完成しそうです。 この度は本当にありがとうございました。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.2

こんばんは。 >コピーした後の貼り付けもできてませんでした。 この程度で、全部書く必要がないと思ったので、単に一部しか書いていません。 もし、厳密に言うなら、AutoFilter のオン・オフを利用するなら、AutoFilter そのものを使えばよいのでは?わざわざ、ListObject を使うというのは、そこに数式の自動コピーなどがあるということだと思いますが、マクロからの違いは、あまりありません。 これで出来ていないということでしょうか? '------------------------------------------- Sub macro2R()   'macro test 2   Dim yyyymmdd As Date   yyyymmdd = InputBox("印刷したい日付を入力して下さい。", "印刷日入力")   With Worksheets("結果")     .ListObjects("リスト1").Range.AutoFilter Field:=1, Criteria1:=yyyymmdd     .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _     Worksheets("貼り付け用紙").Range("A1")     .ListObjects("リスト1").Range.Select     .AutoFilterMode = False   End With   '印刷?   'ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)"   Application.CutCopyMode = False   Worksheets("貼り付け用紙").Select   MsgBox "確認", vbInformation   Worksheets("貼り付け用紙").Range("A1:AM100").ClearContents End Sub

kkke
質問者

お礼

すみません。説明不足でした。 >コピーした後の貼り付けもできてませんでした。 というのは、マクロを実行したとき、コピーペーストの メソッドがうまく機能しなかった。という意味です。 書いて頂いたコードを実行してみましたが、 やはりオートフィルタの解除はできていません。。。。 それ以外は問題ありません。 元データの方に問題がないか等、 もう一度見直してみます。

  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.1

こんにちは。 With Worksheets("結果") .ListObjects("リスト1").Range.AutoFilter Field:=1, Criteria1:=yyyymmdd .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _  Worksheets("貼り付け用紙").Range("A1")  .ListObjects("リスト1").Range.Select '←ここ  .AutoFilterMode = False End With このように、一旦、Select すればよいと思います。

kkke
質問者

お礼

早速の回答ありがとうございます。 試してみましたが、やはりうまくいきません。。。 しかもよくみると コピーした後の貼り付けもできてませんでした。 うまくいくときといかない時がある気がしますが、 何か関係があるのでしょうか?

関連するQ&A

  • VBA 変数について

    VBA初心者でございます。 VBAでgrpという変数を設定し、それをキーにしてオートフィルタをしたいです。 以下のコードではエラーがでてしまうのは、なぜでしょうか? どうぞ宜しくお願いいたします。 Sub 絞り込み2() Dim grp Set grp = Worksheets("リスト").Cells(3, 2) Worksheets("マスタ0701").AutoFilterMode = False With Worksheets("マスタ0701").Range(Cells(3, "B"), Cells(Rows.Count, "CK").End(xlUp)) .AutoFilter Field:=13, Criteria1:=grp '.CurrentRegion.Select Range(Cells(3, "B"), Cells(Rows.Count, "CK").End(xlUp)).SpecialCells(xlVisible).Copy Worksheets("検索結果").Range("A1") '.AutoFilter End With End Sub

  • エクセルVBAでデータ並べ替え

    マクロ記録をとると次のようになりました。 これをA列をキーに並べるもっと簡単なコードを教えてください。 Range("A2:G501")となっていますが、これ以上でも対応できるようにしたいです。 どなたか教えていただけないでしょうか。 Sub Macro1() Range("A1").Select ActiveWorkbook.Worksheets("***").Sort.SortFields.Clear ActiveWorkbook.Worksheets("***").Sort.SortFields.Add Key:=Range("A1"), SortOn _ :=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("***").Sort .SetRange Range("A2:G501") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub

  • VBA初心者です。値を貼り付け について質問です。

    VBA初心者です。 値を貼り付け について教えてください。 Sub test() With Workbooks("A.xls").Worksheets("sheet1") .Range("A1").Copy Workbooks("Bxls").Worksheets("sheet1").Range("B2") .Range("A2").Copy Workbooks("B.xls").Worksheets("sheet1").Range("B4") End With End Sub コピーする方に計算式が入っているので 値を貼り付け したいのですが、どうすればいいのでしょうか? PasteSpecial Paste:=xlPasteValues を使ったらよいというところまではわかったのですが・・・。 教えてください!よろしくお願いします!

  • エクセルVBAで住所録を作成

    住所録シートに次のようにコードを作っています。 Option Explicit Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Target.Address = "$B$1" Then 顧客名検索 ElseIf Target.Address = "$C$1" Then フリガナ検索 ElseIf Target.Address = "$D$1" Then 住所検索 ElseIf Target.Address = "$E$1" Then 郵便番号検索 ElseIf Target.Address = "$A$1" Then オートフィルタ解除 カナ順に設定 Else Exit Sub End If End Sub そして標準モジュールには Sub 顧客名検索() ans = InputBox("顧客名を入力してください") With ActiveSheet If .AutoFilterMode Then 'オートフィルタモードがオンなら .AutoFilterMode = False 'リセットする End If .Range("A1:G1").AutoFilter 'オートフィルタモードをセット .Range("A1:G1").AutoFilter Field:=2, Criteria1:="=*" & ans & "*" '2つ目のフィルターに検索文字 End With End Sub Sub フリガナ検索() ans = InputBox("顧客カナを入力してください") With ActiveSheet If .AutoFilterMode Then 'オートフィルタモードがオンなら .AutoFilterMode = False 'リセットする End If .Range("A1:G1").AutoFilter 'オートフィルタモードをセット .Range("A1:G1").AutoFilter Field:=3, Criteria1:="=*" & ans & "*" '3つ目のフィルターに検索文字 End With End Sub Sub 住所検索() ans = InputBox("住所を入力してください") With ActiveSheet If .AutoFilterMode Then 'オートフィルタモードがオンなら .AutoFilterMode = False 'リセットする End If .Range("A1:G1").AutoFilter 'オートフィルタモードをセット .Range("A1:G1").AutoFilter Field:=4, Criteria1:="=*" & ans & "*" '4つ目のフィルターに検索文字 End With End Sub Sub 郵便番号検索() ans = InputBox("郵便番号を入力してください") With ActiveSheet If .AutoFilterMode Then 'オートフィルタモードがオンなら .AutoFilterMode = False 'リセットする End If .Range("A1:G1").AutoFilter 'オートフィルタモードをセット .Range("A1:G1").AutoFilter Field:=5, Criteria1:="=*" & ans & "*" '5つ目のフィルターに検索文字 End With End Sub Sub オートフィルタ解除() Application.CutCopyMode = False Selection.AutoFilter Range("A1").Select End Sub Sub カナ順に設定() Range("C1").Select ActiveWorkbook.Worksheets("住所録").Sort.SortFields.Clear ActiveWorkbook.Worksheets("住所録").Sort.SortFields.Add Key:=Range("C1"), _ SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("住所録").Sort .SetRange Range("A2:IV65536") .Header = xlNo .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("A2").Select Selection.AutoFilter End Sub と入れています。 VISTAで作ったのですが、このファイルを共有にして使おうとすると、XPのパソコンでは、A1セルをダブルクリックすると、コードが黄色になり、マクロが中断されます。 B1~G1は問題なくマクロが実行されるのに・・・。 もう一台のVISTAでは同じ共有状態で使っても問題ありません。 どうすればXPでも問題なく使えるのでしょう?

  • Excel VBAについてご教ください

    いつも、こちらのサイトをみながら、VBAを勉強させていただいているのですが、 今回、自分のやりたいことが見当たりませんでしたので、ご教示いただければと思います。 やりたいことは、 (1)「エリア1」にある名称ごとに同じBookの別シートに振り分け (2)各シートで「累計売上」順(降順)に並べ替え の2つの作業を同時に行いたいのです。 また、 (1)には、あらかじめ決まったシートが用意されているので、 そのシートの決められた範囲にデータを移したいのと、 データを貼り付ける前に、前に残っている前回のデータを削除してから、同場所に貼り付けを行いたいです。 ちなみに、エリアが3つあるので、シートも3枚あります。 自分でも、いろいろとやってみて、 下記のようなコードを書いたのですが、あまりにも重くて、動きがわるかったため、 シンプルかつ、軽やかに動くコードの書き方をお教えいただければと思います。 よろしくお願いいたします。 Sub Macro2() Application.ScreenUpdating = False With Worksheets("元データシート") .Range("A5").AutoFilter _ Field:=9, _ Criteria1:="京前", Operator:=xlAnd .Range("F4:P65500").Copy _ Worksheets("前 品別").Range("AJ5") .AutoFilterMode = False .Range("A5").AutoFilter _ Field:=9, _ Criteria1:="京中", Operator:=xlAnd .Range("F4:P65500").Copy _ Worksheets("中 品別").Range("AJ5") .AutoFilterMode = False .Range("A5").AutoFilter _ Field:=9, _ Criteria1:="京後", Operator:=xlAnd .Range("F4:P65500").Copy _ Worksheets("後 品別").Range("AJ5") .AutoFilterMode = False End With Application.ScreenUpdating = True MsgBox "各地区シートにデータを振分けました。" End Sub 【元データの形式は以下のような形になってます。】     A    B    C    D     E       F      G      H      I     J   4  コード S番号 S名称  S名  月間個数 月間売上 累計個数 累計売上 エリア1  エリア2 5  4237  4025  AAA  あああ   3      150     7      350    京後    後A    6  6769  4025  AAA  いいい   2      100     5      250    京中    中B 7  3453  4028  BBB  ううう    5       50     5       50    京後    後C 8  4252  4029  CCC  えええ   1      110     9      990    京前    前A 9  3564  4027  DDD  おおお   0       0      8      80    京前    前A 10 8035  4022  EEE  かかか   1       30     2      60     京中    中B 11 9225  4026  EEE  ききき    2       40     3       60    京後    後A 以下5000行ぐらいデータが続きます。

  • 可視セルから結合セルへの貼り付けについて

    お世話になります。 ユーザーフォームに期間を入力し、オートフィルタから可視セル をコピペしようと試みたのですが、貼り付け先が結合セルのため うまく出来ません。可視セルをひとつずつ貼り付けるしかないのでしょうか? 仮にセルを一つずつ貼り付ける場合はどのようにコードを 書いたらよいでしょうか? 以下コード Private Sub CommandButton1_Click() Dim 開始日 As Date Dim 終了日 As Date 条件 = Worksheets("sheet2").Range("C6") 場所 = Worksheets("sheet2").Range("A21") 開始日 = TextBox1 終了日 = TextBox2 If Worksheets("sheet1").AutoFilterMode Then Worksheets("sheet1").AutoFilterMode = False End If ScreenUpdating = False With Sheets("sheet1") .Range("A5").AutoFilter Field:=2, Criteria1:=">=" & TextBox1, Operator:=xlAnd, _ Criteria2:="<=" & TextBox2 '条件日付 .Range("A5").AutoFilter Field:=13, Criteria1:="=" & 条件, Operator:=xlAnd '条件 End With Range("A5").Select Range("A5:X1000").Sort Key1:=Range("A5"), Order1:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ SortMethod:=xlPinYin, DataOption1:=xlSortNormal Worksheets("sheet1").Range("A5").CurrentRegion.SpecialCells (xlCellTypeVisible) .Copy Worksheets("sheet2").Range("A21").Offset(-1.1).PasteSpecial , Paste:=xlPasteValues Range("C6").Select Application.CutCopyMode = False Worksheets("sheet1").AutoFilterMode = False ScreenUpdating = True End Sub

  • 下記マクロの意味を教えてください。

    Sub 済() With Worksheets("管理表") If .AutoFilterMode Then .AutoFilterMode = False End If Range("O7:P7").Select Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:="=*済*", Operator:=xlAnd ActiveWindow.SmallScroll Down:=-12 Range("A1").Select End With End Sub よろしくお願い致します。

  • VBA(重回帰分析)

    以下のプログラムが動かないのですがなぜでしょうか? Sub Macro2() Application.Run "ATPVBAEN.XLAM!Regress", _ Worksheets("aaa").Range("$A$1:$A$5"), _ Worksheets("aaa").Range("$B$1:$C$5"), True, False, , _ Worksheets("bbb").Range("$A$1"), False, False, False, False, , False End Sub 具体的には、シート「aaa」のA1~A5を説明変数、B1~C5を被説明変数として、重回帰分析の結果を「bbb」のA1に表示させようとしているのですが、うまくいきません。 ちなみにexcel2007を使っています。

  • エクセルVBA住所録で半角全角問わず検索する方法

    エクセルVBAで住所録を作っています。 住所録で下記のようなコードを書いて、キーワード検索をさせるようにしているのですが、『*丁目』や番地に半角英数を使っています。 全角で数字を入力しても検索されるようなコードの書き方はあるのでしょうか? 宜しくお願いします。 Sub 住所検索() ans = InputBox("住所を入力してください") With ActiveSheet If .AutoFilterMode Then 'オートフィルタモードがオンなら .AutoFilterMode = False 'リセットする End If .Range("A1:IV1").AutoFilter 'オートフィルタモードをセット .Range("A1:IV1").AutoFilter Field:=4, Criteria1:="=*" & ans & "*" '4つ目のフィルターに検索文字 End With End Sub

  • VBAについて

    VBAについて質問です。 データをコピーして新規ブックとして名前(年、月、日)をつけて別のフォルダ(デスクトップ上のフォルダ)に毎朝8時に保存したいのですが、Cディスク内に直接保存されてしまいます。 コードは以下の通りです。 Sub 自動保存() With workbooks("サンプル.xism") Worksheets("Sheet3").Range("B6:B205").Value = .Worksheets("メインモニタ").Range("F13:F212").Value Worksheets("Sheet3").Range("D6:D205").Value = .Worksheets("メインモニタ").Range("K13:K212").Value Worksheets("Sheet3").Range("F6:F205").Value = .Worksheets("メインモニタ").Range("P13:P212").Value Worksheets("Sheet3").Range("H6:H205").Value = .Worksheets("メインモニタ").Range("U13:U212").Value End With Worksheets("Sheet3").Select Worksheets("Sheet3").Copy Application.DisplayAlerts = False With ActiveWorkbook.SaveAs "C:\サンプル2_" & Format(Date , "yyyymmdd") . Close End With Application.DisplayAlerts = True Application.OnTime DateValue(Date + 1) + TimeValue("8:00:00") , "自動保存" Worksheets("メインモニタ") . Activate End Sub ご教授宜しくお願いします。

専門家に質問してみよう