こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

作成したVBAの改善点をお願いします(初心者)。

こんばんは。VBAを勉強中ですが、参考書等を見ながら簡単なプログラムを作ってみましたが、もっと簡単な記述やベテランの方から見た改善点等があれば教えていただければと思います。(EXCEL2000を使用しています)。

★内容
・inputboxを使用し印刷枚数を入力し、印刷するものです(印刷枚数は1枚以上31枚以下)。
・(K23)のセルには通し番号が入っており、印刷した枚数分だけ通し番号に1ずつ足していく。



Sub 印刷()
Dim aaa As Integer

aaa = InputBox("印刷枚数を入力してください", "印刷枚数", "")
If 1 <= aaa And aaa <= 31 Then
MsgBox "印刷を開始します"
ElseIf aaa = "" Then
MsgBox "キャンセルされました"
ElseIf IsNumeric(aaa) = False Then
MsgBox "入力内容が違います"
ElseIf aaa <= 31 Then
MsgBox "31日までの範囲で入力してください"
Else

For i = 0 To aaa
Worksheets(1).PrintOut
Worksheets(1).Range("k23").Value = Range("k23") + 1
Next i

End If
End Sub

一応、動きますが、勉強中なのでご教授をお願いいたします。

投稿日時 - 2012-02-14 18:29:30

QNo.7305105

困ってます

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

1.>一応、動きますが、勉強中なのでご教授をお願いいたします
本当にエラーが起きずに動いたのかどうか疑問、コピーして動かしたらエラーが起きた
inputbox 使うなら文字列で受けてすべての条件をチェックした方が良いと思う

2. If ElseIf は乱用しないほうがベター、プログラムを修正してると時々わからなくなる
異論もあるかもしれないが If 文は
If
Else
End If
程度に抑えたほうが後々楽です

Select Case 使ったほうがプログラムが読みやすい

投稿日時 - 2012-02-14 19:12:35

お礼

さっそくのご回答ありがとうございました。
なかなか周辺に質問できる環境がないので、非常に参考になりました。
Select Case についても参考書にあるので勉強していきたいと思います。

またよろしくお願いします。

投稿日時 - 2012-02-14 21:16:06

ANo.1

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

回答(3)

ANo.3

きちんと作動しているとは思えないですが、一応アドバイスとして
ElseIf aaa <= 31 Then
MsgBox "31日までの範囲で入力してください"
な、本当にご希望ですか?
<=が逆では?

別案ですが、
InputBoxは、必ず 文字列を返してきます。
似たような関数で
Application.InputBox
で試してみてください。
機能が増えていて、Typeが指定できます。詳しくはWebで検索してみてください。
Type:=1 は数値しか入力できない様に指定しています。

それを利用すると

aaa = 0
aaa = Application.InputBox(Prompt:="印刷枚数を入力してください", Title:="印刷枚数", Default:="", Type:=1)

If aaa > 31 Or aaa < 1 Then
MsgBox "1~31日までの範囲で入力してください"
Else
MsgBox "印刷を開始します"
For i = 1 To aaa
Worksheets(1).PrintOut
Worksheets(1).Range("k23").Value = Range("k23") + 1
Next i
End If

では十分ではないでしょうか。
aaa = 0
は。メッセージボックスで キャンセルを押されたときの為に おいておきました。

For i = 0 To aaa
もご希望かどうかわかりませんが
For i = 1 To aaa
にしておきました。

投稿日時 - 2012-02-14 21:16:30

お礼

ご回答ありがとうございます。
期待通りのご回答に感謝しています。

またよろしくお願いいたします(^^♪

投稿日時 - 2012-02-14 21:27:46

ANo.2

(1)>If 1 <= aaa And aaa <= 31 Then
はおかしくないですか?
(2)Inputbox  の応答で、とらえられるデータは、文字列の数字ではないですか?
数値化(Val関数で)して比較すべきでは?
(3)私もSelect Caseを使うのを勧めます。
ElseIfの連続はわかりにくい。
(4)こういう勉強も良いが、インプトチェックなどより、もっとエクセルを使う(データを・データで処理する)ことを中心にすえた
勉強をしたほうが良いのでは。こんな程度の質問を連発しても、余りエクセルVBAの中の課題に入っていないと思う。
VBAらしいのは、Worksheets(1).PrintOutと次行だけ。
ーー
VBAの本を買ってきて、例題をその通り自分でもやってみて、勉強すべきでしょう。
まだこんな質問コーナーに、質問を出すレベルではないのでは。

投稿日時 - 2012-02-14 20:37:41

お礼

早速のご回答ありがとうございました。

なかなか参考書を勉強しても、難しいですね・・・!
確かに、自分で見てもWorksheets(1).PrintOutと次に行はvbaらしくなっていると、
いまさらながら思いました(^^)

またよろしくお願いします。

投稿日時 - 2012-02-14 21:19:10

あなたにオススメの質問