- ベストアンサー
Excel、VBAのIF文で
いつもお世話になります。 エクセルのVBAでセルF4からF65536までを選択していれば印刷して、それ以外を選択していれば「氏名セルを選択してください」と表示させたいのですが、うまくいきません。 全く構文かもしれませんが以下が作成したプロシージャです。VB初心者です。ご指導よろしくお願いします。 Sub 成績個人印刷if() If Range("f5,f65536").Activate = True Then Worksheets("個人カード").Range("a3").Value = ActiveCell.Offset(0, -4) Worksheets("個人カード").PrintOut End If MsgBox "氏名セルを選択してください" End Sub
- みんなの回答 (8)
- 専門家の回答
質問者が選んだベストアンサー
複数セルを選ばれた時にも対応しようと思ったら これ Sub Macro3() For jj = 1 To Selection.Areas.Count Set aaa = Selection.Areas(jj) For ii = 1 To aaa.Count If aaa(ii).Column = aaa(1).Column Then If aaa(ii).Row > 3 And Cells(aaa(ii).Row, 2) <> "" Then Worksheets("個人カード").Range("a3").Value = Cells(aaa(ii).Row, 2) MsgBox "印刷" & Cells(aaa(ii).Row, 2) 'Worksheets("個人カード").PrintOut Else MsgBox "えらーー" End If End If Next Next End Sub
その他の回答 (7)
- deecyan
- ベストアンサー率38% (89/233)
質問の答えとしたら ↓だけど Sub Macro1() If ActiveCell.Row > 3 And ActiveCell.Column = 6 Then Worksheets("個人カード").Range("a3").Value = Cells(ActiveCell.Row, 2) '選ばれた行のB列を A3に入れる ' MsgBox "印刷" & Cells(ActiveCell.Row, 2) Worksheets("個人カード").PrintOut Else MsgBox "えらーー" End If End Sub 要は選ばれた行のB列を 個人カードの[A3]セルに入れて印刷すればいいのですよね (選ぶのはF列でなくてB列、C列どれでもいいのでは??) それと 選ばれたB列がブランクだったらエラーにしたほうがいいと思うけど 私なら 上の If ActiveCell.Row > 3 And ActiveCell.Column = 6 Then を If ActiveCell.Row > 3 And Cells(ActiveCell.Row, 2) <> "" Then に変更するけど
- tuji3
- ベストアンサー率42% (6/14)
名前が入力されているセルが、セルF4から下方向にあるとすれば、F列の最終セルF65536まで調べる必要が無いのではないでしょうか。 全ての名前の入力されている範囲を選択する必要がある理由は私にはわかりませんが、そうしたい場合はこの名前の範囲に名前を付けて、(例えば、F4:F100とすると、この範囲を選択しておき、名前ボックスへShimeiと入力しておきます。) コードでの判定は以下のようにすることで判定できます。 If Selection.Address = .Range("Shimei").Address Then
- tuji3
- ベストアンサー率42% (6/14)
>セルF4からF65536までを選択していれば印刷して、 >それ以外を選択していれば「氏名セルを選択してください 質問では選択範囲が、F4:F65536となっていますが、示されたコードではF5:F65536となっています。どちらにしてもどのセル範囲が選択されているかが重要です。なぜなら、指定の選択範囲以外を選択している場合は、「氏名セルを選択してください」と表示させるわけですから、氏名セル範囲がF5:F65536と同じだからです。 もう少し、運用手順を整理してみて下さい。
- tuji3
- ベストアンサー率42% (6/14)
以下のような考えでいかがでしょうか。 Sub 成績個人印刷if() With Worksheets("個人カード") If Selection.Address = "$F$5:$F$65536" Then .Range("a3").Value = ActiveCell.Offset(0, -4) .PrintOut Else MsgBox "氏名セルを選択してください" Exit Sub End If End With End Sub
補足
回答有難うございます。 やってみましたが、F5~F65536を選択していても 「氏名セルを選択してください」とMsgboxが出てしまいます。
- taocat
- ベストアンサー率61% (191/310)
運用上の問題でちょっと気になったので老婆心から一言。 F4-F65536 を選択する方法はどうしてますか? F4-F65536といえば殆どF列を選択してるのと同じですよね。 なら、列番号クリックでF列まるごと選択をした方が良さそうな気もしますが。 IF Selection.Address = "$F:$F" Then 以上。
- maruru01
- ベストアンサー率51% (1179/2272)
No.1です。 >F4以降のセルをアクティブにしていてもすべて、メッセージボックスが出てきます。 メッセージボックスは当然、必ず出ますよ、質問欄のような書き方では。 Ifの分岐と、メッセージボックスのコードとは無関係ですから。 (単にIf文の後に、MsgBoxの文があるだけ) (ついでに、If文の中を実行しても、Subプロシージャ自体が終了するなんて記述はどこにもありませんし。) Ifの条件が偽の場合にメッセージボックスをだすのなら、Else句に入れないとダメでしょう。 If Selection.Address = "$F$4:$F$65536" Then Worksheets("個人カード").Range("a3").Value = ActiveCell.Offset(0, -4) Worksheets("個人カード").PrintOut Else MsgBox "氏名セルを選択してください" End If
- maruru01
- ベストアンサー率51% (1179/2272)
こんにちは。maruru01です。 まず、Activateはメソッド(操作)です。 つまり「○○というセルをアクティブにする」という操作が「True」だったら、なんていう書き方はおかしいです。 しかし、そもそもアクティブなセルは必ず1つしかありません。 選択は、Selectです。 選択されたセル範囲は、Selectionで取得出来ます。 この範囲のアドレスは、Addressプロパティで取得出来ます。 従って、 If Selection.Address = "$F$4:$F$65536" Then という風にします。 しかし、その選択範囲のどれがアクティブセルかは、不明ですよ。 (アクティブセルというのは、選択範囲内で、反転表示されているセルのことです。) したがって、質問欄のコードだと、F列(の4つ左)のどのセルの値が、[個人カード]シートのA3セルに入るかは、その時次第になりますよ。
補足
早速の回答ありがとうございます。 If以降を入れ替えると今度はF4以降のセルをアクティブにしていてもすべて、メッセージボックスが出てきます。 根本的におかしいのでしょうか?
補足
すみません。コードがF4からです。 F4から下に各氏名が入っていてそこを選択していなければ印刷ができないというようなものを作成したいのです。 今ですと氏名が入っているところでもそれ以外でもすべて「氏名セルを・・・」のメッセージが表示されてしまいます。 質問、補足つたなくて申し訳ありませんがよろしくお願いします。