• ベストアンサー

ExcelVBAの変数を使うコツ

matyuといいます。よろしくお願い致します。 基本的な部分の質問です。 VBAでプログラムを考える際に変数を使うタイミングは非常に多いと思いますが、 どういうタイミングでどういう部分を変数として扱えばいいか分からなくて困っています。 添付したファイルのような問題があったとします。 この問題では、日給の部分を"kyuyo"として宣言していますが、 私が考えると曜日も平日と休日で変化するし、時給も1000円と1200円、勤務時間も何が入るか分からないな・・・となってしまい、いくつもいくつも変数にしようとして結果答えと違ってしまいます。 どこに着目して必要最小限の変数宣言ですっきりしたプロシージャーを書くようにしたらよいのでしょうか? 私が考えるに、最終的に導きだされなくてはならないのは"日給(kyuyo)"だからという考え方でいいのでしょうか 【問題】 セル【C16】に曜日として「平日」「休日」を、【D16】に勤務時間を入力してプロシージャを実行すると、日給をセル【E16】に表示する「練習1」プロシージャを作成しましょう。 また、勤務時間が空欄の場合はセル【E16】に「休み」と表示されるようにします。 【この問題の回答】 Sub 練習1() Dim kyuyo As Currency If Range("D16").Value = "" Then Range("E16").Value = "休み" Else If Range("C16").Value = "平日" Then kyuyo = 1000 * Range("D16").Value Range("E16").Value = kyuyo ElseIf Range("C16").Value = "休日" Then kyuyo = 1200 * Range("D16").Value Range("E16").Value = kyuyo End If End If End Sub

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

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

こんにちは。 >【この問題の回答】 >どこに着目して必要最小限の変数宣言ですっきりしたプロシージャーを書くようにしたらよいのでしょうか? 練習問題で、そのような必要はないと思います。だいたい、そのようなコード自体は練習用としてか存在しませんし、VBAとしては成立しているとはいえません。そういうことを考えていると、上達しません。 あえて書くなら、以下のようなことだと思います。時間を、整数で入れないなら、ある意味では、Currency 型は必要かもしれませんが、Currency型がなぜ必要かなんていうのを、このレベルのコードで持ち出すことは、私は、あまり関心しません。 Private Sub CommandButton1_Click()   If Range("D16").Value = "" Then     Range("E16").Value = "休日"     Exit Sub   End If      If Range("C16").Value = "平日" Then     Range("E16").Value = 1000 * Range("D16").Value   ElseIf Range("C16").Value = "休日" Then     Range("E16").Value = 1200 * Range("D16").Value   End If End Sub 通常は、1000円,1200円は、定数(Const)を置いたりしますが、初心者の方は、名前--登録を使って行うことが多いようです。ただ、後者はトラブルが想定されますのでお勧めいたしません。 p.s. 「FOM出版よくわかるExcel2003マクロ/VBA」 私自身、FOMで最初にVBAを覚えようとしましたが、導入部分から、混乱させるようなものが多く、実際に、今の私から見ると、そのようなコードはありえないという内容があります。入門レベルで癖というか懲りすぎているのです。この著者は、VBAをあまり詳しくないのではないかなって思うことがあります。教える側は、我慢しなければならないわけで、自分がいつも書いているコードをそのまま提示してはいけないのです。 ですから、このテキストはお勧めしません。ここのカテゴリでいくつかお勧めの本が出ているはずですから、それを参考にしてもよいと思います。ただ、いずれにしても、入門レベルであれこれ複線を考えることは、上達にはマイナスになります。 VBAは、短いフレーズをいくつも覚えることです。 なお、入門レベルで、こういう書き方はありえないです。 >Else >If Range("C16").Value = "平日" Then

matyu0531
質問者

お礼

Wendy02様 回答ありがとうございます。 >入門レベルであれこれ複線を考えることは、上達にはマイナスになります。 >VBAは、短いフレーズをいくつも覚えることです。 上記の件大変に参考になりました。 また、Wendy02さんに書いていただきました記述も初心者が見てもわかりやすいです。 私はこのシリーズを1度に2冊買ってしまい、少々期待しすぎていました。(一応、以前通っていたナガセPCスクールで使っていたテキストがFOMだったのと、amazonのレビューを見て買ったんですが・・・) テキストは良いものを選ばないといけないことを実感しました。 こちらのカテゴリで皆さんが使われている書籍を探してみます。

すると、全ての回答が全文表示されます。

その他の回答 (4)

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

#2の回答者です。 私も 「かんたんプログラミングExcelVBA」 は、お勧めです。大村あつしさんというのは、Moug の主催者です。 やっと、Office 2007 のシリーズ3冊がそろったようですね。ずいぶん時間が掛かりました。このシリーズは、ともかく、内容的に細かいです。同じ出版社から出ているVisual Basic 版と比較すると、倍以上に綿密に書かれていますから、一度ぐらいでは覚えませんね。(値段的にちょっと高いなって思いますが、学校などに教わりに行くと、数万円から十数万円も取られてしまいます。スクールを探しましたが、予算が合いませんでした。)ペースとしては、1ヶ月1冊で、だいたい、3ヶ月で一通り終えるようにします。分からないところは、飛ばしてもよいので、本の章のタイトルぐらいは覚えるようにします。私は、UserForm がすぐに覚えられませんでしたので、後回しにしてしまいました。 Excel VBAの難しさというのは、実は、Excelのワークシートを見ていかなくてはならないということです。VBのプログラマが良く間違えるのは、ワークシートをきちんと認識してコードが書けないからです。Excel独特のVBAコードが存在するのですが、そうではないと思っている人たちも多いようです。逆に、Excel VBA で、VBAは全て通用すると思う人もいるようです。 それと、繰り返しますが、練習問題は、単にこなしていくことにしたほうがよいです。あるレベルになるまでは、結局のところ理解できないことが多いし、応用も利きません。大村さんの著書ですと、応用編の「動的配列」まで達しないと、あまり大したことができないと思ったほうがよいです。それと、VBAのワークシート関数を使うのは、後に回したほうがよいです。1年以上も理解できないものもあります。 明示的に Currency 型変数を使うのは、浮動小数点丸め誤差を防ぐ目的です。それは、\1.000というように、セル上の 「\ マーク付きの値」を、VBAで取り扱うと、Currency 型になります。しかし、練習用で整数を扱うなら、Long 型で十分です。

