VB6でオブジェクト(コントロール?)名の配列


とみぃだ  2007-07-31 01:26:33  No: 137050

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ブロック変数が設定されていません」のエラーとなります。

スプレッドシートの値を各コントロールボックスに転送させるにはどうしたらよいでしょうか?


とみぃだ  2007-07-31 02:50:40  No: 137051

ちなみに、他の所で話題となっている
ラベルを配列(txtNantoka(1),txtNantoka(2)  ・・・)にし、

For i = 0
 txtNantoka(i).text = vbnullstring
next i

のような名称定義ができないのでよろしくお願いいたします。


loo  2007-07-31 08:21:40  No: 137052

オブジェクトに参照させるには
  Set objControl(0) = Text1
のようにSetを使わないといけないのでは


じぇふ  2007-08-01 05:23:34  No: 137053

>objControl(cntControl) = objName(cntIndex)
objControlへの代入はこの行で実行されているつもりなのでは?
objName(cntIndex)の内容はあくまでもコントロール名ですよね。

この行はあくまでも名称だけが代入されているかと・・・

Set objControl(cntControl) = Me.Controls(objName(cntIndex))
のような形でオブジェクトを保持するようにしないとダメじゃないかな。

ステップ実行しながら、変数の中身を確認すると判ると思いますよ


参考  2007-08-01 19:39:52  No: 137054

こちらでも類似案件がいろいろと
http://okwave.jp/qa3213956.html


とみぃだ  2007-08-01 20:36:32  No: 137055

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)

と変えてみましたが「コンパイルエラー」となりますね。

もう少し考えてみます。


じぇふ  2007-08-02 18:14:08  No: 137056

「コンパイルエラー」の時はメッセージを提示していただかないと・・
少なくとも
Set objControl(cntControl) = Me.Controls(objName(cntIndex))
の行ではないと思うのですが・・


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加