Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


4018 / 13644 ツリー ←次へ | 前へ→

【58830】複数のオブジェクトに対し類似の処理 りった 08/11/13(木) 11:10 質問[未読]
【58832】Re:複数のオブジェクトに対し類似の処理 Jaka 08/11/13(木) 11:49 発言[未読]
【58834】Re:複数のオブジェクトに対し類似の処理 りった 08/11/13(木) 13:10 質問[未読]
【58833】Re:複数のオブジェクトに対し類似の処理 n 08/11/13(木) 13:00 発言[未読]
【58835】Re:複数のオブジェクトに対し類似の処理 りった 08/11/13(木) 13:17 お礼[未読]
【58836】Re:複数のオブジェクトに対し類似の処理 neptune 08/11/13(木) 13:28 発言[未読]
【58837】Re:複数のオブジェクトに対し類似の処理 りった 08/11/13(木) 13:50 発言[未読]
【58841】Re:複数のオブジェクトに対し類似の処理 neptune 08/11/13(木) 14:58 お礼[未読]
【58844】Re:複数のオブジェクトに対し類似の処理 n 08/11/13(木) 15:19 発言[未読]
【58849】Re:複数のオブジェクトに対し類似の処理 neptune 08/11/13(木) 17:09 発言[未読]

【58830】複数のオブジェクトに対し類似の処理
質問  りった  - 08/11/13(木) 11:10 -

引用なし
パスワード
   複数のオブジェクト(チェックボックス等)に対し類似の処理を行う場合、
どのように書くと良い感じかをご教示下さい。

このように書くと、vがVariant型なので、vの後に「.」を打ってもプロパティ一覧が表示(機能名なんでしたっけ?)されません。
 Dim v As Variant
 Dim chs As Variant
 
 chs = Array(Sheet1.chechboxA, Sheet1.chechboxB, Sheet1.chechboxC)
 For Each v In chs
  Debug.Print v.Value
  ' chを使用する処理色々
 Next

このように書くと、エラーになります。
 Dim v As Variant
 Dim ch As CheckBox
 Dim chs As Variant
 
 chs = Array(Sheet1.chechboxA, Sheet1.chechboxB, Sheet1.chechboxC)
 For Each v In chs
  ch = v ' エラーになる。 「set ch = v」でもエラー
  Debug.Print ch.Value
  ' chを使用する処理色々
 Next

・C言語で言うと「set ch = (CheckBox)v」的なことをしたいです。(キャスト)
・実際のプログラムは膨大で、一部分のサンプルを元に質問させて頂いています。

【58832】Re:複数のオブジェクトに対し類似の処理
発言  Jaka  - 08/11/13(木) 11:49 -

引用なし
パスワード
   ▼りった さん:
>・C言語で言うと「set ch = (CheckBox)v」的なことをしたいです。(キャスト)
>・実際のプログラムは膨大で、一部分のサンプルを元に質問させて頂いています。
C言語はわかりません。

こんな感じの事?

Dim ob(1 To 3) As OLEObject
Set ob(1) = Worksheets("Sheet1").OLEObjects("CheckBox1")
Set ob(2) = Worksheets("Sheet1").OLEObjects("CheckBox2")
Set ob(3) = Worksheets("Sheet1").OLEObjects("CheckBox3")
For i = 1 To 3
  ob(i).Object.Value = xlOn
Next

【58833】Re:複数のオブジェクトに対し類似の処理
発言  n  - 08/11/13(木) 13:00 -

引用なし
パスワード
   >Dim ch As CheckBox
Dim ch As MSForms.CheckBox
で Set
>(機能名なんでしたっけ?)
自動メンバ表示(もしくは入力候補?)

【58834】Re:複数のオブジェクトに対し類似の処理
質問  りった  - 08/11/13(木) 13:10 -

引用なし
パスワード
   回答有難う御座います。

