• ベストアンサー

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

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

  • エクセル マクロ:文字変更

    教えてください。 sheet5にデータがあります。 マクロを実行すると、一番右の列のセルに○があると●と書き換える 一番右の列のセルに△があると▲と書き換えるコードを作成しています。 下記のコードでは時間がかかってしまいます。 省略 If Sheets("sheet5").Cells(r, cmax).Value = "○" Then Sheets("sheet5").Cells(r, cmax).Value = "●" 省略 AutoFilterを使用してマクロを作成しましたが、列に○と△が両方無いと 範囲指定したセルがすべて▲となってしまいます。 下記コードをどのように手直ししたらよいのか教えて頂けないでしょうか。 よろしくお願いします。 Sub 文字変更() Dim c As Integer Dim cmax As Integer Dim rmax As Long With Sheets("sheet5") rmax = .Range("A3").End(xlDown).Row cmax = .Range("A3").End(xlToRight).Column .Rows("1:1").Select Selection.AutoFilter For c = 2 To cmax Selection.AutoFilter Field:=c, Criteria1:="○" .Cells(1, c).Offset(1, 0).Select .Range(Selection, Cells(rmax, c)).Value = "●" Selection.AutoFilter Field:=c, Criteria1:="△" .Cells(1, c).Offset(1, 0).Select .Range(Selection, Cells(rmax, c)).Value = "▲" Selection.AutoFilter Field:=c Next c End With Selection.AutoFilter End Sub

  • EXCELのVBAを実行したら止まってしまいます。。。

    お世話になります。 下記のマクロを作ってみたのですが、シート「読込」にコピーされたところまで確認できるのですが、その後マウスが砂時計になって、動かなくなってしまいます。オートフィルタを解除する部分を削って実行してみましたが、同じところで止まりますので、貼付のところに問題があるようなのですが、何がいけないのでしょうか? また、なんかもっとスマートなプログラムになりませんでしょうか? 宜しくお願いします。 Sub test() Sheets("Normal").Select Range("A2").Select Selection.AutoFilter Field:=1, Criteria1:=Sheets("読込").Range("B2"), _ Operator:=xlAnd, Criteria2:=Sheets("読込").Range("C2") Selection.SpecialCells(xlVisible).Copy Sheets("読込").Select Range("C3").Select ActiveSheet.Paste Sheets("Normal").Select Application.CutCopyMode = False ActiveSheet.ShowAllData Selection.AutoFilter End Sub

  • VBA コマンドボタンにおけるコードについて

    下記のようなコードを作成しました。 これを簡略化するにはどうすれば良いのでしょうか? よろしくお願いします。 Private Sub CommandButton1_Click() Sheets("sheet2").Select Select Case UserForm1.ComboBox1.Text Case Is = Sheets("sheet2").Range("A1").Value Sheets("sheet2").Range("B1").Value = "X" Case Is = Sheets("sheet2").Range("A2").Value Sheets("sheet2").Range("B2").Value = "X" Case Is = Sheets("sheet2").Range("A3").Value Sheets("sheet2").Range("B3").Value = "X" Case Is = Sheets("sheet2").Range("A4").Value Sheets("sheet2").Range("B4").Value = "X" Case Is = Sheets("sheet2").Range("A5").Value Sheets("sheet2").Range("B5").Value = "X" ・ ・ ・ End Select End Sub

  • <excel:VBA>変数を使って簡略化したい

    google検索してなんとか自力で作ったVBAを下記に貼りました。 きちんと動作はするのですが、せっかくなので変数を使って簡素化し、 データが多くても動作が速くなるようにしたいのです。 いろいろ試しましたが、変数の使い方の知識が乏しく、うまくいきませんでした。 変数としたいのは■マークの2箇所になると思います。 詳しい方、力を貸していただけないでしょうか。 どうぞよろしくお願いいたします。 ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ Sub オートフィルタ貼付作業() With Sheets("データ").Range("A3") Application.ScreenUpdating = False Range("AA3:EK3").AutoFilter .AutoFilter Field:=1, Criteria1:="1" ’■Fieldが1ずつ増えていく Range("AA3").Copy Range("Z3") ’■AA3が1列ずつ右へずれていく .CurrentRegion.Copy Sheets("貼付").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) Range("A3").AutoFilter Range("AA3:EK3").AutoFilter .AutoFilter Field:=2, Criteria1:="1" Range("AB3").Copy Range("Z3") .CurrentRegion.Copy Sheets("貼付").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) Range("A3").AutoFilter ~~~~~~~~~~~~ 115列分のデータがあり 下記まで同じようにつづきます ~~~~~~~~~~~~ Range("AA3:EK3").AutoFilter .AutoFilter Field:=115, Criteria1:="1" Range("ek3").Copy Range("Z3") .CurrentRegion.Copy Sheets("貼付").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0) Range("A3").AutoFilter End With Application.ScreenUpdating = True Sheets("貼付").Activate Cells.Columns.AutoFit End Sub ■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■

  • エクセルVBA オートフィルタの選択を元に戻す

    エクセルのVBAで、次のことはできるでしょうか。 ブックの中の3つのシートはオートフィルタが設定してあり、任意で操作し、検索に使っています。(オートフィルタを設定しないしーとが2つあります) ・別のシートにチェンジしたら、チェンジ前のシートがオートフィルタで特定の行だけを表示していたら、オートフィルタを <すべて> に戻して、消えていた行を全て表示させたいのです。(オートフィルタは次回にまた使うので、データ-フィルタ-オートフィルタでオートフィルタ自体を解除してしまうような状態にはしたくありません) ・同じく、上記のことをブックを閉じるときにも実行したいのです。 ちなみに、オートフィルタをかけてあるシートには、以下のコードがあります。 よろしくお願いします。 Private Sub Worksheet_BeforeRightClick(ByVal Target As Range, Cancel As Boolean) With Sheets("印刷") .Range("E15:E17").Value = _ Application.Transpose(Cells(Target.Row, 7).Resize(, 3).Value) .Range("AA16").Value = _ Cells(Target.Row, 10).Value .Range("AQ16").Value = _ Cells(Target.Row, 11).Value .Range("AX16").Value = _ Cells(Target.Row, 12).Value End With With Sheets("施設") .Range("C2").Value = _ Cells(Target.Row, 10).Value End With Cancel = True Sheets("施設").Select End Sub

  • オートフィルタで未入力(空白)を無視した抽出法

    いつもお世話になっております。 現在第一条件から第三条件までの入力フォームを作成し、その条件に基づいたオートフィルタを作成中なのですが、 第二条件以下に未入力の場合のオートフィルタができなくて困っています。 これら未入力(空白)でもきちんと抽出できるオートフィルタを作るにはどうしたら良いですか? 以下に私が作成したものを転記いたしますので、どなたかご教示くださいますよう、お願いいたします。 With Worksheets("業種別検索") myCriteria1 = .Range("a2").Value myCriteria2 = .Range("b2").Value      myCriteria3 = .Range("c2").Value End With With Worksheets("元データ") If Worksheets("元データ").AutoFilterMode = False Then Range("A6:z6").Select Selection.AutoFilter Else Sheets("元データ").Select Selection.AutoFilter Range("A6:z6").Select Selection.AutoFilter End If .Range("A1").CurrentRegion.AutoFilter 17, myCriteria1, xlAnd .Range("A1").CurrentRegion.AutoFilter 18, myCriteria2, xlAnd .Range("A1").CurrentRegion.AutoFilter 19, myCriteria3, xlAnd End With

  • コードへ追記したら、特定のシートしか実行できません!

    Windows XP Home Edition Excel 2002 http://oshiete1.goo.ne.jp/qa4952620.html​ 以前に、ご教授頂いたコードに少し追記して、しばらく問題なく使用していましたが、 本日、同ブックの他のシートで実行しましたら、無反応で、セルに色が付きません(エラーではありません)。 何度も行ってみましたが同じ結果です。 但し、'★部分「Offset(-1, 0)」の2箇所を削除して実行するとセルに色が付き、問題なく実行できます。 ちなみに、実行できないシートは、1行全部にオートフィルタ(▼)がかかってしまいます。 私は、いつもEntireRowにてオートフィルタ(▼)をかけております。 しかし、10列ぐらいだけにオートフィルタ(▼)をかけて、実行しても結果は、無反応で、セルに色が付きません。 問題なく実行できるシートでは、EntireRowにてオートフィルタ(▼)をかけても、データのある列までしか オートフィルタ(▼)がかかりません。 このコードは、どんなシートでも実行できると思っていたのですが、 特定のシートでしか実行できないのでしょうか? 原因がわかりません。 よろしくお願い致します。 ------------ 'SheetModule Option Explicit Sub Worksheet_Calculate()   Static r As Range   Dim f As Filter   Dim i As Long   On Error GoTo errHndler   With ActiveSheet    If .AutoFilterMode Then      With .AutoFilter         If r Is Nothing Then Set r = .Range.Rows(1)         For Each f In .Filters           i = i + 1                 '★           r.Cells(i).Offset(-1, 0).Interior.ColorIndex = IIf(f.On, 33, xlNone)         '33()が、識別用 ColorIndex。任意で。         Next f       End With      Else                     '★       If Not r Is Nothing Then r.Offset(-1, 0).Interior.ColorIndex = xlNone       Set r = Nothing      End If   End With errHndler:  If Err.Number <> 0 Then MsgBox Err.Number & ":" & Err.Description End Sub

  • マクロを実行するとフリーズしてしまう。

    マクロを実行するとフリーズしてしまいます。 パソコンが原因なのでしょうか? マクロは Sub 抽出() ' '「貼り付け」シートを'一度全てクリアする Sheets("貼り付け").Select Cells.Select Selection.Clear '「元」シートを選択 Sheets("元").Select 'フィルタかけなおし Rows("1:1").Select Selection.AutoFilter Selection.AutoFilter '’抽出前「*」選択 Selection.AutoFilter Field:=1, Criteria1:="~*" '全て選択してコピー Cells.Select Application.CutCopyMode = False Selection.Copy '「元」を貼り付ける Sheets("貼り付け").Select Cells.Select ActiveSheet.Paste 'フォントを「9」 With Selection.Font .Size = 9 End With End Sub です。 パソコンのスペックは celeron&reg; cpu3.20GHz 3.19GHz 1GB RAM です。 最近VBAを覚え始めたばかりな者です。 仕事のデータではもっと複雑なマクロを実行していてもパソコンはなんともないので マクロに原因があるのではなくパソコンに原因があるのでしょうか? (上記のマクロを実行しているのは自宅のPCです) よろしくお願いします。

  • コンボボックスとオートフィルタの連動

    データの件数が増えてきたので、コンボボックスで選択した項目を一発で表示させるマクロを組みたいと思います。 前提は以下の通りです。 Webからの受け売りというか、書かれていた通りにやってみたのですが動作しません。どこが間違っているのでしょうか。 また、他にも方法があるようでしたらお知恵をお貸し下さい。 +++ マクロを実行させたいシートにはA3からK3までの項目があります。 そのうち、B3の項目でフィルタをかけたいです。 1.マクロを実行するシートとは別に「マスター」というシートを作成。 そこにコンボボックスにリンクさせる項目を入力。(A3:A16) セルC1にINDEX関数を置き、(A3:A16)のそれぞれの値を文字に変換。 2.その変換した文字を変数に格納 3.もし、空白を選択してしまったら、マクロから抜ける 4.オートフィルタのセットは、既にセットされていたら一旦解除し再度セット。 5.変数に格納した文字をキーにして、オートフィルタで抽出する。 +++ Sub Combo_AutoFilter() Application.ScreenUpdating = False '変数宣言 Dim 選択項目 As Variant Dim 実行シート名 As Variant '現在のシート名の格納 実行シート名 = ActiveSheet.Name '選択項目の格納 Sheets("マスター").Select 選択項目 = Cells(1, 3) If 選択項目 = Empty Then Sheets(実行シート名).Select Exit Sub End If 'オートフィルタのセット Sheets(実行シート名).Select If ActiveSheet.AutoFilterMode = True Then Selection.AutoFilter Range("A3:K3").Select Selection.AutoFilter Else Range("A3:K3").Select Selection.AutoFilter End If 'オートフィルターで選択 Selection.AutoFilter Field:=2, Criteria1:=選択項目 Range("A3").Select End Sub +++

  • excel;マクロ;表現をもっと縮小したい

    質問します。下記のようなモジュールで中に同様の数字のみが順に変わるブロック繰り返しが多数あるのですが、もっと簡略化した表現 が可能でしょうか。よろしくお願いします。 Sub usb_count() d = Range("A65536").End(xlUp).Row j = 3 For i = 2 To d Select Case Cells(i, "B") Case Sheets("sheet2").Cells(4, "A") Sheets("sheet2").Cells(4, "B").Value = Sheets("sheet2").Cells(4, "B").Value + 1 If Cells(i, "K").Value = "USB" Then Sheets("sheet2").Cells(4, "C").Value = Sheets("sheet2").Cells(4, "C").Value + 1 Else Sheets("sheet2").Cells(4, "D").Value = Sheets("sheet2").Cells(4, "D").Value + 1 ' End If ‘------------------------------------------------------------------------------------------------------------------------------------ Case Sheets("sheet2").Cells(5, "A") Sheets("sheet2").Cells(5, "B").Value = Sheets("sheet2").Cells(5, "B").Value + 1 If Cells(i, "K").Value = "USB" Then Sheets("sheet2").Cells(5, "C").Value = Sheets("sheet2").Cells(5, "C").Value + 1 Else Sheets("sheet2").Cells(5, "D").Value = Sheets("sheet2").Cells(5, "D").Value + 1 End If ‘----------------------------------------- ‘以下上記の‘-----------から‘-----------で囲まれたブロックが( )内の数字が6から20まで繰り返され続く が略す End Select Next i End Su

専門家に質問してみよう