Excel2003 VBAリストボックスの作成方法とエラーの解決

このQ&Aのポイント
  • Excel2003のVBAを使用してリストボックスを作成する方法と、実行時に発生するエラーの解決方法について説明します。
  • ExcelのSheet1にリストボックスを追加し、フォームを作成します。フォーム上のテキストボックスに入力したデータをSheet1の一番下に追加する処理を実装しています。
  • エラーの原因はコードの記述ミスによるものであり、特にSheet1上のコマンドボタンを押すと実行されるUserForm_Initializeにおいて、Rangeの指定が不正であるためエラーが発生している可能性があります。
回答を見る
  • ベストアンサー

EXCEL2003 VBA リストボックス

お世話になります。 質問の内容についてですが、 現在VBAの勉強をしながらデータベースを組んでいます。 そこで、次のようなものを作っています。 Sheet1に於いて、     A    B     C 1  追番  名称   個数 2   1   りんご   1個 3   2   みかん  2個 4   3   なし    3個 5   4   なす    5個 というような表があるとします。 そして、VBAでフォームをつくり、TextBox1(名称入力用)、TextBox2(個数入力用)、ListBox1(すでに入力されているもの及び追加分のリスト用)、CommandButton1(入力された「名称」と「個数」をSheet1の表の一番下に追加)、CommandButton2(フォームを閉じる)という構成にしています。 また、Sheet1上にコマンドボタンを作っており、そのボタンを押すとフォームを呼出すようにしています。 流れとしては、既存の表に追加する場合、コマンドボタンを押してフォームを呼出し、テキストボックスに入力した内容をSheet1の一番下に追加する。また、フォーム上のリストボックスでも現在の表の内容を見る事ができる、というものです。 フォームでのコードは以下のようにしています。 Private Sub CommandButton1_Click() If TextBox1.Value = "" Then MsgBox "「名称」は必須項目です。" End If If TextBox2.Value = "" Then MsgBox "「個数」は必須項目です。" End If If TextBox2.Value = "0" Then MsgBox "「個数」に0は登録できません。" End If Lrow = Range("B2").CurrentRegion.Rows.Count Range("B" & Lrow + 1).Value = TextBox1.Value Range("C" & Lrow + 1).Value = TextBox2.Value End Sub Private Sub CommandButton2_Click() Unload UserForm1 End Sub Private Sub UserForm_Initialize() Dim b As Long Dim a() As String ReDim a(1 To 100) UserForm1.ListBox1.ColumnCount = 2 UserForm1.ListBox1.List = Worksheets(Sheet1).Range("B2:C").Value For i = 2 To 104 If Range("B" & i) = "" Then ListBox1.AddItem Range("B" & i).Value ListBox1.AddItem Range("c" & i).Value b = b + 1 a(b) = Range("C" & i).Value End If Next i End Sub このコードでSheet1上のコマンドボタンを押して実行しようとするとエラーが出てしまいます。 エラーの原因は何なのでしょうか? (なお、コマンドボタンのコードは「UserForm1.Show」のみです。 コード自体は本などを読みながら似たようなVBAを使った物を参考にしています。

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

  • ベストアンサー
  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.2

遅れまして申し訳ないです。 ご提示のコードを試してみました。 確かに、 > 「実行時エラー '13':型が一致しません」 そのエラーで止まりますね。 なので、 Sub ボタン1_Click()     UserForm1.Show End Sub からステップインモードで走らせてみました。 すると「VBA中で処理できなかった行」は > UserForm1.ListBox1.List = Worksheets(Sheet1).Range("B2:C").Value ここです。 これが完全VBEでにコピー、質問文作成画面に貼り付けで手を加えていないとすると・・ おかしい点が二つほど。 ワークシートを指定するときは「WorkSheets("Sheet1") シート名を直接」 あるいは「WorkSheets(1) シートの位置で指定」のどちらかでしたね。 つまり、ダブルクォーテーションが抜けていますね。 もうひとつ。 「Range("B2:C")」ってどこのことでしょう? 範囲の終端が抜けていますね。 これを適宜修正してやれば、動くと思いますよ。 (少なくとも当方では動作確認できました。) ついでに、お節介ながら豆知識。 Cells(Rows.Count, 2).End(xlUp).Row  これで、B列の最終行を Cells(1, Columns.Count).End(xlToLeft).Column  これで、1行目の最終列を それぞれ取得できます。 これを利用して、例えば Sub Sample() Dim LRow As Long     LRow = Cells(Rows.Count, 3).End(xlUp).Row     Range("B2:C" & LRow).Select End Sub として動かしてやると、「B2せるからC列の最終行まで」を選択できます。 いろいろな場面で重宝しますから、覚えておくと便利に使えますよ。 今回も使えそうですね。 Private Sub UserForm_Initialize() Dim b As Long Dim a() As String ReDim a(1 To 100) Dim LRow As Long ' 追加 LRow = Cells(Rows.Count, 3).End(xlUp).Row ' 追加 UserForm1.ListBox1.ColumnCount = 2 UserForm1.ListBox1.List = Worksheets("Sheet1").Range("B2:C" & LRow).Value '修正 For i = 2 To LRow ' 修正・・でも、この下は何をしたいコードでしょう? If Range("B" & i) = "" Then ListBox1.AddItem Range("B" & i).Value ListBox1.AddItem Range("c" & i).Value b = b + 1 a(b) = Range("C" & i).Value End If Next i End Sub もうついでですし。 Private Sub CommandButton1_Click() If TextBox1.Value = "" Then MsgBox "「名称」は必須項目です。" End If ~省略~ Range("B" & Lrow + 1).Value = TextBox1.Value Range("C" & Lrow + 1).Value = TextBox2.Value UserForm_Initialize  ' 追加 End Sub してやると、登録したついでにリストボックスを更新してくれますよ。 以上、参考までに。

kinetic7274
質問者

お礼

非常に詳しく説明して頂き助かります。ありがとうございます! 最終列や最終行の選択ができるのは便利ですね。いいことを覚える事ができました。 一応、MSZ006さんの案とtsubuyukiさんの案を複合して、VBAのコードを作成し、思い通りに動く事を確認しました。 本当にありがとうございます。

その他の回答 (2)

  • MSZ006
  • ベストアンサー率38% (390/1011)
回答No.3

まずは、Sheet1上のコマンドボタンのコーディングは「UserForm1.Show」だけではダメだと思います。 1) UserForm1をロード 2) UserForm1上のListBox1にデータをセット 3)UserForm1を表示 という流れです。 UserForm_Initialize()はどこで呼び出されているのでしょうか?これを上記2)で呼ぶのだと思われます。 が、このUserForm_Initialize()にも問題があります。 調整は必要ですが、とりあえずは下記のコードでここまで(シート上のボタンを押すとフォームが現れる)は動くと思います。 Private Sub CommandButton1_Click() Load UserForm1 Call UserForm_Initialize UserForm1.Show End Sub Private Sub UserForm_Initialize() Dim b As Long Dim a() As String ReDim a(1 To 100) UserForm1.ListBox1.ColumnCount = 2 UserForm1.ListBox1.List = Worksheets("Sheet1").Range("B2:C102").Value  'For i = 2 To 104 ' If Worksheets("Sheet1").Range("B" & i) <> "" Then ' UserForm1.ListBox1.AddItem Worksheets("Sheet1").Range("B" & i).Value ' UserForm1.ListBox1.AddItem Worksheets("Sheet1").Range("C" & i).Value ' b = b + 1 ' a(b) = Range("C" & i).Value ' End If 'Next i End Sub 次にUserForm1のほうのコーディングです。 名称と数量の入力チェックをしているのはいいですが、NGのときでも下まで処理が行ってしまうので、NGのときは途中でこの処理から抜け出す必要があります。Exit Subを追加します。 Private Sub CommandButton1_Click() If TextBox1.Value = "" Then MsgBox "名称は必須です" Exit Sub End If If TextBox2.Value = "" Then MsgBox "数量は必須です" Exit Sub End If If TextBox2.Value = "0" Then MsgBox "数量は0はだめ" Exit Sub End If Lrow = Worksheets("sheet1").Range("B2").CurrentRegion.Rows.Count Range("B" & Lrow + 1).Value = TextBox1.Value Range("C" & Lrow + 1).Value = TextBox2.Value '下記2行追加でリストボックスが即時更新されます UserForm1.ListBox1.List = Worksheets("Sheet1").Range("B2:C103").Value DoEvents End Sub Private Sub CommandButton2_Click() Unload UserForm1 End Sub

