質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

2回答

3371閲覧

VBA 複数のコンボボックスに同一の処理を行なう

asian-ayam

総合スコア8

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

0クリップ

投稿2019/12/25 12:33

お世話になっております。ユーザーフォームのコンボボックス(cmbExp1からcmbExp9)を9個ほど設置してDatabaseのI列のリストの最終行(cMaxRowとしました)までの同一のリスト一覧をコンボボックスに表示させたいと思い、下記のコードを記載しましたが、Forで指定された変数は既に使われていますというエラーが出てしまいました。

原因としては他のコンボボックスの設定でFor文を設定してしまっていることや9個のコンボボックスのループの書き方が繰り返しが多く、構文的にエラーが出やすい状態になっているかとは思いますが、エラーの出にくい書き方を教えていただけましたら有難いです。

vba

1 2Private Sub UserForm_Initialize() 3 4'gain the last row 5 Dim cMaxRow As Integer 6 cMaxRow = Cells(Rows.Count, 1).End(xlUp).Row 7 8 'setting initial No. 9 If cMaxRow > 10 Then 10 txtNoDay.Value = Range("A" & cMaxRow).Value + 1 11 End If 12 13 'setting initial date 14 txtDay.Value = Day(Date) 15 txtMonth.Value = Month(Date) 16 txtYear.Value = Year(Date) 17 18 19 'comboBox add name of Maker 20 Dim i As Integer 21 For i = 3 To 5 22 cmbMaker.AddItem Worksheets("Database").Range("A" & i).Value 23 24 25 'comboBox add Category of descriptions for each expense 26 27 For i = 3 To cMaxRow 28 cmbExp1.AddItem Worksheets("Database").Range("I" & i).Value 29 30 31 For i = 3 To cMaxRow 32 cmbExp2.AddItem Worksheets("Database").Range("I" & i).Value 33 34 35 For i = 3 To cMaxRow 36 cmbExp3.AddItem Worksheets("Database").Range("I" & i).Value 37 38 39 For i = 3 To cMaxRow 40 cmbExp4.AddItem Worksheets("Database").Range("I" & i).Value 41 42 43 For i = 3 To cMaxRow 44 cmbExp5.AddItem Worksheets("Database").Range("I" & i).Value 45 46 47 For i = 3 To cMaxRow 48 cmbExp6.AddItem Worksheets("Database").Range("I" & i).Value 49 50 51 For i = 3 To cMaxRow 52 cmbExp7.AddItem Worksheets("Database").Range("I" & i).Value 53 54 55 For i = 3 To cMaxRow 56 cmbExp8.AddItem Worksheets("Database").Range("I" & i).Value 57 58 59 For i = 3 To cMaxRow 60 cmbExp9.AddItem Worksheets("Database").Range("I" & i).Value 61 62 Next i 63 64 65End Sub 66

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

meg_

2019/12/25 12:47

コードのどこでエラーが出ていますか?
asian-ayam

2019/12/26 04:25

情報が足りず、申し訳ございません。For i = 3 To 5の箇所からエラーが出てしまいました!
guest

回答2

0

ベストアンサー

Forで指定された変数は既に使われていますというエラーが出てしまいました。

エラーの原因はNextが不足しているからです。
For と Next は一対一対応していないとダメです。

vba

1 For i = 3 To cMaxRow 2 cmbExp1.AddItem Worksheets("Database").Range("I" & i).Value 3 Next i '※追加 4 5 For i = 3 To cMaxRow 6 cmbExp2.AddItem Worksheets("Database").Range("I" & i).Value 7 Next i '※追加 8 9 10'以下同様 11

構文的にエラーが出やすい状態になっているかとは思いますが、エラーの出にくい書き方を教えていただけましたら有難いです。

シート上のリストをコンボボックスに設定する場合は、RowSourceプロパティかListプロパティを使うとループを使わずに1行で設定できます。
Listプロパティのコード例は mattuwanさんが回答しているので、RowSourceを使ったコード例を。

vba

1 cmbMaker.RowSource = "Database!A3:A5" 2 3 Dim cMaxRow As Long 4 cMaxRow = Worksheets("DataBase").Cells(Rows.Count, "I").End(xlUp).Row 5 6 Dim i As Lomg 7 For i = 1 to 9 8 Me("cmbExp" & i).RowSource = "Database!I2:I" & cMaxRow 9 Next

投稿2019/12/25 13:35

編集2019/12/25 13:36
hatena19

総合スコア33692

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asian-ayam

2019/12/26 10:45

初心者にも分かりやすいコードを記載して下さり、有難うございます!おかげさまでキレイにまとまりました!
guest

0

変数iは何度使ってもいいですが、
Forの数だけNextも要ります。

ExcelVBA

1Private Sub UserForm_Initialize() 2 Dim i As Long 3 Dim cMaxRow As Long 4 5 cMaxRow = Cells(Rows.Count, 1).End(xlUp).Row 6 7 'comboBox add Category of descriptions for each expense 8 For i = 3 To cMaxRow 9 cmbExp1.AddItem Worksheets("Database").Range("I" & i).Value 10 Next 11 12 For i = 3 To cMaxRow 13 cmbExp2.AddItem Worksheets("Database").Range("I" & i).Value 14 Next 15End Sub

長いので省略しました。。。

というか、もっと簡単に書けます。

ExcelVBA

1Private Sub UserForm_Initialize() 2 Dim i As Long 3 Dim Rng As Range 4 5 With ThisWorkbook.Worksheets("DataBase") 6 Set Rng = .Range(.Range("I3"), .Cells(.Rows.Count, "I").End(xlUp)) 7 End With 8 9 For i = 1 To 3 10 Me.Controls("ComboBox" & i).List = Rng.Value 11 Next 12End Sub

オブジェクト名等はそちらに合わせて変更してください。
試しに新しいコンボボックスを3個配置して作って、試しました。

投稿2019/12/25 12:57

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asian-ayam

2019/12/26 10:45

ご回答下さり、有難うございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問