- ベストアンサー
「ComboBox」が「comboBox」になる
どうでもいいことを聞いてもいいですか? 汗 エクセル2003です。 http://www.cocoaliz.com/excelVBA/index/39/ を参考にシート上のコンボボックスを操作しているのですが なぜ変数のオブジェクト型の部分の「MSForms.comboBox」が 「ComboBox」という風に大文字で始まらないのでしょうか? わざと「c」を大文字の「C」に書き換えても、元に戻ってしまいます。 なのに、MSForms.にして「Crtrl + j」でヒントを出した時は大文字で「ComboBox」となっています。 私だけなのでしょうか? どこかで「comboBox」と宣言してしまったのかと思い探してみましたがありませんでした。 聞かれたときに困るので教えてください。 ご教授よろしくお願い致します。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#1の回答者です。 該当するサイトは、一通り、VBA のコードはすべて読みました。 おそらく、この著者は、VB系が専門の方ではないようです。それでコーディングルールが雑になっているようです。癖があるようですが、それ以上は、私があれこれ言うべき立場ではないので、#1の発言は軽率だったかもしれません。ただ、同じチームや仕事場で、こういうコードを書かれたら、ものすごく迷惑になります。直すにも手間がかかってしまいますし、コードをいじられると嫌な顔をされたり、いちいち理由をいわなくてはならなかったりして、そうした経験によるプライドが邪魔します。 これは、MSDNや、Microsoft 監修やVBA公的団体の認めたVBAの本を読めば、その書き方の許容範囲はわかるはずです。ただし、Microsoft サポートは、専門家が書いたものではないようです。 今のところ、既定の書法が公開されているわけではありませんが、VBAにも、曲がりなりにもコーディングルールというものがあります。それは、今に始まったわけではなく、Office VBA 97時代に、固まったものだと思います。 ・既存のオブジェクト、メソッド、プロパティ、関数と同じ名前の変数名や識別子を使用しないということです。良く見かけるものに、"str" という語があります。これは、確かに、ハンガリアン表記のブレフィックスですが、単独では用いません。理由は、Str という関数があるからです。 また、ユーザーが命名する変数名には、特殊な意味を持つ単語は単独では使わないことです。例えば、NameSpace, Method, DataBase, Wsh, Sql, Word, RegExp どうしても使いたければ、これに、プレフィックスをつけます。例:objWsh, objRegExp,oWord ・現在では、変数やプロシージャ名は、キャメル型ではなく、パスカル型を使用するということになっています。ハンガリアン記法が必ずしも悪いわけではありませんが、私は流行のようなものだと思います。なぜハンガリアン表記の原則が崩れたかというと、VBでは、データ型がLong が、.Net では、Int になりデータ型が移行したので、そこで混乱が生じてしまうからです。汎用型データは、Variant型から、Object 型になりました。 キャメル型とパスカル型は、 例えば、ichirosuzuki → ichiroSuzuki(キャメル型)→IchiroSuzuki(パスカル型) というように表記形式には種類があります。 なお、定数は、ICHIROSUZUKI というように基本的にはすべて大文字にします。ただ、最近では、sICHIROSUZUKI のように、先頭に識別させるためのプレフィックスを小文字で入れるようにしているのも見かけます。 エクセルExcel大事典 VBAマクロ 識別子 命名 プリフィックス サフィックス・・・ http://home.att.ne.jp/zeta/gen/excel/c04p15.htm ここに書かれている内容は変わりつつあるようです。 変数や関数なんかの命名記法 http://blog.webspace.jp/?eid=946 ここのWebサイトのハンガリアン記法についての話は、知りませんでした。それほど厳密なものではないとは思います。
その他の回答 (3)
- DexMachina
- ベストアンサー率73% (1287/1744)
> どこかで「comboBox」と宣言してしまったのかと思い探してみましたが > ありませんでした。 提示URLのコード、 「Dim comboBox As MSForms.comboBox」 ここの宣言の影響です。 この左半分(?)を、「Dim comboBox」から「Dim ComboBox」にすれば、 右半分の「MSForms.comboBox」も「MSForms.ComboBox」と 大文字表記になります。 なお、Wendy02さんも仰っている通り、オブジェクトの型として使用されている 「ComboBox」をそのまま変数として宣言してしまうのは、バグの元になります。 ですので、提示URLのコードを使うにしても、少なくとも変数については 「Dim CB As MSForms.ComboBox」とするなど、別の語句に変えることを お勧めします。 (もっとも、Wendy02さんの提示コードの意味が理解できるなら、コードの まとまりからしても、そちらを使われた方がよいと思います: コンボボックスの表示内容に追加があった場合、そちらなら「Array(~)」 の中にカンマ区切りで追加するだけですむのに対して、 提示URLの方では新たに「~.AddItem ○○」の行追加が必要になる) ※No.2で「MSForms.ComboBox」がエラーになるとありますが、それは 確認の手抜きでしょう。 先にコンボボックスを追加するか、VBE画面で所定の手続きさえすれば エラーは起きません。
お礼
バグの元になるのですか。納得しました。 そして「Dim ComboBox」にしたら直りました! ありがとうございます。
- imogasi
- ベストアンサー率27% (4737/17069)
http://www.cocoaliz.com/excelVBA/index/39/ のコードを貼り付け、実行するとエラーになりますね。動きましたか? Dim comboBox As MSForms.comboBox のところで。 Dim comboBox As Objectなら動きます。Dim comboBox でも。 総称的なAs Objectよりも、さらに具体的書き方があるはずだが小生詳しくない。 ここから先はGoogleででも「vba オブジェクト型」で照会して調べてみてください。非常に基礎的なことに係わるようで難しい。 http://home.att.ne.jp/zeta/gen/excel/c04p16.htm のオブジェクト型。 http://home.att.ne.jp/zeta/gen/excel/c04p44.htm
お礼
うーん 動きました。
- Wendy02
- ベストアンサー率57% (3570/6232)
こんばんは。 http://www.cocoaliz.com/excelVBA/index/39/ 著者には悪いけれども、コードとしては正しくありません。 > Dim comboBox As MSForms.comboBox こんな宣言をしてはいけませんね。 '------------------------------------------- Sub Test1() Dim v As Variant With Worksheets("Sheet1").ComboBox1 .Clear For Each v In Array("AAA", "BBB", "CCC", "DDD") .AddItem v Next End With End Sub '------------------------------------------- comboBox となったら、プローシージャ内で、もう一度正しく宣言しなおしてください。 Dim ComboBox [Return] で直ります。
お礼
おお!できました! しかしなぜダメなのかよくわかりません 汗
お礼
おお!お詳しいですね。 勉強になりました。