• ベストアンサー

このコードが、うまく実行できません!

下記の実行後のようにしたのですが、うまく出来ません、 何卒、ご教示くださいませ。 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 ・ ---------- よろしくお願い致します。

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

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

こんにちは。 最初に、ちょっと上目線で申し訳ないけれども、全体的なアドバイスとしては、 せめて、最初の部分ぐらいは、記録マクロに頼ったほうがよいのではないでしょうか?その書き方は、たぶん私などが書いている方法のひとつのようですが、意味が、いまひとつ分かってなかったりしませんか? パターンは決まっているのですが、私個人が、掲示板で書くコードも、ワザと違ったスタイルで書くようにしていますから、あまり参考にはなりません。オーソドックスな書き方から発展したほうがよいです。 個別のアドバイスとしては、 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

oshietecho-dai
質問者

お礼

補足が不十分でしたので、申し訳ございません。 下記のようになります。 --実行後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 ・  ○  ・  ○ ・  × ・  × ・  × ・  ×

oshietecho-dai
質問者

補足

こんにちわ、 ご回答、誠に有難うございます。 今、「Sub 数に対してマークを付けるSample()」を動作してますが、動作はするのですが、「実行後」のように表示されないようなんですが、 そちらがわでは、「実行後」のようになっておりますでしょうか? 当方では、原因がよくわからないんですが、相対参照などの原因なのでしょうか?

その他の回答 (4)

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

こんばんは。 私の#3 の補足は、#4 さんのご指摘のとおりですね。 FilterMode が本来は正解だと思います。 それは、オートフィルタ等が、検索値で選択されているという意味ですから、始めて、オートフィルタが生きているわけです。 AutoFilter というものは、ユーザー本位というか、▼(ドロップダウン・ボタン)が出ていれば、AutoFilter.Range で範囲は取れても、何もない状態では、マクロでは当たりは付けられても、それが本当にオートフィルタになるか分からないので、なかなか、ややこしいと思います。 oshietecho-dai さんは、コードを見る限り、掲示板で、勉強されているようですね。ただ、こういう実務レベルの問題は、杓子定規に出来ないので、なかなか難しいです。初歩レベルではありませんね。

oshietecho-dai
質問者

お礼

こんばんわ、 ご回答、誠に有難うございました。 変数がどうもよく解ってないようで、まだまだ時間がかかります。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.4

>反対コードはどのようになるのでしょうか? 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ですね。

oshietecho-dai
質問者

お礼

ご回答、誠に有難うございました。 Selection.AutoFilter には、大変ひっかかってましたので、HPも見て納得することができました。

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

こんにちは。 #2です。 >そちらがわでは、「実行後」のようになっておりますでしょうか? >当方では、原因がよくわからないんですが、相対参照などの原因なのでしょうか? すみません、オートフィルタが、1行目からではなかったのでしたね。 .Range(.Cells(2, 5), .Cells(.Rows.Count, 5)) Range(.Cells(2, 5), .Cells(.Rows.Count, 5)) としてみてください。(先頭のコンマ「.」を外します) これは、コードが懲りすぎてしまって、私自身、間違えてしまいました。(^^;

oshietecho-dai
質問者

補足

こんにちわ、 度々と誠に有難うございました。動作しました。 よくよく、みますと、確かに、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)
回答No.1

>For Each c In Range(Selection, Sheets(1).AutoFilter.Range.Cells(1, 5).End(xlDown)).Select なぜSelectがついているのか?も疑問ですが、 やりたい事とうまくいかない事をもう少し具体的にされては? 実行前と実行後の表を見る限り、AutoFilterがなぜ必要なのか? わかりません。

oshietecho-dai
質問者

補足

ご回答、誠に有難うございます。 >なぜSelectがついているのか? 当方の間違いでございます。 変数の記述がまだよく解らないのでございます。.etc >AutoFilterがなぜ必要なのか? 当方は、よく使用してるということと、あるとないのとでは、コードが変わってくると思い、あえて記述させていただきました。

関連するQ&A