VB6で開発しています。
任意の数のコンボボックス、ラジオボタン、テキストボックスがあります。
Dim cnt As Integer 'ループカウンタ
Dim cntControl As Integer 'ループカウンタ
Dim cntIndex As Integer
Dim objName() As String 'オブジェクト
Dim objControl() As Variant '※
Dim intObject As Integer
Dim icnt As Variant 'オブジェクトカウント
Dim intcnt As Integer 'オブジェクトカウントⅡ
Dim strControl As String
Dim intTabIndex As Integer
Dim cntOpt As Integer
'各コントロール名称をタブインデックスごとにまとめる
For Each obCnt In Me.Controls
intTabIndex = obCnt.TabIndex
objName(intTabIndex) = obCnt.Name
Next obCnt
cntIndex = 0
cntControl = 0
'命名規則はtxtXXXがテキストボックス
'cmbXXXがコンボボックス
'optXXXがラジオボタンとする
'テキスト・コンボボックス・ラジオボタンだけに振り分ける
Do
Do
cntIndex = cntIndex + 1
If InStr(StrConv(objName(cntIndex), vbLowerCase), "txt") <> 0 Then
Exit Do
ElseIf InStr(StrConv(objName(cntIndex), vbLowerCase), "cmb") <> 0 Then
Exit Do
ElseIf InStr(StrConv(objName(cntIndex), vbLowerCase), "opt") <> 0 Then
If objName(cntIndex) <> objControl(cntControl - 1) And cntControl <> 0 Then
Exit Do
End If
ElseIf objName(cntIndex) = vbNullString Then
Exit Do
End If
DoEvents
Loop
If objName(cntIndex) = vbNullString Then
Exit Do
End If
objControl(cntControl) = objName(cntIndex)
Debug.Print objControl(cntControl)
cntControl = cntControl + 1
DoEvents
Loop Until objName(cntIndex + 1) = vbNullString
'配列の最大値を設定
ReDim Preserve objName(cntIndex)
ReDim Preserve objControl(cntControl - 1)
(中略)
intcnt = 0
cnt = 0
With spreadSheet
.Row = intChkPosision
Do While cnt <= UBound(objControl)
.Col = cnt + 1
If InStr(objControl(cnt), "txt") <> 0 Then
'①スプレッドシートの値を転送
objControl(cnt + 1).Text = .Value
ElseIf InStr(objControl(cnt), "cmb") <> 0 Then
'②スプレッドシートの値を転送(値はコンボボックスの選択候補に確実に入っていることが前提)
objControl(cnt + 1).Text = .Value
ElseIf InStr(objControl(cnt), "opt") <> 0 Then
For cntOpt = 0 To UBound(objControl(cnt))
'③スプレッドシートの値と同じラジオボタンの値をチェック
DoEvents
Next optcnt
End If
cnt = cnt + 1
DoEvents
Loop
End with
スプレッドシートの値を各コントロールボックスに転送させたいのですが、
※をvariant型で定義すると
①のobjControl(cnt + 1).Text = .Value
でエラーとなります
「実行時エラー 424 オブジェクトが必要です」
※をControlもしくはobjectで定義すると
「実行時エラー 91 オブジェクト変数または Withブロック変数が設定されていません」のエラーとなります。
スプレッドシートの値を各コントロールボックスに転送させるにはどうしたらよいでしょうか?
ちなみに、他の所で話題となっている
ラベルを配列(txtNantoka(1),txtNantoka(2) ・・・)にし、
For i = 0
txtNantoka(i).text = vbnullstring
next i
のような名称定義ができないのでよろしくお願いいたします。
オブジェクトに参照させるには
Set objControl(0) = Text1
のようにSetを使わないといけないのでは
>objControl(cntControl) = objName(cntIndex)
objControlへの代入はこの行で実行されているつもりなのでは?
objName(cntIndex)の内容はあくまでもコントロール名ですよね。
この行はあくまでも名称だけが代入されているかと・・・
Set objControl(cntControl) = Me.Controls(objName(cntIndex))
のような形でオブジェクトを保持するようにしないとダメじゃないかな。
ステップ実行しながら、変数の中身を確認すると判ると思いますよ
こちらでも類似案件がいろいろと
http://okwave.jp/qa3213956.html
If objName(cntIndex) = vbNullString Then
Exit Do
End If
objControl(cntControl) = objName(cntIndex)
Debug.Print objControl(cntControl)
→
If objName(cntIndex) = vbNullString Then
Exit Do
End If
Set objControl(cntControl) = Me.Controls(objName(cntIndex))
Debug.Print objControl(cntControl)
と変えてみましたが「コンパイルエラー」となりますね。
もう少し考えてみます。
「コンパイルエラー」の時はメッセージを提示していただかないと・・
少なくとも
Set objControl(cntControl) = Me.Controls(objName(cntIndex))
の行ではないと思うのですが・・
ツイート | ![]() |