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

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

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

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

Q&A

2回答

185閲覧

excel vbaでset comboboxが実行時エラー1004になって作成に失敗する

phpsyoshinsya

総合スコア156

VBA

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

0グッド

0クリップ

投稿2025/02/10 04:16

実現したいこと

*j1セルにh4:h122のなかから値を選択するコンボボックスを作りたい
のですが、
set comboboxで実行時エラー1004になります。
コードは

Set comboBox = Sheet1.OLEObjects.Add(ClassType:="Forms.ComboBox", Left:=Range("J1").Left, Top:=Range("J1").Top, Width:=100, Height:=20).Object

参照設定でマイクロソフトフォームズも追加しましたし、文法の間違えもGeminiで確認してみましたが、指摘されることは特段ありませんでした。
VBAは今回が初めてなので、あまりかってがわかりませんが、ご教授お願いします。
*実現したいことは
j1セルにコンボボックスを作成し、そのコンボボックスでh4:h122の範囲を選択し、その選択したセル番地をk3セルに価参照形式で書き込みたいのです。
*コード全体はこんな感じです
標準モジュール

'マクロ実行の起点(コンボボックス作成と初期化) Sub ExecuteMacro() 'コンボボックスの作成と初期化 Call CreateAndInitializeComboBox End Sub 'コンボボックスの作成と初期化 Sub CreateAndInitializeComboBox() Dim comboBox As Object 'Sheet1をアクティブにする Sheet1.Activate 'Sheet1の保護を解除(パスワードが設定されている場合は、Password:="パスワード"を追加) Sheet1.Unprotect '既存のコンボボックスを削除 For Each obj In Sheet1.OLEObjects If TypeOf obj.Object Is MSForms.comboBox Then obj.Delete End If Next obj 'コンボボックスの作成 Set comboBox = Sheet1.OLEObjects.Add(ClassType:="Forms.ComboBox", Left:=Range("J1").Left, Top:=Range("J1").Top, Width:=100, Height:=20).Object 'コンボボックスの初期化 Call InitializeComboBox(comboBox) End Sub 'コンボボックスの初期化と更新 Sub InitializeComboBox(comboBox As Object) Dim i As Long Dim month As Long Dim year As Long 'コンボボックスのクリア comboBox.Clear 'コンボボックスに選択肢を追加 For i = 4 To 122 month = i - 3 year = Int((month - 1) / 12) month = (month - 1) Mod 12 + 1 If year = 0 Then comboBox.AddItem month & "カ月目" Else comboBox.AddItem year & "年" & month & "カ月目" End If Next i 'コンボボックスの初期値を設定(1カ月目) comboBox.Value = "1カ月目" End Sub 'セルの値を更新 Sub UpdateCellValue(comboBox As Object) Dim selectedIndex As Long Dim selectedCell As String Dim formulaCell As String Dim formulaValue As String Dim divisor As Double Dim result As Double '選択されたコンボボックスのインデックスを取得 selectedIndex = comboBox.ListIndex '選択されたセル番地を取得 selectedCell = "H" & (selectedIndex + 4) '選択されたセル番地をK3セルに書き込む Sheet1.Range("K3").Value = "=" & selectedCell '選択された行のG列の式を取得 formulaCell = "G" & (selectedIndex + 4) formulaValue = Sheet1.Range(formulaCell).formula '式の中から10000, 11000, 12000, 13000, 14000のいずれかを探す divisor = GetDivisor(formulaValue) '除算結果をL3セルに表示 If divisor <> 0 Then result = Evaluate(selectedCell) / divisor Sheet1.Range("L3").Value = result Else Sheet1.Range("L3").Value = "" End If 'M3:Q3セルの式を更新 UpdateFormulaRange result, divisor End Sub '式の中から除数(10000, 11000, 12000, 13000, 14000)を探す Function GetDivisor(formula As String) As Double Dim divisors As Variant Dim i As Long divisors = Array(10000, 11000, 12000, 13000, 14000) For i = 0 To UBound(divisors) If InStr(1, formula, divisors(i)) > 0 Then GetDivisor = divisors(i) Exit Function End If Next i End Function 'M3:Q3セルの式を更新 Sub UpdateFormulaRange(result As Double, divisor As Double) Dim cell As Range For Each cell In Sheet1.Range("M3:Q3") cell.formula = "=" & result & "*" & (500 - (cell.Column - 13) * 100) Next cell '除数に応じた係数をM3セルに適用 If divisor = 14000 Then Sheet1.Range("M3").formula = "=" & result & "*" & 500 & "*0.79685" ElseIf divisor = 13000 Then Sheet1.Range("M3").formula = "=" & result & "*" & 500 & "*0.79685" Sheet1.Range("N3").formula = "=" & result & "*" & 400 & "*0.79685" ElseIf divisor = 12000 Then Sheet1.Range("M3").formula = "=" & result & "*" & 500 & "*0.79685" Sheet1.Range("N3").formula = "=" & result & "*" & 400 & "*0.79685" Sheet1.Range("O3").formula = "=" & result & "*" & 300 & "*0.79685" ElseIf divisor = 11000 Then Sheet1.Range("P3").formula = "=" & result & "*" & 200 & "*0.79685" ElseIf divisor = 10000 Then Sheet1.Range("Q3").formula = "=" & result & "*" & 100 & "*0.79685" End If End Sub