しかし、
・「ob(i).Object.」を打った際、プロパティ一覧が表示されません。
・Set ob(1)の添え字部分を書き間違えそう。
・3個でなくなったときの変更が中途半端になりバグになりそう。
です。

プロパティ一覧など使わずに、修正も間違わずに書けば出来なくは無いのですが、より良いコーディングをする為の質問をさせて頂いております。

【58835】Re:複数のオブジェクトに対し類似の処理
お礼  りった  - 08/11/13(木) 13:17 -

引用なし
パスワード
   回答有難う御座います。出来ました。これで気持ちよく書けます。
型の方が違ったのですね。盲点でした。
機能名も御教示頂き有難う御座います。

【58836】Re:複数のオブジェクトに対し類似の処理
発言  neptune  - 08/11/13(木) 13:28 -

引用なし
パスワード
   ▼りった さん:
こんにちは

出来ないと書き込んだら終わってました。
それで確認したんですが、

Excel2000では
「型が一致しません。」エラーが出ます。

'Sheet1モジュールに記述
Sub t()
Dim chk As MSForms.CheckBox
  Set chk = Me.OLEObjects("CheckBox1")
End Sub

Dim chk As OLEObject
と宣言すると正常に実行されます。

Excelのバージョンにより差があるんですかね???

【58837】Re:複数のオブジェクトに対し類似の処理
発言  りった  - 08/11/13(木) 13:50 -

引用なし
パスワード
   いつもお世話になってます。

>'Sheet1モジュールに記述
>Sub t()
>Dim chk As MSForms.CheckBox
>  Set chk = Me.OLEObjects("CheckBox1")
>End Sub

だと2003でもエラーになりました。

nさんの回答の親記事はJakaさんの回答ではなく私の最初の質問です。
下記のようにしました。
 Dim v As Variant
 Dim ch As MSForms.CheckBox

 For Each v In Array(Sheet1.chechboxA, Sheet1.chechboxB, Sheet1.chechboxC)
  Set ch = v
  Debug.Print ch.Value
  ' chを使用する処理色々
 Next

ん〜っ.スリム。こんな質問ばかりで恐縮です。

【58841】Re:複数のオブジェクトに対し類似の処理
お礼  neptune  - 08/11/13(木) 14:58 -

引用なし
パスワード
   ▼りった さん:
こんにちは

あ〜そういうことですか、へぇ〜知りませんでした。
ありがとうございます。

【58844】Re:複数のオブジェクトに対し類似の処理
発言  n  - 08/11/13(木) 15:19 -

引用なし
パスワード
   一応、
'Sheet1モジュールに記述
Sub t()
  Dim chk As MSForms.CheckBox
  Set chk = Me.OLEObjects("CheckBox1").Object
End Sub
これでOKです。

【58849】Re:複数のオブジェクトに対し類似の処理
発言  neptune  - 08/11/13(木) 17:09 -

引用なし
パスワード
   みなさんこんにちは

>これでOKです。
nさんありがとうございます。

りんさん>
私的好みでは少々コーディング量は増えますが、
こんなまとめ方が見通しが良く、改造も楽チンと思うので好きです。

同じく、シートモジュールに書きました。

Private mCol As Collection

Sub t()
  Dim chkBuf As MSForms.CheckBox

  Call SetCollection 'コレクション作成
  
  For Each chkBuf In mCol
    Debug.Print chkBuf.Caption
  Next
  Set mCol = Nothing  '不要になったら後始末^ ^
End Sub

Private Sub SetCollection()
  Dim chk As MSForms.CheckBox
  
  Set mCol = New Collection
  'まぁここの書き方は好きな書き方で。
  Set chk = Me.OLEObjects("CheckBox1").Object
  mCol.Add chk
  Set chk = Me.OLEObjects("CheckBox2").Object
  mCol.Add chk
  Set chk = Me.OLEObjects("CheckBox3").Object
  mCol.Add chk
  Set chk = Nothing
End Sub

4018 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free