すると、全ての回答が全文表示されます。
  • rukuku
  • ベストアンサー率42% (401/933)
回答No.4

はじめまして この練習問題の場合、以下のようにすると、変数を一度も使わずにできます。 >私が考えると曜日も平日と休日で変化するし… セルの値も「変数」です。Rangeを使ってセルを参照すればいい場合には、変数に格納する必要はありません。 この問題の応用として17行目以降にもデータが入っていてそれをすべて自動的に計算しようとすると(平日・休日の区分は省略)、 Range("C10").Value が何度も出てきます。このときに Jikyu = Range("C10").Value としておけば、プログラムが少し短くなりますし、分かりやすくなります。 ------------------------------- Sub 練習1() Range("E16").Value = "エラー!" If Range("C16").Value = "平日" Then Range("E16").Value = Range("C10").Value * Range("D16").Value If Range("C16").Value = "休日" Then Range("E16").Value = Range("C11").Value * Range("D16").Value If Range("D16").Value = "" Then Range("E16").Value = "休み" End Sub

matyu0531
質問者

お礼

rukuku様 回答ありがとうございます。 いろいろな記述の仕方があるんですね~ 私の場合まだまだ勉強が足りないため、まだ問題を読んですぐに "型"が頭に浮かぶところまでいっていないようです。 色々なバリエーションの問題をこなす必要がありますね

すると、全ての回答が全文表示されます。
回答No.3

この問に関する直接の回答ではありませんが FOMのExcelやAccessのテキストは分かりやすいと非常に好評でした。 僕も それで教わりました。 FOMのVBAの方に関しては見ていないので何とも言えませんが 僕は「かんたんプログラミングExcelVBA」を全シリーズ買ってしまいました。(通称「かんプロ」) (とりあえず“アマゾン”で3冊全てがトップ10入りしているという事だったので) これが分かりやすいかどうかは まだ分かりません。 例題は あり得ないような例題だったりしていますが、でも非常に丁寧親切に記載されているような気はします。 著者は「大村あつし」という人です。 ある程度 理解されてる方なら「基礎編」は必要ないでしょうから 他の「コントロール・関数編」と「応用編」を購入されてはいかがでしょうか。 (僕もマクロぐらいは知ってましたが基礎編を読んで改めて学んだこともありましたけど) ちなみに変数は3つも4つも あってもOKっぽい気がします。 何かの参考にでもなれば幸いです。

matyu0531
質問者

お礼

ookami1969様 回答ありがとうございます。 そうです!まさにその本を買おうか迷ってFOMの方が実務で使える例題が豊富という謳い文句で(というより、メールでサポートを受けられる的な記述がamazonのレビューあったのもで・・・)買ったのですが、Wendy02様のご意見の通り、少々期待はずれだったような気が進めていいけばいくほど強くなってきました。 手をつけていないFOMの2冊目の実践編をレシートがあるので返品してw、大村あつしさんの書籍と交換してもらおうかと考え中です。 レビューでは非常に評価が高いことは知っていたんですが。。。ん~ 話は変わりますが、やっぱりアクセスもできたほうがいいですよね アクセスはまったく触ったことがない超ど素人なもんで><

すると、全ての回答が全文表示されます。
  • phoenix343
  • ベストアンサー率15% (296/1946)
回答No.1

状況にもよるが、基本的に、主に何に使われているかでokでしょ 私だったら'nikkyu'にするかなあ 'kyuyo'でも通じるけどね それから1000, 1200とじかに数値を書くのではなく セルから取り出した方がいいと思うけど Range("C10").Value

matyu0531
質問者

お礼

phoenix343さん回答ありがとうございます。 私がこのテキスト(FOM出版よくわかるExcel2003マクロ/VBA)をやって感じたことは、 答えって、表現の違いで何通りも存在するんだ。。というところで、 例えば、時給の部分もたまたま2つしかないのでそのまま数字を 使ってますが、じゃぁもっと多かったら変数にするのか? とか、柔軟に対応できる記述なのか?という疑問をもってしまうんです。 ご指摘のとおり時給を"1000"という数値で記述するのではなく、 セルの値?として記述しないと時給が変更されたら記述を全て 書き換えないといけなくなりますよね? ケチをつけるわけではないですが、この入門書は問題と回答(一行一行の意味)が書いてあるだけで、 "どうしてその記述にしてるのか"という部分の解説が非常に少ないと感じました。 (はじめに使った解説書"excelVBAのプログラミングの コツとツボがゼッタイにわかる本"が非常によかったので)

すると、全ての回答が全文表示されます。

関連するQ&A