• ベストアンサー

「ComboBox」が「comboBox」になる

どうでもいいことを聞いてもいいですか? 汗 エクセル2003です。 http://www.cocoaliz.com/excelVBA/index/39/ を参考にシート上のコンボボックスを操作しているのですが なぜ変数のオブジェクト型の部分の「MSForms.comboBox」が 「ComboBox」という風に大文字で始まらないのでしょうか? わざと「c」を大文字の「C」に書き換えても、元に戻ってしまいます。 なのに、MSForms.にして「Crtrl + j」でヒントを出した時は大文字で「ComboBox」となっています。 私だけなのでしょうか? どこかで「comboBox」と宣言してしまったのかと思い探してみましたがありませんでした。 聞かれたときに困るので教えてください。 ご教授よろしくお願い致します。

  • 1wer56
  • お礼率100% (538/538)

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

  • ベストアンサー
  • Wendy02
  • ベストアンサー率57% (3570/6232)
回答No.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サイトのハンガリアン記法についての話は、知りませんでした。それほど厳密なものではないとは思います。

1wer56
質問者

お礼

おお!お詳しいですね。 勉強になりました。

その他の回答 (3)

  • DexMachina
  • ベストアンサー率73% (1287/1744)
回答No.3

> どこかで「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画面で所定の手続きさえすれば  エラーは起きません。

1wer56
質問者

お礼

バグの元になるのですか。納得しました。 そして「Dim ComboBox」にしたら直りました! ありがとうございます。

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

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

1wer56
質問者

お礼

うーん 動きました。

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

こんばんは。 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] で直ります。

1wer56
質問者

お礼

おお!できました! しかしなぜダメなのかよくわかりません 汗