kinetic7274
質問者

お礼

詳しく説明及び回答ありがとうございます。 NG時にExit subを入れる、というのは盲点でした>< 覚えておきます。 本当はお二方どちらにもベストアンサーを差上げたいのですが、先に回答を頂けた、No.1,2の型にさせて頂きました。 教えていただいたことを忘れずにさらに精進していきます。

  • tsubuyuki
  • ベストアンサー率45% (699/1545)
回答No.1

どのコードの、どの行で、どんなメッセージを吐いて、止まりますか? それによって対処が変わりますよ?

kinetic7274
質問者

補足

申訳ありません。 Sheet1上のコマンドボタンを押すと、 「実行時エラー '13':型が一致しません」 と出ます。 デバックで見てみると、 Sheet1上のコマンドボタンのコードの「UserForm1.Show」の部分で止っています。

関連するQ&A

  • VBA リストボックスについて

    VBA初心者です。どうぞよろしくお願いします。 ユーザーフォームにタブつきのリストボックスを作りたいと思っています。 リストはsheet1の中にあります。   A    B    C    D・・・ 1  NO  品名  売場 2  1  いちご  果物 3  2  みかん  果物 4  3  もも    果物 5  4  ハクサイ 野菜 6  5  キャベツ  野菜 7  6  きゅうり  野菜 8  7 9 果物のタブには、果物の品名が表示される。 1 いちご 2 みかん 3 もも 野菜のタブには、野菜の品名が表示される。 4 ハクサイ 5 キャベツ 6 きゅうり 青果のタブには、果物、野菜が表示される。 1 いちご 2 みかん 3 もも 4 ハクサイ 5 キャベツ 6 きゅうり 本を見ながら格闘しておりますが、きっと的違いで滅茶苦茶なことをしているのだと思います。 どうにも出来ず困っております。どなたか教えていただけないでしょうか。よろしくお願いします。 Private Sub UserForm_Initialize() Dim LastRow As Long Dim i As Integer Dim ListBoxNo As Integer Dim ListBox As Control Dim Listtabu(3) As Long 'タブの数 For i = 1 To 3 Listtabu(i) = 0 Next i Worksheets("sheet1").Activate With Worksheets("sheet1") LastRow = .Range("A65536").End(xlUp).Row For i = 2 To LastRow If Worksheets("sheet1").Range(Cells(i, 3)) = "果物" Then ListBoxNo = 1 Set ListBox = 果物 果物.List = Worksheets("sheet1").Range(Cells(i, 1), Cells(i, 2)).Value End If If Worksheets("sheet1").Range(Cells(i, 3)) = "野菜" Then ListBoxNo = 2 Set ListBox = 野菜 野菜.List = Worksheets("sheet1").Range(Cells(i, 1), Cells(i, 2)).Value End If If Worksheets("sheet1").Range(Cells(i, 3)) = "果物" & "野菜" Then ListBoxNo = 3 Set ListBox = 青果 青果.List = Worksheets("sheet1").Range(Cells(i, 1), Cells(i, 2)).Value End If ListBox.AddItem ListBox.List(Listtabu(LstBxNo), 0) = Worksheets("sheet1").Cells(i, 1).Value ListBox.List(Listtabu(LstBxNo), 1) = Worksheets("sheet1").Cells(i, 2).Value Listtabu(LstBxNo) = Listtabu(LstBxNo) + 1 Next End With End Sub

  • コンボボックス or リストボックス (複数列表示→値の取得)

    マクロ初心者です。(エクセル2003使用-ユーザーフォーム) 先日はお世話になり、ありがとうございました。 作成していくうちにさらに改良を加えたく、再質問させていただきます。 ※コンボボックス内の表示を複数行表示(Sheet1の管理番号,品名,注文数量)し、そのデータをSheet2のセルA(管理番号),セルB(品名),セルC(注文数量)と貼り付けようとしております。 が、本で探したところ複数行表示のやり方がリストボックスでしかのっていなく、さらに自分で作成したマクロでは動きませんでした。 すみませんが、お力をお貸しください。 (Sheet1) 担当課 客先 管理番号 品名 注文数量 出荷数量 A 岡田さん 1324 りんご 30 20 B 山田さん 1554 みかん 250 70 C 岡田さん 7634 なし 40 25 B 金子さん 4653 みかん 75 70 A 金子さん 6675 りんご 170 60 C 杉浦さん 7789 りんご 200 120 (↓こちらは、前回質問させていただいた内容です。) Private Sub UserForm_Initialize() ComboBox1.RowSource = "Sheet1! C2:C" & Worksheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row ←ここを複数行用に変更するのでしょうか?いろいろ試したのですがダメでした。 ComboBox1.ListIndex = -1 ComboBox1.SetFocus End Sub Private Sub CommandButton1_Click() Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ComboBox1.Value End With End Sub (↓こちらは、リストボックスでのマクロですが、動きません) Private Sub UserForm_Initialize() With UserForm2.ListBox1 .ColumnWidths = "70;50;50" .ColumnCount = 3 End With With Worksheets("Sheet1") Dim MyA As Variant Dim i As Long For i = 2 To UBound(MyA, 1) .AddItem .List(i - 2, 0) = Cells(i, 1).Value .List(i - 2, 1) = Cells(i, 2).Value .List(i - 2, 2) = Cells(i, 3).Value Next End With End Sub Private Sub CommandButton1_Click() Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ListBox1.Value End With End Sub 教えていただけましたら幸いです。 よろしくお願いいたします。

  • エクセルマクロ_上書き(リストボックスでデータを抽出し、その行へ上書き)

    エクセルマクロ初心者です。(2003使用_ユーザーフォーム,リストボックス,テキストボックス,チャックボックス) Sheet1のデータをユーザーフォームへ反映させ、修正したものをその行へ上書きするマクロを作成したいと思っていますが、うまくいかないのでどなたかお教え願います。 (Sheet1―A8より表がはじまります) 管理番号 品名 数量 希望納期 変更数量 完納 コメント アカ12 みかん     40   8月3日 アオ35 りんご     30   8月5日 クロ54 なし     50   7月7日 アカ98 もも     20   9月1日 アオ43 すいか     35   8月3日 ●完納の行がチャックボックスで、チェックがついたら、”完納”と記載、チェックがついていなかったら空欄のまま。もし表に”完納”と記載されていたら、コマンドボタン1でデータを抽出した時に、チェックがつくようにしたいのです。が、まったくうまくいかないのです。 ●また、コマンド1での抽出データに値を入力したものを上書きすることは一部できるのですが、空欄にしたときに、空欄の状態(無記入)に上書きすることができません。 Private Sub UserForm_Initialize() Dim r As Range Set r = Sheets("Sheet1").Range("A8").CurrentRegion.Offset(1) Set r = r.Resize(r.Rows.Count - 1) With ListBox1 .ColumnWidths = "50;50;0;0;0;0;0" .ColumnCount = 7 .RowSource = r.Address(A8, G) End With End Sub Private Sub CommandButton1_Click() If ListBox1.ListIndex <> -1 Then TextBox1.Value = ListBox1.List(ListBox1.ListIndex, 0) TextBox2.Value = ListBox1.List(ListBox1.ListIndex, 1) TextBox3.Value = ListBox1.List(ListBox1.ListIndex, 2) TextBox5.Value = ListBox1.List(ListBox1.ListIndex, 4) TextBox6.Value = ListBox1.List(ListBox1.ListIndex, 6) End If If Not IsEmpty(ListBox1.List(ListBox1.ListIndex, 3)) Then TextBox4.Value = Format(CDate(ListBox1.List(ListBox1.ListIndex, 3)), "m/d") Else TextBox4.Value = "" End If End Sub Private Sub CommandButton2_Click() If ListBox1.ListIndex <> -1 Then Dim r As Range ' 元データの範囲を取得 Set r = Sheets("Sheet1").Range("A8").CurrentRegion.Offset(1) Set r = r.Resize(r.Rows.Count - 1) ' 日付型かどうかをチェック If IsDate(TextBox4.Value) Then ' 選択されたセルの更新 r(ListBox1.ListIndex + 1, 4) = TextBox4.Value End If r(ListBox1.ListIndex + 1, 7) = TextBox6.Value End If End Sub Private Sub CheckBox1_Click() If ListBox1.ListIndex <> -1 Then Dim l As Range Set l = Sheets("Sheet1").Range("A8").CurrentRegion.Offset(1) Set l = l.Resize(l.Rows.Count - 1) If CheckBox1.Value = True Then l(ListBox1.ListIndex + 1, 5).Value = "完納" If CheckBox1.Value = False Then l(ListBox1.ListIndex + 1, 5).Value = "<>" End If End If End If End Sub すみませんが、ご親切に教えていただけましたら幸いです。 よろしくお願いいたします。

  • エクセルVBA テキストボックス

    いつもお世話になっております。 エクセルでVBAを使いユーザーフォームのテキストボックスで 文章入力をしようと思っているのですが、少しトラブルがありましたのでお教え願います。 エクセルシートの横がa~k、縦を9~34までのシートを結合して その中にテキストボックスで入力した文章を入れるように作っています。 MultiLineとEnterKeyBehaviorをTrueにして Private Sub CommandButton1_Click() Unload Me End Sub Private Sub TextBox1_Change() Sheets("sheet1").Range("a9") = UserForm1.TextBox1 End Sub Private Sub UserForm_Initialize() TextBox1.Value = Range("a9").Value End Sub Private Sub UserForm_Activate() With Me .Left = Application.Left .Top = Application.Top .Left = .Left + 350 .Top = .Top + 80 End With End Sub という状態になっているのですが、文章を入力して16行目で改行するとシートの方で「#VALUE!」と出てきてしまうので一旦ユーザーフォームを閉じてもう一度フォームを立ち上げると 「実行時エラー’-2147352571(80020005) Valueプロパティが設定できません。種類が一致しません。」 と出てきます。 デバッグすると  Private Sub CommandButton1_Click() → UserForm1.Show  End Sub と出てきます。 なにがおかしいのでしょうか? 今回初めてVBAを作っているので初歩的な間違いかもしれませんがよろしくお願いします

  • エクセルマクロ_テキストボックスをシートに反映(その2)

    エクセルマクロ初心者です。(2003使用_ユーザーフォーム) 先ほどは大変お世話になりました。 複数行に応用させようとしたのですが、管理番号が余計に記載(テキストボックス(出荷日など)が空欄であっても、管理番号だけはとられてしまいます)されてしまいます。すみませんが、ご教授よろしくお願いいたします。 リストボックス1のデータは、Sheet1を表示しています。→管理番号はSheet2のA最終行に記載されます。 テキストボックス1(回答日)は、上記の管理番号記載のとなりに、 テキストボックス2(出荷日)は、テキストボックス1記載のとなりに、 ・・・とテキストボックス4(コメント)(これはK列)に1行で記載されます。 ↑ここまでは、教えていただいたので、完璧なのですが、 テキストボックス2~4までの内容を、あと複数行(4件)追加できるように試してみたのですが、空欄であっても管理番号だけは常に記載されてしまいます。 テキストボックス2と5に記載されている場合は、Sheet2に値を反映させるが、空欄の場合は、値を反映させないようにしたいのです。 (Sheet1=データベース) C5   D5 管理番号 品名 アカ12 りんご アオ56 みかん クロ34 なし クロ89 すいか アオ12 もも (Sheet2=入力シート) A(管理番号)    B(回答日)    C(出荷日)   D(数量)     K(コメント) アオ56        8月9日        8月10日      75     送り先の確認 アオ56                    8月11日      80 クロ34        9月4日        9月5日      80 (今回は、2行で作成した場合のマクロを記載しました) Private Sub UserForm_Initialize() With ListBox1 .ColumnWidths = "0;0;50;50" .ColumnCount = 4 .RowSource = "Sheet1!A5:D" & Worksheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row End With End Sub Private Sub CommandButton1_Click() If TextBox2.Value Then Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ListBox1.List(ListBox1.ListIndex, 2) If IsDate(TextBox1.Value) Then .Range("B" & lRow + 1).Value = TextBox1.Value End If If IsDate(TextBox2.Value) Then .Range("C" & lRow + 1).Value = TextBox2.Value End If If IsNumeric(TextBox3.Value) Then .Range("D" & lRow + 1).Value = TextBox3.Value End If .Range("K" & lRow + 1).Value = TextBox4.Value End With End If If TextBox5.Value Then Dim llRow As Long With Worksheets("Sheet2") llRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & llRow + 1).Value = ListBox1.List(ListBox1.ListIndex, 2) If IsDate(TextBox5.Value) Then .Range("C" & llRow + 1).Value = TextBox5.Value End If If IsNumeric(TextBox6.Value) Then .Range("D" & llRow + 1).Value = TextBox6.Value End If .Range("K" & llRow + 1).Value = TextBox7.Value End With End If Dim myCtrl As Control For Each myCtrl In Controls If TypeName(myCtrl) = "TextBox" Then myCtrl.Value = vbNullString End If Next End Sub (ユーザーフォーム) リストボックス1=Sheet1のデータを反映 テキストボックス1(回答日) テキストボックス2(出荷日),テキストボックス3(数量),テキストボックス4(コメント)←1件目 テキストボックス5(出荷日),テキストボックス6(数量),テキストボックス7(コメント)←2件目 ↑1件目のみでコマンドボタンを押した場合は、1件目のみの管理番号取得をしたいのです。が今は、2件目が空欄でも管理番号はとられてしまいます。 長くなってしまいすみません。 どなたかご回答いただければ幸いです。よろしくお願いいたします。

  • リストボックスから項目を選択してセルに入力したいのです

    EXcel2003でマクロ作成中です。エクセルシートのN列を右クリックすると、ユーザーォームが現れ、その中のリストボックスから項目を選択すると選択文字が白色に反転します。 ユーザーホームの下方に設置した「入力する」ボタンをクリックする、アクティブセルにテキスト文字列が挿入されます。 Option Explicit Private Sub CommandButton1_Click() With ListBox1 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ActiveCell.Value = ListBox1.list(ListBox1.ListIndex) End If End With Unload UserForm1 End Sub --------------------------- Private Sub CommandButton2_Click() Unload UserForm1 End Sub ------------------------------ これと同じものをB列につくりました。エクセルシートのB列を右クリックすると、リストボックスが表示されますが、その中の項目を選択しようとすると、一瞬にしてユーザーフォーム自体が消えてしまい項目を 選択できません。 Private Sub CommandButton1_Click() With ListBox2 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ActiveCell.Value = ListBox2.list(ListBox2.ListIndex) End If End With Unload UserForm2 End Sub ----------------------------- Private Sub CommandButton2_Click() Unload UserForm2 End Sub ------------------------------------------ まったく同じものを作って内容だけかえたのですが、できません。 どうしてでしょうか?ご教授おねがいします。

  • リストボックスについてです。

    リストボックスについてです。 B列をダブルクリックするとリストボックスが立ち上がり、データを選択してB列に表示できるように設定されていますが、困った現象が起こっています。 例えば、sheet1のB10にダブルクリックでリストボックスを表示し、そこから「あいうえお」という名前を表示させて、sheer1編集が終わったとします。 次のsheet2でB1をダブルクリックしているのに、sheet2のB10に勝手に「あいうえお」と表示されてしまいます。 コードは以下になってます。 VBA初心者なのでエクセルのサイト等からコピペ等して作ったコードです。 どこかおかしな箇所があると思うのですが、何処がおかしいのかがわかりません。 お分かりになる方、教えていただければ助かります。 ' ◆Worksheetのコード◆ '---------------------------------------------------- '選択範囲を変更したときに実行される Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) UserForm1.ListBox1.RowSource = "データ!A1:A100"  '表示するデータ範囲 UserForm1.ListBox1.Font.Size = 12    'フォントサイズ If Target.Column = 2 Then 'B列なら 行 = Target.Row '行番号を取得する UserForm1.Show 'ユーザーフォームを表示する End If End Sub '=================================================================================== ' ◆UserForm1のコード◆ '-------------------------------------------------------------------------- Private Sub ListBox1_Click() 'クリックされたときに実行される If 行 <> 1 Then '1行目でなければ Cells(行, 2) = ListBox1.Value 'リストボックスの値をセルにセットする End If UserForm1.Hide 'ユーザーフォームを非表示にする End Sub Private Sub UserForm_Deactivate() '非アクティブになったときに実行される Unload Me 'ユーザーフォームをメモリから削除する End Sub '========================================================================================= '============================== ' ◆標準モジュールのコード◆ Option Explicit Public 行 As Variant '行番号 Sub auto_open() Load UserForm1 'ユーザーフォームをメモリに読み込む End Sub '==============================

  • VBA controlsouce の使い方

    エクセル2002使用です。 個人情報リストのようなものを作ってます。 ユーザーフォームにTextBox1とCommandButton1をつくり、そこにセルに既に入力されているデーターを入力したいのですが、うまくいきません。 Private Sub CommandButton1_Click() UserForm1.TextBox1.ControlSource = _ Worksheets(1).Range("B5").Value End Sub どこか悪いのか全くわからず困ってます。 よろしくお願いします。

  • リストボックスについて

    リストボックスからデータを転記したいのですが、 実行時エラー"1004"が出てしまい、どうしてもうまくいきません。 どなたか原因を教えてください。 Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean) Dim i As Long With Worksheets("sheet2") i = .Range("F47").End(xlUp).Row + 1 .Range(i, 6).Value = ListBox1.List(ListBox1.ListIndex, 0) .Range(i, 12).Value = ListBox1.List(ListBox1.ListIndex, 1) .Range(i, 26).Value = ListBox1.List(ListBox1.ListIndex, 2) .Range(i, 28).Value = ListBox1.List(ListBox1.ListIndex, 3) .Range(i, 34).Value = ListBox1.List(ListBox1.ListIndex, 4) .Range(i, 37).Value = ListBox1.List(ListBox1.ListIndex, 5) End With Unload Me End Sub

  • 連続プルダウンについて

    VBAで初心者でリストを作るのがやっとで連続プルダウンができません 各月のシートに登録ボタン作成あります。登録ボタンを押して商品を登録する際に、大分類を選んだら、選んだ大分類の中分類を選べ、中分類を選んだら小分類を選べるようにしたいです。 そのために、Sheet1に分類の表を作成しました。 例えば、大分類で梱包作業用品を選んだら、     中分類には梱包/結束用品かテープ製品が選べて、中分類で梱包/結束用品を選んだら     小分類で緩衝材か養生用テープが選べる様にしたいです。 どうか教えて下さい。 ----------------------------------------------------------- Private Sub CommandButton1_Click() Dim lRow As Long Dim ws As Worksheet Set ws = ThisWorkbook.ActiveSheet With ws lRow = .Range("B" & Rows.Count).End(xlUp).Row .Range("B" & lRow + 1).Value = TextBox1.Value lRow = Range("C" & Rows.Count).End(xlUp).Row .Range("C" & lRow + 1).Value = ListBox1.Value lRow = .Range("D" & Rows.Count).End(xlUp).Row .Range("D" & lRow + 1).Value = TextBox2.Value lRow = .Range("E" & Rows.Count).End(xlUp).Row .Range("E" & lRow + 1).Value = TextBox3.Value lRow = .Range("F" & Rows.Count).End(xlUp).Row .Range("F" & lRow + 1).Value = TextBox4.Value lRow = .Range("G" & Rows.Count).End(xlUp).Row .Range("G" & lRow + 1).Value = TextBox5.Value 'lRow = .Range("I" & Rows.Count).End(xlUp).Row '.Range("I" & lRow + 1).Value = TextBox6.Value lRow = Range("I" & Rows.Count).End(xlUp).Row .Range("I" & lRow + 1).Value = ListBox3.Value lRow = .Range("J" & Rows.Count).End(xlUp).Row .Range("J" & lRow + 1).Value = TextBox7.Value lRow = .Range("K" & Rows.Count).End(xlUp).Row .Range("K" & lRow + 1).Value = TextBox8.Value lRow = Range("L" & Rows.Count).End(xlUp).Row Range("L" & lRow + 1).Value = ListBox2.Value lRow = .Range("H" & Rows.Count).End(xlUp).Row .Range("H" & lRow + 1).Value = TextBox9.Value End With TextBox1.Value = "" TextBox1.SetFocus TextBox2.Value = "" TextBox2.SetFocus TextBox3.Value = "" TextBox3.SetFocus TextBox4.Value = "" TextBox4.SetFocus TextBox5.Value = "" TextBox5.SetFocus 'TextBox6.Value = "" 'TextBox6.SetFocus TextBox7.Value = "" TextBox7.SetFocus TextBox8.Value = "" TextBox8.SetFocus TextBox9.Value = "" TextBox9.SetFocus End Sub Private Sub UserForm_Initialize() With ListBox1 .AddItem "たのめーる" .AddItem "AMAZON" .AddItem "楽天" .AddItem "yahooショッピング" .AddItem "国峰印房" .AddItem "脇製茶" .AddItem "ヤマト運輸" .AddItem "ゼネラル" .AddItem "家電量販店" End With With ListBox2 .AddItem "総務課" .AddItem "用度" .AddItem "営業" .AddItem "介護" .AddItem "倉庫" .AddItem "人事" .AddItem "経理" End With With ListBox3 .AddItem "梱包作業用品" .AddItem "事務用品消耗品" .AddItem "パソコン用品消耗品" .AddItem "プリンター用品消耗品" .AddItem "掃除用品消耗品" .AddItem "衛生用品消耗品" .AddItem "消臭用品消耗品" .AddItem "洗剤用品消耗品" .AddItem "事務用品" .AddItem "掃除用品" .AddItem "生活雑貨用品" .AddItem "飲食用品" .AddItem "パソコン周辺機器" .AddItem "生活雑貨" .AddItem "医療機器" .AddItem "電化製品" .AddItem "衛生用品" .AddItem "日用品" .AddItem "出版物" .AddItem "家具" End With End Sub

専門家に質問してみよう