[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『フィルタの昇順を設定するマクロ』(龍)
下記の二つのコードに昇順を設定するマクロを設定したいのですが、 他のページで探してきたコードを色々試しましたが、ダメでした。 適正なコードを挿入いただけないでしょうか、 宜しくお願いします。
Sub マクロあ()
Dim objSheet As Worksheet
For Each objSheet In ActiveWorkbook.Worksheets If objSheet.Name <> "最新出荷記録" Then objSheet.Activate Range("D2").Select ActiveWindow.FreezePanes = True Range("A1:AG1").Select Selection.AutoFilter Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd End If Next End Sub
Sub マクロい()
Sheets("実績一覧").Select Range("A1:AG1").Select Selection.AutoFilter Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", _ Operator:=xlAnd
End Sub
エクセルのバージョンは何でしょう?
>昇順を設定する とは、一般操作ではどの様な操作に成りますか?
(HANA)
HANAさんからもコメントあるけど、仮に操作をするとしたらどうやる? ・まずフィルタリングして ・次に、フィルタリングした列で、▼をおして並べ替えを選ぶ。
これをマクロ記録とったら?結果は、なぁ〜んだ ということになると思うけど。
(ぶらっと)
コメントありがとうございます。 下記、マクロ記録をとりました。 マクロいは上手くいきましたが、 マクロあは、下記では作動しませんでした。
Sub マクロ()
Dim objSheet As Worksheet
For Each objSheet In ActiveWorkbook.Worksheets If objSheet.Name <> "最新出荷記録" Then objSheet.Activate Range("D2").Select ActiveWindow.FreezePanes = True Range("A1:AG1").Select Selection.AutoFilter ActiveWorkbook.Worksheets("実績一覧").AutoFilter.Sort.SortFields.Clear ActiveWorkbook.Worksheets("実績一覧").AutoFilter.Sort.SortFields.Add Key:=Range( _ "R1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal With ActiveWorkbook.Worksheets("実績一覧").AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End If Next End Sub
(龍)
私の質問に対する返信が無い様ですが。。。 まぁ、私の本題だけ書かせて貰っておきます。
↓確認して頂けていますか?まだでしたらご確認お願いします。(解決したなら返信は不要です。) [[20111102113521]] 『閉じているブックからのシートコピー』(龍)
それと、最近そう言った方が多い様に感じますが VBAの基本ページに目を通されると、多くの事がもう少し簡単になると思います。
今回の件はたぶん、↓の質問時にマスターしておけば良かった問題だと思います。 [[20111103170920]] 『特定のシートを除くマクロ実行』(龍)
(HANA)
すみません、質問にお答えしてませんが・・・ ⇒上記でぶらっとさんが書かれたように、▼をおして、 日付を古い順に並べようというものです。 [[20111103170920]] 『特定のシートを除くマクロ実行』(龍)のときには、 この作業を想定していなかったので、今回ご相談させていただいています。
上のコードで作動しない理由が分かりません。 ご教授いただけたら幸いです。
[[20111102113521]] 『閉じているブックからのシートコピー』(龍)
あまり意味は分かっていないのですが、 下記、コードで上手くいきました。 何故かいただいたコメントを見落としていました。 本当にすみません。
Sub マクロ()
Workbooks.Open (ThisWorkbook.Path & "\" & "最新出荷記録.xls") Worksheets("最新出荷記録").Copy After:=Workbooks("受注一覧表.CSV").Sheets(2) End Sub
(龍)
確認して貰いたかったのは、保留にしていた件に関して、追記した部分です。 実行出来るコードを作製出来た事は分かっています。 ただし、理解出来ていないと 同じ様な質問を何度も繰り返す事に成ります。
『閉じているブックからのシートコピー』のスレに関して、何か書く事が有るなら 前スレに書いて下さい。関係ない話が混ざると このスレの話が分かりにくく成りますので。
>上のコードで作動しない理由が分かりません。 に関しては、作動しないコードを載せて貰ってないので コードの内容に付いては何とも言えないですが。。。
ちなみに [[20111026212719]] 『オートフィルタで0以外を抽出 表示するマクロ』(龍) の時のマクロの記録をとった環境と 今回の環境は同じでしょうか?違うでしょうか?
今回は、コードの中に 「ActiveWorkbook.Worksheets("実績一覧")」 がたくさん出てきていますが、これは自動的に記録された物ですか? もしも環境が違うなら、同じ環境で記録してみて下さい。
ブックには、シートがたくさん有ります。 標準モジュールに Range("A1") と書いて有った場合 アクティブに成っているブックのアクティブに成っているシートの A1セルの事を意味します。 ActiveWorkbook.Worksheets("実績一覧").Range("A1") と書いて有った場合は アクティブに成っているブックの「実績一覧」シートの A1セルの事を意味します。
For Each objSheet In ActiveWorkbook.Worksheets これで、アクティブに成っているブックのシートがループの度に一つずつ objSheet に入っていくのですが objSheet.Activate Range("D2").Select と書いてあったら、ループの度にアクティブシートが切り替わりますので その時にアクティブに成っているシートのD2セルの事に成りますが もしも objSheet.Activate ActiveWorkbook.Worksheets("実績一覧").Range("D2").Select と書いてあったら、objSheetが何で有っても 「実績一覧」シートのD2セルの事に成ります。
オートフィルタに関しても同様です。 Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd は、アクティブシートに対して処理されますが ActiveWorkbook.Worksheets("実績一覧").Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd に成っていたら、「実績一覧」シートに対して処理されます。
objSheetに入っているシートに対して処理したいなら objSheet.Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd でしょうか?
動かして無いので、確認してみてもらえると良いと思います。 それにしても、最後に載せておられるコードは どこが絞り込みコードなんだろう??
(HANA)
理解が乏しく申し訳ありません。 ご指導を受け、わかる範囲で下記のようにしてみましたが、 RANGEのところで不正な使い方と出てしまいました。
Sub マクロあ() Dim objSheet As Worksheet For Each objSheet In ActiveWorkbook.Worksheets If objSheet.Name <> "最新出荷記録" Then objSheet.Activate Range("D2").Select ActiveWindow.FreezePanes = True Range("A1:AG1").Select Selection.AutoFilter objSheet.Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd objSheet.Range ("R1:R10000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With objSheet.Activate.AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End If Next End Sub
また、「ActiveWorkbook.Worksheets("実績一覧")」がたくさん出てきていますが、 これは自動的に記録された物ですか? もしも環境が違うなら、同じ環境で記録してみて下さい。 というご指摘いただきましたが、同じCSVファイルにて別のマクロで生み出したシートで、 以前にご相談した時と変わっていません。 私の理解力が悪いため、的外れな回答になることが度々あり、本当に申し訳ございません。 (龍)
携帯からなので、短文で済みません。 まず、気になった点だけですが・・・。
エラーが出たのはどの行のRangeの部分でしょう?
また、↓の部分は、どうもおかしい様に思います。 With objSheet.Activate.AutoFilter.Sort
記録で出来たコードと見比べてみて下さい。
(HANA)
ご教授ありがとうございます。 エラーが出たところは下記のとおりでございます。 Sub マクロあ() Dim objSheet As Worksheet For Each objSheet In ActiveWorkbook.Worksheets If objSheet.Name <> "最新出荷記録" Then objSheet.Activate Range("D2").Select ActiveWindow.FreezePanes = True Range("A1:AG1").Select Selection.AutoFilter ⇒ここでございます! objSheet.Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd objSheet.Range ("R1:R10000"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With objSheet.Activate.AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End If Next End Sub
記録でとったやりたいことコードは、下記のとおりです。 ただし、各ページへの一括作用は、記録の取り方が分からず、 下記のとおり1シート分のコードを上に応用しました。
Sub Macroあ()
Range("A1:AG1").Select Selection.AutoFilter ActiveWorkbook.Worksheets("シート@").AutoFilter.Sort.SortFields.Clear ActiveWorkbook.Worksheets("シート@").AutoFilter.Sort.SortFields.Add Key:=Range( _ "R1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal With ActiveWorkbook.Worksheets("YUT").AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With End Sub
ここからご指摘を受けたシート@に対する記載部分を削除して、 ひとつ前のコメントに書いたコードを作りました。
やりたいことを再度整理して書かせていただくと、 下記のとおりです。
Sub マクロあ() Dim objSheet As Worksheet For Each objSheet In ActiveWorkbook.Worksheets If objSheet.Name <> "最新出荷記録" Then objSheet.Activate Range("D2").Select ActiveWindow.FreezePanes = True Range("A1:AG1").Select Selection.AutoFilter Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd End If Next End Sub
上記コードのA:AGの列にデータフィルタを設定した後、「R行についてデータの昇順▼を行い、 日付の古い順に並べ替える」・・・これを上記のコードに組み込みたいのです。 ご説明が長々となり、申し訳ございませんが、ご確認をお願いします。
(龍)
エクセルのバージョンは何でしょう? ⇒EXCEL2007 VISTAです。
(龍)
横から失礼
エラー部分のみ。 2007以降は、まだ慣れないんだけど、「⇒ここでございます!」なの? その1つしたじゃなく? その1つ下であれば、2007以降の並び替えの構文として、そもそもが間違ってるよ。 並び替えのマクロ記録とってみて、できあがったものと見比べてみたらいかが? それと、その下の With objSheet.Activate.AutoFilter.Sort これもへんだねぇ。
(ぶらっと)
>記録でとったやりたいことコードは、下記のとおりです。 の記録をとった時の手順を書いてもらえますか?
シート名(Worksheets(・・・)と言う記述)が3回出てきていますが 1,2回目は「シート@」3回目は「YUT」に成っています。
こちらで試した限りでは、3回とも同じシート名が記録されます。 (最初から一貫して同じシートに対して操作を行っているのでそれが当然と思えますが)
そちらの手順の問題ではなく、 実際のシート名が「YUT」に成っていて シート名がコードに記録されてしまったので こちらに載せる前に、シート名を「シート@」に変更したが、最後の一つは訂正忘れ と言う事でしょうか?
話がややこしく成るので、そちらでテスト用のブックを作成し 記録で出来たコードを直接載せたり、見ている物をそのままこちらに説明出来る様 シート名やデータを変更した物を使って下さい。
それから、そのコードは並べ替えの部分だけしか記録されていない様に思います。 実際は、「0以外を抽出」の操作も必要なのですよね? でしたら、それも一緒に記録にとって下さい。
まずは分かる所まで戻りましょう。
(HANA)
ありがとうございます。 本当に申し訳ございません。 YUTは、シート@に修正をし忘れただけです。
各ページにまたがってのマクロの設定法がわからないため、 再度「あるシート(実績一覧)に対してだけフィルタの昇順」を行った場合を 記録してみましたが、下のようになりました。
1行目のA:AGを選択し、データフィルタを設定します。 その後R列の納期のところを選択し、フィルタの昇順ボタンを押します。 これにより、納期が古い順に並べ変替わります。 そして、0と等しくないものを抽出します。
Sub Macro1()
Sheets("実績一覧").Select Range("A1:AG1").Select Selection.AutoFilter ActiveWorkbook.Worksheets("実績一覧").AutoFilter.Sort.SortFields.Clear ActiveWorkbook.Worksheets("実績一覧").AutoFilter.Sort.SortFields.Add Key:=Range( _ "R1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:= _ xlSortNormal With ActiveWorkbook.Worksheets("実績一覧").AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ActiveSheet.Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd End Sub
以上ですが、これをどのように上記、「マクロあ」のコードに応用していけばよいのか分からず困っている次第であります。
ぶらっと様ご指摘の部分ですが、エラーが出る部分は、 objSheet.Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd のRangeに黄色エラーが付きました。 お手数ですが、ご確認をお願いたします。 (龍)
>objSheet.Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd >のRangeに黄色エラーが付きました。
エラーなら、一行全体が黄色くなると思うけど、まぁ、2007は詳しくないので。 シートの状況が見えないけど、フィルタリングをかけるU列に至る前にリストが終わっている場合は1004エラーとなるとは思う。
でも、いずれにしてもその下の2行もエラーになると思う。
(ぶらっと)
マクロあ のコードに近付けるために、objSheet と言う変数を作って 記録した時の処理対象シート Sheets("実績一覧") を入れてみる事にします。
Set objSheet = Sheets("実績一覧")
これで、objSheet が Sheets("実績一覧") を意味するので Macro1 の、Sheets("実績一覧") や ActiveWorkbook.Worksheets("実績一覧") を objSheet に置き換えて マクロ名を Macro2 として作成して下さい。
動作の確認(エラーなく、実績一覧シートに対して処理が行われるか?)と 作成したコードを合わせてこちらに載せてください。
(HANA)
ありがとうございます。 また、ご指導からズレていないか心配ですが、 下記のように変えてみました。
Sub Macro2()
Set objSheet = Sheets("実績一覧") objSheet.Select Range("A1:AG1").Select objSheet.AutoFilter.Sort.SortFields.Clear objSheet.AutoFilter.Sort.SortFields.Add Key:=Range("R1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal objSheet.AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With objSheet.Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd End Sub .Headerの部分で「参照が不正または不完全です」となってしまいました。
(龍)
おしい感じです。 元のコードと見比べて下さい。
>.Header = xlYes の上の行は With ActiveWorkbook.Worksheets("実績一覧").AutoFilter.Sort でした。
ActiveWorkbook.Worksheets("実績一覧") を、objSheet に変えたら With objSheet.AutoFilter.Sort に成ると思いますが objSheet.AutoFilter.Sort に成っています。
もうひとつ 抜けている行が有る様です。 Range("A1:AG1").Select の次の行は何処へ行ってしまったのでしょうね? Macro1と良く見比べて下さい。
せっかくマクロの記録で動くコードが出来ていたのに 勝手に変えてしまっては、動かないコードに成ってしまいます。 充分気をつけて、該当部分だけを変更して下さい。
それから、変数の宣言部分「Dim objSheet As Worksheet」も付け加えて Macro3として、もう一度載せてもらえますか? もちろん、動作確認の結果も合わせて教えてください。
(HANA)
ありがとうございます。 ご指示いただいたMacro3は、正常に作動しました。
Sub Macro3()
Dim objSheet As Worksheet
Set objSheet = Sheets("実績一覧") objSheet.Select Range("A1:AG1").Select Selection.AutoFilter objSheet.AutoFilter.Sort.SortFields.Clear objSheet.AutoFilter.Sort.SortFields.Add Key:=Range("R1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With objSheet.AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With objSheet.Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd End Sub
(龍)
ありがとうございます。 その後、自分でこうかな?と切った貼ったして下記のコードを実行したら 上手くできました。 丁寧に段階毎に教えていただき、本当にありがとうございます。
Sub Macro4()
Dim objSheet As Worksheet
For Each objSheet In ActiveWorkbook.Worksheets If objSheet.Name <> "最新出荷記録" Then objSheet.Activate Range("D2").Select ActiveWindow.FreezePanes = True Range("A1:AG1").Select Selection.AutoFilter objSheet.AutoFilter.Sort.SortFields.Clear objSheet.AutoFilter.Sort.SortFields.Add Key:=Range("R1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With objSheet.AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With objSheet.Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd End If Next End Sub (龍)
レスが遅く為って済みません。 無事完成した様ですが、もう一歩 進んで貰えたらと思います。
Selectionが何処の事か? いきなりRangeで始まっている所がありますが それがどのシートの事か? 考えて、修正してみて貰えますか?
具体的には Selection.AutoFilter の時に 選択されているのは どのシートのどのセルか?
また、ソートの所の Range("R1") とは、どのシートの事か?
です。
すでに出来ている部分も参考にしてください。
たとえば objSheet.Range("$A$1:$AG$10000") は、objSheetのシートの"$A$1:$AG$10000"のセルを意味します。
(HANA)
ご教授ありがとうございます。 レスが遅くなって→とんでもございません。 お忙しいところ、本当にありがとうございます。
下記のように修正でしょうか?
あまり意味が分かっていないのですが・・・ Sub Macro5() Dim objSheet As Worksheet For Each objSheet In ActiveWorkbook.Worksheets If objSheet.Name <> "最新出荷記録" Then objSheet.Activate Range("D2").Select ActiveWindow.FreezePanes = True objSheet.Range("A1:AG1").Select Selection.AutoFilter objSheet.AutoFilter.Sort.SortFields.Clear objSheet.AutoFilter.Sort.SortFields.Add Key:=objSheet.Range("R1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With objSheet.AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With objSheet.Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd End If Next End Sub
そんな感じですが Selection.AutoFilter の Selection に関してはどうでしょう? この行でオートフィルタを設定していますが オートフィルタを設定したい範囲がどこか、考えてみて下さい。
また、最初に D2セルを選択していますが、これはどのような意図がありますか?
(HANA)
ありがとうございます。 オートフィルタは、項目のある列がAG迄なので、そこまで設定している次第です。 D2というのは、C列まで商品を特定するコードがあるため、画面を固定し、 AG迄列が動いてもコアな情報が見えるようにしています。 (龍)
D2は、ウィンドウ枠の固定位置 (ActiveWindow.FreezePanes = True が、ウィンドウ枠の固定) だったのですね。 でしたら、これは必要そうですね。
>オートフィルタは、項目のある列がAG迄なので、そこまで設定している次第です。 そうですよね。。。 で、それはどのシートのどのセル番地? コードにするためには、「○○シートのセル番地が××の範囲」という風に考えてみて下さい。
ちなみに objSheet.Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd これは、どのシートのどの範囲の事か分かりますよね? この範囲は、勝手に記録された範囲ですか? データがきっちり10000行入っているのでしょうか?
この部分が objSheet.Range("$A$1:$AG$10000")に設定されているオートフィルタの 21番目の項目で 0と等しく無い行だけを表示する と書いてあると読んだら(と、書いてあるのですが。。。) 最初にオートフィルタを設定する範囲も同じ範囲で良さそうに思いますが。。。 どうなんでしょう?
(HANA)
10,000という数字は、現在取り扱っているデータが7,000近いので、 当分は、10,000あればその中に納まるであろうという適当な数字でございます。 ですから、objSheet.Range("$A$1:$AG$10000").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd ←こちらの範囲をcolumn(A:AG)としたほうがよいかと考えますが、 いかがでしょうか? (龍)
例えば↓のスレで、 『EXCEL2007とEXCEL2003の違い』(龍) ぶらっとさん(Sample3)が With Sheets("受注一覧") x = .Range("G" & .Rows.Count).End(xlUp).Row と言うコードを書いて居られますが、この時の x には何が入るか分かりますか?
Rows.Count は、ワークシートの行数です。 End(xlUp) は、ワークシート上で、Ctrl + ↑ をして移動した先のセルの事です。 例えば、A1:A10 に隙間無く何か入力されている時 A5セルをアクティブにして Ctrl + ↑ をすると A1セルまで移動し A15セルをアクティブにしてCtrl + ↑ をすると A10セルまで移動します。 ワークシートの一番下の行までデータが入力される事が無いのなら そのセルをアクティブして Ctrl + ↑ をすると、入力が有る最後のセルに移動します。 .Row は、対象セルの行番号を取得出来ます。
今回は、A1:AG10,000の範囲でオートフィルタを設定したいのではなく 列方向は、A:AGと決まっていますが 行方向はデータが有る範囲で良いと思いますので これを使ってみてはどうでしょう?
確実に一番最後の行までデータが埋まっている列はどこでしょう?
(HANA)
ありがとうございます。 A列は受注コードで、最下行まで必ず埋まります。 下記のように入れてみましたが、
Sub Macro6()
Dim objSheet As Worksheet
For Each objSheet In ActiveWorkbook.Worksheets If objSheet.Name <> "最新出荷記録" Then objSheet.Activate Range("D2").Select ActiveWindow.FreezePanes = True objSheet.Range("A1:AG1").Select Selection.AutoFilter objSheet.AutoFilter.Sort.SortFields.Clear objSheet.AutoFilter.Sort.SortFields.Add Key:=objSheet.Range("R1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With objSheet.AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With x = .Range("A" & .Rows.Count).End(xlUp).Row objSheet.Range("$Ax$:$AG$x").AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd End If Next End Sub
Range("A" & .Rows.Count).End(xlUp).Rowの部分で不正、不適正と出てしまいました。
(龍)
>Range("A" & .Rows.Count).End(xlUp).Rowの部分で不正 Range とか、Rows の前が「.」で始まっています。 実はこれが曲者なんです。
今の所出来て居る↓の部分をみて下さい。 With objSheet.AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With この With 〜 End With の間のコードも「.」で始まっています。 本来 With の後に書いてある「objSheet.AutoFilter.Sort」部分が有るのですが objSheet.AutoFilter.Sort.Header = xlYes objSheet.AutoFilter.Sort.MatchCase = False objSheet.AutoFilter.Sort.Orientation = xlTopToBottom objSheet.AutoFilter.Sort.SortMethod = xlPinYin objSheet.AutoFilter.Sort.Apply と書いて有ると読みにくいです。 そこで(それだけの理由でも無いのですが) Withを使って 共通部分は纏めておきます。
前スレも該当部分は With Sheets("受注一覧") x = .Range("G" & .Rows.Count).End(xlUp).Row の様に With の中に入っていたので、「.」の前には Sheets("受注一覧") が有ったのが 上の方に纏められていたのです。 Wiht から出すと x = Sheets("受注一覧").Range("G" & Sheets("受注一覧").Rows.Count).End(xlUp).Row に成りますが ワークシートの行数は、どのシートでも一定なので Rows.Count の前には 特にシート名を書いておく必要は無いと思います。 x = Sheets("受注一覧").Range("G" & Rows.Count).End(xlUp).Row 最初の「.」も一緒に消しておいて下さい。/~
今回は 受注一覧シートではなく、objSheet さらに、G列ではなく、A列ですね。
この変更で、該当部分のエラーは出なく成ると思います。
次に、その下の「Range("$Ax$:$AG$x")」部分ですが。。。
例えば x に 700 が入ったとします。 Range(この部分)に書きたいのは "$A$1:$AG$700" です。 ~~~~~~~~~--- ↑ ↑ | この部分が x に入っている値に成ると良い この部分は固定
ので、"$A$1:$AG$" & x とします。
シート上で考えてみて下さい。 "$A$1:$AG$"部分を固定にして、最後の「700」部分をBA1セルに入っている値を使った文字にしたい場合 "$A$1:$AG$"&BA1 と書きますよね。
"$A$BA1:$AG$BA1" では $A$BA1:$AG$BA1 と表示されてしまいますし "$A$"&BA1&":$AG$"&BA1 では $A$700:$AG$700 に成ってしまいます。 ここは「1」で固定で良いのに/~~~
もう一つ、xの変数の宣言 Dim x 〜 ってのも忘れず追加しておいて下さい。
(HANA)
ご丁寧に教えていただき、本当にありがとうございます。 下記コードに修正してみましたが、上記ご指導に対する理解が 抜けているかもしれません。 デバックが出ました。
Sub Macro7()
Dim objSheet As Worksheet For Each objSheet In ActiveWorkbook.Worksheets If objSheet.Name <> "最新出荷記録" Then objSheet.Activate Range("D2").Select ActiveWindow.FreezePanes = True objSheet.Range("A1:AG1").Select Selection.AutoFilter objSheet.AutoFilter.Sort.SortFields.Clear objSheet.AutoFilter.Sort.SortFields.Add Key:=objSheet.Range("R1"), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With objSheet.AutoFilter.Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Dim x As Long x = oSheets.Range("A" & Rows.Count).End(xlUp).Row objSheet.Range("$A$1:$AG$" & x).AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd End If Next End Sub
この部分でx = oSheets.Range("A" & Rows.Count).End(xlUp).Row オブジェクトが必要ですとなってしまいました。
(龍)
それはですねぇ。。。 コードを書いている部分の一番上 このマクロの一番上(Sub 〜()の下)ではなく このモジュールに有るコードの一番上(一番上に有る Sub 〜() の上) に Option Explicit を入れて下さい。
これを入れると、宣言されていない変数が有った場合、注意してくれます。 すると、何が間違っているか分かると思います。
(HANA)
HANA様
ありがとうございます。 x = oSheets.Range("A" & Rows.Count).End(xlUp).RowのobjSheetsに「変数が設定されていません」 とのコンパイルエラーが出ました。
(龍)
x = oSheets.Range("A" & Rows.Count).End(xlUp).RowのobjSheetsに「変数が設定されていません」 oSheets objSheetsに ??? よく見てください。 (cal)
calさん、フォロー有り難う御座い居ます。
龍さん、もう少し エクセルの言うことに耳を傾けて下さい。 Option Explicitを入れると、宣言されていない変数が有った場合、注意してくれます。 そして、「oSheets」部分に色がついて、確かに注意されたと思います。 ご自身で間違っていないと思っても、まずはそこを疑って貰わない事には仕様が有りません。
今回は二文字抜けているので、気づきやすい方だと思いますが 例えば jと書かないといけない所をiで打っていたりした場合 見ただけでは余計に間違いを見つけにくいです。
その際は、変数の宣言部分から 該当の変数名をコピーして貼り付けて貰うのが確実だと思います。
もう少しでこの件に付いての話は終了しそうですが その前に、確認させて貰いたい事があります。
Macro1 → Macro2 の変更時の要求は ・Sheets("実績一覧") 等を objSheet に置き換えて下さい でしたが、これがなかなか上手く行きませんでした。 その理由は、それ以外の部分が変更されて仕舞っていたからです。
今回はエクセルが「この変数名違うんじゃない?」と丁寧に教えてくれているのに それに気づけていない状況です。
それらに気づいた今 (・・・前者は確かに変更してしまって居た事は確認出来ていて 今回はcalさんのコメントで気づかれましたよね?) 同じ状況に成った場合、Macro1 → Macro2 の変更や Macro7 → Macro8 の変更は 問題なくできそうですか?それともやはり、難しそうですか?
Macro3 → Macro4 の変更はご自身で考えて出来ていたり これまでもコードの組替やマイナーチェンジはやってこられている様なので 問題なく出来そうには思いますが、実際にどれほど悩まれてやっているのか これをやることがどれほど大変に思って居られるのか 作業現場が見られないこちらとしては、判断が難しい所です。
もう少し話が進んだら「私が作った場合どの様に成るか」と言うコードが完成します。 私がコードを作る場合も、現在(〜もう少し未来に続きますが)と同じ行程で作って行きます。 このスレを通して、龍さんにも 他の場面でも同様に考え目的のコードが作れる様に成って貰う事 が希望です。
一つずつ納得して進んでこれたか、 「○○して下さい」と書いてあるのでその通りにやってここまで進んで来たのか どちらなのか教えてもらえればと思います。
後者であれば、こんな長いやりとりをしなくても こちらが完成したコードを載せて「貼り付けて動かして下さい」なんて短時間で済んだ場合と 結果は同じだと思いますので。
(HANA)
ありがとうございます。
HANA様 macro1→macro2、macro7→macro8ともに他の場合に応用できるか? と問われれば、現段階では難しいと思います・・・ 基礎的な理解が足りていない中、同じような壁にぶつかる不効率、 限界は感じています。 また、「○○して下さい」と書いてあるのでその通りにやってここまで進んで来たのか⇐ このようなつもりはないのですが、一段一段納得して進んでこれたかといえば、 完全にそうではありません。 問われているレベルが自分にとっては、高すぎると感じます。 基礎的な勉強は続けているのですが、範囲が広く、奥も深いので、 なかなか「やりたいレベル」に追いつきません。 そんな中、本当に丁寧に教えていただき、大変感謝いたします。
cal様にご指摘いただき、 x = oSheets.Range("A" & Rows.Count).End(xlUp).RowのobjSheets をobjSheetsに替えてもう一度マクロ実行を行いましたが、 Dim x As Long x = objSheets.Range("A" & Rows.Count).End(xlUp).Row objSheets.で「変数が定義されていません」と出ました。
(龍)
HANAさんの書いた言葉をもう一度。
>龍さん、もう少し エクセルの言うことに耳を傾けて下さい。 「変数が定義されていません」って言われたんだったら自分が定義した変数を確認したら?
っていうかその下の行じゃあ
> objSheet.Range("$A$1:$AG$" & x).AutoFilter Field:=21, Criteria1:="<>0", Operator:=xlAnd ってきちんと書いてるのに。 (春日野馨)
すみません・・・ 前しか見ていませんでした。 上記コード、上手く行きました。
(龍)
>「この変数名違うんじゃない?」と丁寧に教えてくれているのに と書きましたが、実際の所エクセルはあまり丁寧には教えてくれません。 日本語も難解ですし。
でも、使っていく為には 何が不満だと言っているのか理解して 不満を解消して行かないといけません。 人−人 の様に「こんな感じで〜、後は宜しく」と言う訳にはいかないです。
今回の変数名の様に、多くの場合「間違ってない!!」と思うこちらが間違っていて エクセルが正しいことを言っています。 エクセルが正しいが正しいなので、当然そうなのですが。。。 「変数が定義されていません」とエクセルに言われたのが、納得出来ましたか?
>現段階では難しいと思います・・・ >基礎的な理解が足りていない中、〜 に関しては、そんなに難しいレベルの事の確認では無かったのです。
実際の生活でも、 これ、3年前の契約書のデータだけど 得意先名が違うだけで後は一緒だから 「△△建設」と成っている所を「◎◎商事」に変えておいて。 と言った仕事は有ると思います。
そんなときに、勝手に一行削除して仕舞ったり Selection.AutoFilter 必要な所まで消して仕舞ったり With していては、社会生活に困りそうに思いますが。。。
ですから、Macro1 → Macro2 に関しては マクロの知識を必要とする事では無かったのです。
「確かに消えていたから、気を付けないといけないな」とか 「本当だ!!変数名違ってるじゃん」とか きちんと思って頂けているのかが 確認させて貰いたかったのですが、そう言った観点ではどうでしょう?
ここは、日常とは違う世界です。日常だって 落としたつもりは無くても落ちてたり ちゃんと確認したのにもれてたり 有りますので、現時点ではその事に付いて 何かを言うつもりは有りません。
さて、もう一つ話を戻します。 今後必要無い部分ですが、【記録コードの改造】と言う点から 一つやってみて下さい。
objSheet.Range("A1:AG1").Select Selection.AutoFilter objSheet の A1:AG1 セルを選択。 選択している範囲に オートフィルタを設定。 と言うコードに成っています。
たかが選択するだけですが、数が多いと選択する時間が勿体ないです。 objSheet の A1:AG1 セルに オートフィルタを設定。 と言うコードに出来れば、エクセルに A1:AB1 セルを選択させずに済むのですが。
(HANA)
ご指導ありがとうございます。 返信が遅くなり、申し訳ありません。 上記ミスですが、本当に注意深く見ないといけないなと 反省します。
>「この変数名違うんじゃない?」と丁寧に教えてくれているのに
と書きましたが、実際の所エクセルはあまり丁寧には教えてくれません。 日本語も難解ですし。 →エクセルが教えてくれるエラーの内容から順次覚えていこうと思いました。
上記ご説明の最後部分のご指摘ですが、 objSheet.Range("A1:AG1").Select Selection.AutoFilter をobjsheet.Range("A1:AG!").AutoFilterでしょうか? ご確認をお願い致します。
{龍}
そうですね。そんな感じですね。 でも、それじゃ動かないですよ?
一応動かして確認してみて下さい。 で、Macro8として載せてもらえると良いと思います。
その際、インデントを正しくつけなおしてみて下さい。 Macro7は、だいぶ インデントがバラバラに成っています。 「インデント」は、コードの各行の前に入っているスペースの事です。 例えば If ○○ Then 何か処理1 If ×× Then 何か処理2 End If Else 何か処理3 End If と成っていたら、それぞれの処理がどう言った条件の時に行われるのか 分かりにくいです。 もしも If ○○ Then 何か処理1 If ×× Then 何か処理2 End If Else 何か処理3 End If と成っていたら、対応する条件が分かりやすく成ります。 ○○の時 何か処理1 さらに、××の時 何か処理2 ○○でない時 何か処理3
If 〜 End If が対なので、対になっている所の先頭を合わせ その間に位置する部分を一段下げます。
ループ処理の For Each 〜 Next や、Wihtステートメントの With 〜 End With も同様です。 対になっている部分のどこが最初でどこが終わりなのか 見たときに分かりやすくしておくのが良いと思います。
それから、変数の宣言は重複して書いていると怒られるので 最初にまとめて書いておいた方が良いと思います。 >Dim x As Long が、コードの中程に有りますが、 >Dim objSheet As Worksheet の上か下にでも、移動させておいて貰うと良いのではないかと思います。
マクロの記録で出来たコードは ○○.Select Selection.〜 の様に続いて行く事が多いです。
常に、「全ての SelectとSelectionが続けて書けて 省エネコードに出来る」 訳では有りませんが、出来るところも多いですので 今後マクロの記録からコードを作成した際は、気を付けて 消せる所は消す様にしてもらえると良いと思います。
(HANA)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.