関連するQ&A

  • ComboBox1_Changeについて

    Private Sub ComboBox1_Change() Dim si As Integer With UserForm1 .ComboBox2.Text = "" si = .ComboBox1.ListIndex ' ComboBox1 の何番目が選択されたかを得る Select Case si Case 0 ' 0番が選択されていたらComboBox2 の内容をC列から作成する .ComboBox2.RowSource = "Sheet1!C1" Case 1 .ComboBox2.RowSource = "Sheet1!C2" End Select End With End Sub コンボボックス1で選択された値に対して『Sheet1!C1』が 表示されるようにするには、『.RowSource』の部分に 適切な言語がありますでしょうか。 また、『.RowSource』は、こういう効果がある等 紹介しているサイトをご存知あれば教えてください。 (探してみたのですが、めぐり合えず)

  • Excel ComboBox.List設定

    「フォーム」メニューから配置したコンボボックス(ドロップ1)のリストにマクロから文字列を設定する事ができるでしょうか? 「コントロールツールボックス」メニューから配置するコンボボックス(ComboBox1)は分かります。

  • VBA 引数にcombobox,Range

    おはようございます。 質問内容が明確?で無い点が多いかもしれませんが、 質問させていただきます。 まず、Excel2003を使い、フォーム上にはコンボボックスを置いています。 プロシージャ?の中の引数?として コンボボックスの名前を使いたいと思っています。 Private Sub UserForm_Initialize()  Call TEST(Combobox1,"A1") End sub Sub TEST(Byval ComboboxName,Byval TEST_Range)  ComboboxName.AddItem "A"  TEST_Range="テスト" End Sub 適当に作成してみましたが… TESTを実行したら、 引数にあるコンボボックスに”A"という値を追加し、 TEST_Rangeに"テスト"と入力したいです。 引数として宣言する際、Stringは違うと思うのですが、 どうやって宣言?すれば良いのでしょうか。 上記例では、TESTを実行したら Combobox1に"A"という値が追加され、 A1に"テスト"と入力されるようになっています(それを目的とします) 分からない点がありましたら、どんどん聞いてください。 よろしくお願いします!

  • Excel ユーザーフォームでコンボボックスを使用してデータ入力

    Excelのユーザーフォームでコンボボックスを使用して、シートのデータを表示しています。 コンボボックス:ComboBox1 テキストボックス1-3:TextBox1-3 コンボボックスのRowSource:シート名!A2:C100 コンボボックスの変更時の動作: Me!TextBox1.Value = ComboBox1.Value とここまではできたんですが、テキストボックス2にシートのB列の値を、テキストボックス3にシートのC列の値を入れたいのですが、 どのようにしたらいいのでしょうか?

  • ComboBox1で何を選んだかの情報を標準モジュールで使いたい

    Visual Basic 6 にて簡単なプログラミング中です。 フォームfrmMainでコントロールComboBox1があり、インデックスを3つ持っております。 また、標準モジュールModule1ではある処理Aをさせております。 図示すると、 ----Module1 | --frmMain -- ComboBox1 -- インデックス(赤、青、黄) ComboBox1では3つのインデックスより、赤、青、黄を選びます。 問題点: どれを選んだかの情報をModule1の処理A(Subプロシージャ)の中で取得したいのですが、うまくいきません。 (x=ComboBox1.Textのように取得して、処理の中で(赤、青、黄)どれを選んだかの情報を使いたい) これまでにやったこと: 1.Module1内で宣言無し→エラー発生 2.Module1の処理AでDim ComboBox1 as Controlと宣言→エラー発生 自分自身の予想:どこかで宣言をすればうまくいくのかもしれない??それとも何か別の原因か??本を読むとグローバル変数とかいうのがあるがこれと関係するのだろうか?? よくわからない事(独り言です): ComboBox1からクリックして「コードの表示」を出すと、frmMainに属するコードが出てくるが、Module1で処理させている事をfrmMainに属するコードの中でやらせればよいのか??? VB素人レベルです。どうぞよろしくお願いします。

  • VBAのComboBoxについて

    UserForm1にComboBoxが8個(ComboBox1~8)あります。 各ComboBoxはSheet1の下記列に入力されているリストを表示します。 ComboBox1 : A列 ComboBox2 : B列 ComboBox3 : C列 ComboBox4 : D列 ComboBox5 : E列 ComboBox6 : F列 ComboBox7 : G列 ComboBox8 : H列 ComboBox9 : I列 ComboBox10 : J列 そこで、UserForm1の各ComboBoxでデータ選択する際に、リストにある場合はそれを選択し、リストにない場合はComboBoxに新しいデータを入力し、UserForm1のCommandButton1を押下時にその新しいデータをSheet1の各列に追加したいのですが、どのようにしたらよいのでしょうか。 Sheet1にあるリストをComboBoxに表示するところまではできています。 ※ComboBoxの番号とリストの列番号を一致させています。 --------------------------------------------------------------- Private Sub UserForm_Initialize() Dim lastrw As Integer, retu As Integer, i As Integer For retu = 1 To 10 lastrw = Sheet1.Cells(1, retu).End(xlDown).Row For i = 1 To lastrw - 1 Controls("ComboBox" & retu).AddItem Sheet1.Cells(i + 1, retu).Value Next i Next retu End Sub ---------------------------------------------------------------

  • VBAで作成したComboboxにVBAでマクロを割り当てたい。

    下記コードでcomboboxをつくったのですが 作成されたCombobox1のComboBox1_Changeエベントに 標準モジュール内のSub cal をVBAで割り当てたいのですが可能でしょうか。 コンボボックス作成マクロ x=0 y=0 With Worksheets("Sheet1").OLEObjects.Add(ClassType:="Forms.ComboBox.1", Link:=False, DisplayAsIcon:=False) .Left = X .Top = Y .Width = 53.25 .HEIGHT = 18 .ListFillRange = "AAA" End With これで作成したコンボボックスに標準モジュール内マクロをVBAで割りあてしたい。 標準モジュール sub cal ・ ・ end sub

  • VBA コンボボックスの条件分岐

    コンボボックスの条件分岐のコードが間違っているみたいで 調べても分からなかったので質問します。 やりたいこと 『マスタ』という名前のシート内のセルを参照し マスタシートには C2セル『A』C3セル『B』C4セル『C』と それぞれアルファベットがあります。 そこでコンボボックスを使用し コンボボックス22にC2~C4セルを選択できるようにし 例えばC2セルを選択したら コンボボックス21の参照範囲をマスタシート内の D2~D13セルを選択できるようにし C3セルを選択したら コンボボックス21の参照範囲をマスタシート内の E2~E13セルを選択できるようにしたいのです。 すいませんがコードを記載して頂けますと 助かります。 Private Sub UserForm_Activate() '----------------------- With ComboBox22 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!C2:C4" End With '↑こうすればコンボボックス22のマスタシートのC2からC4まで値を選択できるようになります。 '------------------------わかりやすく区切っています。 '--------------------------------------- If UserForm1.ComboBox22 = "A" Then With ComboBox21 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!D2:D13" End With End If '↑コンボボックス22の値が(C2セルの値がAなら)コンボボックス21をマスタシートのD2からD13までを選択できるようにしたい If UserForm1.ComboBox22 = "B" Then With ComboBox21 .ColumnCount = 2 .ColumnWidths = "90;10" .RowSource = "マスタ!E2:E13" End With End If '↑コンボボックス22の値が(C3セルの値がBなら)コンボボックス21をマスタシートのE2からE13までを選択できるようにしたい '----------------------------------------区切っています。 End Sub

  • ExcelVBAコンボボックスの値の入力

    ExcelVBAでマルチページでユーザーフォームを作っています。 マルチページを作製しているシートのシート2とシート3にそれぞれコンボボックスに当てはめる値を入れてあります。 コンボボックス1には「シート2のA2から最後」まで。 コンボボックス2には「シート3のA1から最後」まで。 というように設定してあります。 コードの記述としてはこんな感じでしました。 Private Sub ComboBox1_DropButtonClick() Dim i As Integer Dim lastRow As Integer lastRow = Cells(Row.Count, 1).End(xlUp).Row With ComboBox1 For i = 2 To lastRow If ComboBox1 = "" Then .AddItem Worksheets("Sheet2").Cells(i, 1).Value End If Next i End With End Sub これはコンボボックス1の場合なのですが、2は一部を変えています。 コンボボックスを選択時にシートに記載してある内容は表示されるのですが、行が多い方に引っ張られる感じになっています。 コンボボックス1の方は今のところ30行ちょっとなので、その分のデータが表示されます。コンボボックス2の方は今のところ10行程度なので、全てを表示した後に空白が表示されています。見た感じで、シート3のデータと空白分を合わせて、シート2つまりは、コンボボックス1と同じ分だけ表示しようとしているみたいなのです。 よく分からないエラーなのですが、これを回避する方法はありますでしょうか?

  • エクセルVBA 別シートからのコンボボックス連動

    エクセルVBA 別シートからのコンボボックス連動について Book1(多人数入力用ブック) ・入力シート ・データ用シート Book2(反映用ブック) ・シート1 Book1にコンボボックスが2列 テキストボックスが2列 * 6行のユーザーフォームを作成しました。 コンボボックス1 コンボボックス2 テキストボックス1 テキストボックス2 コンボボックス3 コンボボックス4 テキストボックス3 テキストボックス4 ・ ・ ・ 左のコンボボックスで「あ」が選ばれたときには、右のコンボボックスで「あ行の顧客」・・・というように連動させたいと考えております。 データ用シートのデータは、   A      B          C 1 あ あ行で始まる顧客 か行で始まる顧客 2 か 3 さ 4 た 5 な 6 Private Sub UserForm_Initialize() Dim c As Range ComboBox1.RowSource = "データ用シート!A1:A9" End Sub Private Sub ComboBox1_Change() 'Dim Rng As Range 'Dim i As Long i = ComboBox1.ListIndex If i > -1 Then Dim c As Range Set Sh = Worksheets("データ用シート") Set Rng = Worksheets("データ用シート").Range("B2:I30") ComboBox2.Value = "" ComboBox2.RowSource = Rng.Columns(i + 1).Address End If End Sub 上記コードですと、コンボボックス2が入力シートのデータを表示してしまいうまくいきません。 欲をいえば、 Book1(多人数入力用ブック)入力シートの特定セルに コンボボックス2・テキストボックス1 コンボボックス4・テキストボックス3というように続けて1セルに反映 Book2(反映用ブック)シート1に コンボボックス2・テキストボックス1・テキストボックス2 を各1セル 1行に反映させたいと考えております。 まったく知識がないのですが 仕事上どうしても必要となったので、各種サイトを見よう見真似でやっております。 ご助力いただければ幸いです。

専門家に質問してみよう