シートモジュール

'コンボボックスの値が変更されたときの処理 Private Sub ComboBox1_Change() Call UpdateCellValue(ComboBox1) End Sub

*これから少しずつ勉強しようと思うので
是非実現にご尽力いただけますようお願いします。

発生している問題・分からないこと

excel VBAでコンボボックスを作成する方法がうまくいかない

該当のソースコード

特になし ``` ### 試したこと・調べたこと - [x] teratailやGoogle等で検索した - [x] ソースコードを自分なりに変更した - [ ] 知人に聞いた - [ ] その他 ##### 上記の詳細・結果 Geminiにも何度も質問しましたが、解決できずGoogleで検索もしましたが、同じようなことを解説してくれているページを見つけられませんでした。 ### 補足 特になし

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

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

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

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

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

guest

回答2

0

set comboboxで実行時エラー1004になります。

まず OLEObjects オブジェクトの Add メソッドの引数 ClassType に渡す文字列を "Forms.ComboBox.1" に変更して下さい。

vba

1Set comboBox = Sheet1.OLEObjects.Add(ClassType:="Forms.ComboBox.1", Left:=Range("J1").Left, Top:=Range("J1").Top, Width:=100, Height:=20).Object

それでも実行時エラー 1004 が発生するのであれば、恐らく Excel のトラストセンターの設定により ActiveX コントロールが無効になっているのではないかと思われます。
(特に Office 2024 においては、既定の設定により ActiveX コントロールは無効化されています)

j1セルにコンボボックスを作成し、そのコンボボックスでh4:h122の範囲を選択

J1 セルにデータの入力規則を設定なさればよいのではないでしょうか。

イメージ説明

投稿2025/02/10 05:49

sk.exe

総合スコア1008

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

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

phpsyoshinsya

2025/02/10 08:31

ご回答ありがとうございます。 修正していただいたコードを適応させて、トラストセンターのアクティブコントロールの設定も行って、エラーは表示されなくなりました。ただ、コンボボックスが表示されません。まだ何か直す個所がありますでしょうか?たしかに入力規則という方法もあると思いますが、それでも1カ月目2か月目のような表示で選択式にできるでしょうか?そしてその選んだセル番地をk3セルに価参照形式で書き込めるでしょうか?VBAにもエクセルにも詳しくなくて、基礎的な質問も含まれていて申し訳ありませんが、何卒ご教授いただけますようお願いいたします。
sk.exe

2025/02/11 03:47

> コンボボックスが表示されません。まだ何か直す個所がありますでしょうか? コードそのものに関しては、私が示した修正箇所を除けば特に見当たりません。 少なくとも、こちらの環境でテストした限りでは正常にコンボボックスが作成されます。 したがって、何か他の原因を疑われた方がよいと思います。 > たしかに入力規則という方法もあると思いますが、 > それでも1カ月目2か月目のような表示で選択式にできるでしょうか? リストの参照先となるセル範囲の各セルの実際の値がそのようになっていれば一応は可能でしょうけど、実際の H4:H122 が "1カ月目"、"2カ月目"、"3カ月目"……といったリストになっているのか否かが不明瞭です。 また UpdateCellValue、GetDivisor、UpdateFormulaRange の各プロシージャのコードを拝見した限り「数値リテラルと算術演算子のみで構成された(他のセルの参照を含まない)数式を設定する」という表計算ソフトらしからぬ手法が用いられており、VBAに頼らずに解決できる方法があるようにも思えます。 とりあえず、Sheet1 の H4:H122 および G4:G122 の各セルにどのようなデータが格納されているか、どのような数式が設定されているかについて具体的に明記されることをお奨めします。
guest

0

こんな感じかと。。。

標準モジュール

ExcelVBA

1Option Explicit 2 3'コンボボックスの作成と初期化 4Sub ComboBox_Initialize() 5 Dim wsh As Worksheet: Set wsh = Worksheets("Sheet1") 6 Dim rngCmbBox As Range: Set rngCmbBox = wsh.Range("J1") 7 Dim rngReference As Range: Set rngReference = wsh.Range("L4:H122") 8 9 '既存のコンボボックスを削除 10 ComboAllDelete wsh 11 'コンボボックスの作成 12 ComboCreate rngCmbBox, rngReference 13End Sub 14 15Private Sub ComboAllDelete(ByRef pWsh As Worksheet) 16 Dim o As OLEObject 17 18 For Each o In pWsh.OLEObjects 19 If TypeName(o.Object) = "ComboBox" Then o.Delete 20 Next 21End Sub 22 23Private Sub ComboCreate(ByRef prngCmb As Range, _ 24 ByRef prngRef As Range) 25 Dim cmb As MSForms.ComboBox 26 Dim c As Range 27 Dim i As Long, y As Long 28 29 With prngCmb 30 Set cmb = .Worksheet.OLEObjects.Add( _ 31 ClassType:="Forms.ComboBox.1", _ 32 Link:=False, DisplayAsIcon:=False, _ 33 Left:=.Left, Top:=.Top, Width:=100, Height:=20).Object 34 End With 35 cmb.List = GetChoices(prngRef) 36 prngCmb.Value = prngRef.Address(External:=True) 37End Sub 38 39Private Function GetChoices(ByRef r As Range) As Variant 40 Dim vList() As Variant 41 Dim c As Range 42 Dim i As Long 43 Dim y As Long 44 Dim m As Long 45 Dim s As String 46 ReDim vList(0 To r.Count - 1) As Variant 47 For i = LBound(vList) To UBound(vList) 48 y = Int(i / 12) 49 m = i Mod 12 + 1 50 If y = 0 Then 51 s = m & "カ月目" 52 Else 53 s = y & "年" & m & "カ月目" 54 End If 55 vList(i) = s 56 Next 57 GetChoices = vList 58End Function

シートモジュール

ExcelVBA

1Option Explicit 2 3Private Sub ComboBox1_Change() 4 SetUpdate Me.Range("H3:K3"), Me.ComboBox1 5End Sub 6 7Private Sub SetUpdate(ByRef ToRange As Range, _ 8 ByRef cmb As MSForms.ComboBox) 9 Dim rngReference As Range 10 Set rngReference = Application.Range(Me.Range("J1").Value) 11 ToRange(1).Value = rngReference(cmb.ListIndex + 1, 1).Value 12 ToRange(2).Value = result 13End Sub

投稿2025/02/18 02:36

編集2025/02/19 02:12
mattuwan

総合スコア2167

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.33%

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

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

質問する

関連した質問