- ベストアンサー
このコードが、うまく実行できません!
下記の実行後のようにしたのですが、うまく出来ません、 何卒、ご教示くださいませ。 EXEL 2002 です。 ------------------------------------ Sub 数に対してマークを付ける() Dim c As Range Workbooks(1)..Sheets(1).AutoFilter.Range.Cells(1, 5).Select For Each c In Range(Selection, Sheets(1).AutoFilter.Range.Cells(1, 5).End(xlDown)).Select Select Case c.Value Case Is = 0 c.Offset(0, -3).Value = "×" Case Is = 1 c.Offset(0, -3).Value = "△" Case Is = 2 c.Offset(0, -3).Value = "○" Case Else MsgBox "対象の数字がありません" End Select Next End Sub --実行前------------------- A B C D E F G H 1 ・ ・ ・▼▼▼▼▼▼▼▼←オートフィルターのマーク ・ 0 ・ 2 ・ 1 ・ 0 50 ・ --実行後------------------ A B C D E F G H 1 ・ ・ ・▼▼▼▼▼▼▼▼←オートフィルターのマーク ・ × 0 ・ ○ 2 ・ △ 1 ・ × 0 50 ・ ---------- よろしくお願い致します。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
こんにちは。 最初に、ちょっと上目線で申し訳ないけれども、全体的なアドバイスとしては、 せめて、最初の部分ぐらいは、記録マクロに頼ったほうがよいのではないでしょうか?その書き方は、たぶん私などが書いている方法のひとつのようですが、意味が、いまひとつ分かってなかったりしませんか? パターンは決まっているのですが、私個人が、掲示板で書くコードも、ワザと違ったスタイルで書くようにしていますから、あまり参考にはなりません。オーソドックスな書き方から発展したほうがよいです。 個別のアドバイスとしては、 Workbooks(1)..Sheets(1).AutoFilter.Range.Cells(1, 5).Select コンマがひとつ多いだけでなく、Workbooks(1) というのは、意味を外すことが多いですから、辞めたほうがよいです。ブック名は明示的な名前であることと、ワークブックで、Select して、次に、Sheet で Select してください。その後で、セルを Select してください。一行で、選択する方法はありますが、イレギュラーですから、あまりそういう手法は考えないほうがよいと思います。 For Each c In Range(Selection, Sheets(1).AutoFilter.Range.Cells(1, 5).End(xlDown)).Select ちょっと格好は良いけれども、そのSelect は、意味が違ってしまいます。 確かに、論理的には、シート-AutoFilter だから良いのですが、AutoFilter があるという条件付きです。そうしないと、エラーが出ます。だから、コードの考え方の割には、少し、乱暴かなって思います。この考え方自体は悪くはないと思いますが、ちょっとレベルが高いです。 それでうまく行かないということになれば、元に戻して、明示的に、範囲や位置を、コードに入れたほうがよいと思います。 そこは、その考え方を生かして、このようにするか、 With Worksheets(1).AutoFilter.Range For Each c In .Range(.Cells(2, 5), .Cells(2, 5).End(xlDown)) ・ ・ または、このようにすれば取れます。 For Each c In .Range(.Cells(2, 5), .Cells(.Rows.Count, 5)) ・ ・ なお、 MsgBox "対象の数字がありません" これは、ちょっとうっとうしい気がします。出来れば、c.Interior.ColorIndex =45 とか入れれば良いのではないでしょうか?対話形式にすると、マクロがとまってしまいます。もう少し考えたほうがよいです。 サンプルを考えてみました。標準モジュールに登録します。 '------------------------------------------------ Sub 数に対してマークを付けるSample() Dim c As Range If Worksheets(1).AutoFilter Is Nothing Then MsgBox "オートフィルタが設定されていません。", 48 Exit Sub End If With Worksheets(1).AutoFilter.Range 'タイトル行を省くから2行目.Cells(2, 5) For Each c In .Range(.Cells(2, 5), .Cells(2, 5).End(xlDown)) Select Case c.Value Case Is = 0 c.Offset(0, -3).Value = "×" Case Is = 1 c.Offset(0, -3).Value = "△" Case Is = 2 c.Offset(0, -3).Value = "○" Case Else '要検討 MsgBox "対象の数字がありません" End Select Next End With End Sub
その他の回答 (4)
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 私の#3 の補足は、#4 さんのご指摘のとおりですね。 FilterMode が本来は正解だと思います。 それは、オートフィルタ等が、検索値で選択されているという意味ですから、始めて、オートフィルタが生きているわけです。 AutoFilter というものは、ユーザー本位というか、▼(ドロップダウン・ボタン)が出ていれば、AutoFilter.Range で範囲は取れても、何もない状態では、マクロでは当たりは付けられても、それが本当にオートフィルタになるか分からないので、なかなか、ややこしいと思います。 oshietecho-dai さんは、コードを見る限り、掲示板で、勉強されているようですね。ただ、こういう実務レベルの問題は、杓子定規に出来ないので、なかなか難しいです。初歩レベルではありませんね。
お礼
こんばんわ、 ご回答、誠に有難うございました。 変数がどうもよく解ってないようで、まだまだ時間がかかります。
- n-jun
- ベストアンサー率33% (959/2873)
>反対コードはどのようになるのでしょうか? If Worksheets(1).FilterMode = False Then だったかな? 参考URL http://www.eurus.dti.ne.jp/~yoneyama/Excel/vba/vba_autofilter.html 反対ってだけなら If Not Worksheets(1).AutoFilter Is Nothing Then Notをつけると、Nothingではない時にTrueですね。
お礼
ご回答、誠に有難うございました。 Selection.AutoFilter には、大変ひっかかってましたので、HPも見て納得することができました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 #2です。 >そちらがわでは、「実行後」のようになっておりますでしょうか? >当方では、原因がよくわからないんですが、相対参照などの原因なのでしょうか? すみません、オートフィルタが、1行目からではなかったのでしたね。 .Range(.Cells(2, 5), .Cells(.Rows.Count, 5)) Range(.Cells(2, 5), .Cells(.Rows.Count, 5)) としてみてください。(先頭のコンマ「.」を外します) これは、コードが懲りすぎてしまって、私自身、間違えてしまいました。(^^;
補足
こんにちわ、 度々と誠に有難うございました。動作しました。 よくよく、みますと、確かに、1行目から参照してました。 勉強不足で申し訳ありません。 改めて、質問をしようと思いましたが、初歩的だと思いますが、 If Worksheets(1).AutoFilter Is Nothing Then MsgBox "オートフィルタが設定されていません。", 48 Exit Sub End If の反対コードはどのようになるのでしょうか? つまり、 MsgBox "オートフィルタが設定されてます。", 48 マクロの記録では、設定も非設定も同じ(Selection.AutoFilter)になってしまいますで。 AutoFilter Is True Then AutoFilter Then でもないですし。
- n-jun
- ベストアンサー率33% (959/2873)
>For Each c In Range(Selection, Sheets(1).AutoFilter.Range.Cells(1, 5).End(xlDown)).Select なぜSelectがついているのか?も疑問ですが、 やりたい事とうまくいかない事をもう少し具体的にされては? 実行前と実行後の表を見る限り、AutoFilterがなぜ必要なのか? わかりません。
補足
ご回答、誠に有難うございます。 >なぜSelectがついているのか? 当方の間違いでございます。 変数の記述がまだよく解らないのでございます。.etc >AutoFilterがなぜ必要なのか? 当方は、よく使用してるということと、あるとないのとでは、コードが変わってくると思い、あえて記述させていただきました。
お礼
補足が不十分でしたので、申し訳ございません。 下記のようになります。 --実行後1------------------ A B C D E F G H 1 ・ ・ ・▼▼▼▼▼▼▼▼←オートフィルターのマーク ・ 0 ・ 2 ・ 1 ・ 0 ・ × ・ × ・ × ・ × ---------------------------- --実行後2------------------ A B C D E F G H 1 ・ ・ ・▼▼▼▼▼▼▼▼←オートフィルターのマーク ・ 0 ・ 2 ・ 1 ・ 0 ・ 2 ・ 2 ・ ○ ・ ○ ・ × ・ × ・ × ・ ×
補足
こんにちわ、 ご回答、誠に有難うございます。 今、「Sub 数に対してマークを付けるSample()」を動作してますが、動作はするのですが、「実行後」のように表示されないようなんですが、 そちらがわでは、「実行後」のようになっておりますでしょうか? 当方では、原因がよくわからないんですが、相対参照などの原因なのでしょうか?