• 締切済み

エクセル マクロ超初心者です。仕事に使用したくて、数日前から初めたばか

エクセル マクロ超初心者です。仕事に使用したくて、数日前から初めたばかりです。 下記の作業の部分がうまくいきません。どう変えたらいいのか教えてください。 【作業】 数列が入力されている列(M列)で、オートフィルタのオプション機能で、100以上・-100以下のもののみ選択し、該当したもののP列に〇と入力する作業です。 【コード】 (新しいマクロの記録から、実際に作業をして記録させたところ下記のようになりました) Selection.AutoFilter Field:=13, Criteria1:=">=100", Operator:=xlOr, _ Criteria2:="<=-100" Range("P5").Select Application.CutCopyMode = False ActiveCell.FormulaR1C1 = "○" Range("P5").Select Selection.FillDown ActiveSheet.ShowAllData

みんなの回答

  • mitarashi
  • ベストアンサー率59% (574/965)
回答No.5

ご質問のコードからは離れますが、似たような事をやっていますので、ご参考まで。 http://okwave.jp/qa/q5694462.html

  • hallo-2007
  • ベストアンサー率41% (888/2115)
回答No.4

質問の内容だけでしたら上記の様なコードでも良いと思いますが もし、マクロを実行後に M列の値が 100以上・-100以下 から変更され オートフィルタに 対象外に値になった場合はどうでしょう。 仮に M2に200が入っている 1、マクロを実行して P2列に ○が入る 2、M列の値が 変更されて 90になった 3、再度マクロを実行した場合 P2に ○が残ったまま になりませんか? また データが減ってしまった場合もあります。 経験をつまないとわからないことがたくさんありますが システムとして考えられる色々なエラーや将来に対してフォローできる準備をしておくのも 大事なことです。 上記のコードを続行する前に P列を クリアーするコードを追加してみてください。 それと オートフィルタは 結構処理が重いですよね、データの量によっては結構時間がかかると思います。 ここはシンプルに Sub ボタン1_Click() Range("P2:P" & ActiveSheet.UsedRange.Rows.Count).Select Selection.ClearContents Selection.FormulaR1C1 = "=IF(OR(RC[-3]<=-100,RC[-3]>=100),""○"","""")" End Sub コードの流れは P2セルから データの入っている最後の行までの範囲を選択 選択した範囲を クリアー 選択した範囲に IF文の関数を入れる。 必要でしたら 関数式で得られた結果を 値に変更します。 関数式のままですので M列の値が変更されても マクロを実行しなくても結果がP列に反映します。 データの量が増えたり減っりした場合に マクロを実行する必要があります。

iamyma
質問者

お礼

シンプル且つ適確なアドバイスありがとうございます。 「将来に対してフォローできる準備」というのは、ごもっともですね。 勉強になりました。

  • rukuku
  • ベストアンサー率42% (401/933)
回答No.3

こんばんは フィルタを使わなくても、関数で出来ます。 P2に =IF(OR(M2<=-100,M2>=100),"○","") 以下、オートフィルです。 手順は以下のようにします。  1.P2に数式を入力  2.キーボードのCtrl+Shiftを押した状態で↓を押す  3.Ctrlを押した状態でDを押す。 P列に関数を残したくない場合には、オートフィルの後、  1.P列を選択  2.コピー  3.編集-形式を指定して貼り付け-値 の手順を行います。 これらを「マクロの記録」で記録したのが以下のマクロです。 Sub Macro1() ' ' Macro1 Macro ' マクロ記録日 : 2010/11/3 ユーザー名 : rukuku ' ' Range("P2").Select ActiveCell.FormulaR1C1 = "=IF(OR(RC[-3]<=-100,RC[-3]>=100),""○"","""")" Range(Selection, Selection.End(xlDown)).Select Selection.FillDown Selection.Copy Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _ False, Transpose:=False End Sub

iamyma
質問者

お礼

丁寧にご回答いただきありがとうございます。 大変分かりやすくて勉強になりました。 恥ずかしながら、IF関数ですら自分では思いつかないレベルですが、今回のご回答をヒントに、他の所でもIF関数を応用できました。ありがとうございます。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.2

この問題は結構VBAの経験が要るはずだ。自力ではしばらくは無理だろう。 1セルづつ、セルの数が範囲内かIF文で聞いて、、該当すればその行に○を入れる、方法なら習得は早いと思う。 例データ B-D列 D列は実行結果。 C列は入れただけ。意味無し。 B1:D17 B列  C列   D列 計数 101 a ○ 20 b 233 c ○ 40 d 503 e ○ 53 f ○ 302 g ○ 100 h ○ 7 j 41 d ○ 100 e ○ 7 f 41 g ○ 53 h ○ 30 j 100 x ○ ーーー Sub test01() AutoFilterMode = False d = Range("B65000").End(xlUp).Row Range("B2:B" & d).Select Selection.AutoFilter Selection.AutoFilter Field:=1, Criteria1:=">40" Selection.SpecialCells(xlCellTypeVisible).Select Selection.Offset(0, 2) = "○" ActiveSheet.ShowAllData Selection.AutoFilter AutoFilterMode = False End Sub ーーー B列でオートフィルタをかけている。 条件は40以上にしている。 ○はB列から2列離れたD列に(「該当行に)セットしている。Offset(0, 2) = "○"の部分。 Selection.SpecialCells(xlCellTypeVisible).Select の行がコードを簡潔するキモ。 質問の場合と列や条件地で少し違うので、類推力を働かせて修正してください。

iamyma
質問者

お礼

ご回答ありがとうございます。オートフィルタを使うと少し難しくなるんですね。 もっと勉強しようと思います。

  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.1

こんばんは! オートフィルタのVBAでないので参考にならなかったら無視してください。 結果的には同じになると思います。 データは2行目からあるとしています。 操作したいSheet見出し上で右クリック → コードの表示 表示された画面に↓のコードをコピー&ペーストしてマクロを実行してみてください。 尚、一旦マクロを実行すると元に戻せませんので、別Sheetにコピーしてマクロを試してみてください。 Sub test() Dim i As Long For i = 2 To Cells(Rows.Count, 13).End(xlUp).Row If Cells(i, 13) >= 100 Or Cells(i, 13) <= -100 Then Cells(i, 16) = "○" End If Next i End Sub M列を上から検索し、100以上、または-100以下であればその行のP列に「○」を表示するようにしてみました。

iamyma
質問者

お礼

ありがとうございます!できました♪ オートフィルタでなくとも全然よかったので、分かりやすくて助かりました。

関連するQ&A