Execl2007のVBAの質問です
- 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)
- その他MS Office製品
- 回答数4
- ありがとう数5
- みんなの回答 (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
その他の回答 (3)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 私は、どうも甘く見ていました。下位バージョンと同じだと思っていました。だから、単に、フィルターの部分をすべて出せばよいと思っていましたが、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
お礼
重ね重ねありがとうございます。 フィルターの解除はうまくいきました! でも何故か .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _ Worksheets("貼り付け用紙").Range("A1") の行が機能しません。 元データーの「見出しの行?」は貼り付けられているので、 コピーペーストはうまくいってるみたいです。 抽出もできています。 ですので抽出したセルのセレクトができていない ということでしょうか。。。 ちょっとCurrentRegion.SpecialCells(xlCellTypeVisible) を勉強してきます。 またここでご報告致します。
補足
やっと分かりました! CurrentRegionはアクティブセル領域を意味して いるので、データの途中で空白があると そこから下は選択されなかったみたいです。 これで自作初のマクロが完成しそうです。 この度は本当にありがとうございました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 >コピーした後の貼り付けもできてませんでした。 この程度で、全部書く必要がないと思ったので、単に一部しか書いていません。 もし、厳密に言うなら、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
お礼
すみません。説明不足でした。 >コピーした後の貼り付けもできてませんでした。 というのは、マクロを実行したとき、コピーペーストの メソッドがうまく機能しなかった。という意味です。 書いて頂いたコードを実行してみましたが、 やはりオートフィルタの解除はできていません。。。。 それ以外は問題ありません。 元データの方に問題がないか等、 もう一度見直してみます。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 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 すればよいと思います。
お礼
早速の回答ありがとうございます。 試してみましたが、やはりうまくいきません。。。 しかもよくみると コピーした後の貼り付けもできてませんでした。 うまくいくときといかない時がある気がしますが、 何か関係があるのでしょうか?
関連する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
- ベストアンサー
- Visual Basic
- エクセル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 を使ったらよいというところまではわかったのですが・・・。 教えてください!よろしくお願いします!
- 締切済み
- Visual Basic
- エクセル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を使っています。
- 締切済み
- Visual Basic
- エクセル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 ご教授宜しくお願いします。
- ベストアンサー
- Visual Basic
お礼
ありがとうございます! とても勉強になります。 'ExecuteExcel4Macro "PRINT(1,,,1,,,,,,,,2,,,TRUE,,FALSE)" はマクロの自動記録で出てきたコードをそのまま流用 しただけで、正直意味は全く分かっていません。 それにしても全然違ったコードになっていたので びっくりしました。 本来はやはりシートやリストも宣言してから 使うべきなのですね。 見たことがない関数?も出ているので じっくり勉強したいと思います。