[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/04/20(Thu) 19:37
投稿者名:ふく
Eメール:
URL :
タイトル:
非コントロール配列のループ処理
こんばんわいつも参考にさせて頂いています。

コントロール配列になっていないチェックボックスの状態を参照したいのですが、
  ”Check1,Check2...Check32"とデフォルトの名前が付いています”
数が多く力技では大変苦しく、仕様変更に苦労しています。
オブジェクト名の数字の部分を利用してループをまわして処理をと思ついたのですが、

どのようにコードすればよいか判らず困っています。
参考になるサンプルなどをご教授お願いします。

投稿時間:2006/04/20(Thu) 19:59
投稿者名:K.J.K.
Eメール:akiya@koalanet.ne.jp
URL :
タイトル:
Re: 非コントロール配列のループ処理
FormのControlsプロパティに対して、For Eachステートメントと
TypeName関数を組み合わせて処理してみるとか。

投稿時間:2006/04/20(Thu) 20:42
投稿者名:花ちゃん
Eメール:
URL :
タイトル:
Re: 非コントロール配列のループ処理
> どのようにコードすればよいか判らず困っています。
> 参考になるサンプルなどをご教授お願いします。

hhttp://www.bcap.co.jp/hanafusa/VBHLP/sonota_kowaza.htm#zenkontoror

投稿時間:2006/04/20(Thu) 23:49
投稿者名:Blue
Eメール:
URL :
タイトル:
Re: 非コントロール配列のループ処理
Dim i As Long

For i = 1 To 32
    Me.Controls("Check" & CStr(i)).Value = 1
Next

とか

Dim i As Long

For i = 1 To 32
    CallByName(Me, "Check" & CStr(i), VbGet).Value = 1
Next

とか。

投稿時間:2006/04/21(Fri) 08:33
投稿者名:ふく
Eメール:
URL :
タイトル:
取り急ぎお礼
K.J.Kさん、花ちゃんさん、Blueさん
回答ありがとうございます。
早速試してみますが、月曜までネット環境がないので、
取り急ぎお礼まで、また状況を報告させていただきます。

投稿時間:2006/04/22(Sat) 17:05
投稿者名:neptune
Eメール:
URL :
タイトル:
Re: 取り急ぎお礼
見るのは、月曜になりそうですが、

ループ処理なら
Collectionに格納しておくとか。
はどうでしょう?

投稿時間:2006/04/23(Sun) 13:13
投稿者名:Say
Eメール:
URL :
タイトル:
Re^2: 取り急ぎお礼
> 見るのは、月曜になりそうですが、
>
> ループ処理なら
> Collectionに格納しておくとか。
> はどうでしょう?

私なら、起動時にObject型配列に放り込みます。

投稿時間:2006/04/23(Sun) 19:43
投稿者名:Blue
Eメール:
URL :
タイトル:
Re^3: 取り急ぎお礼
> 私なら、起動時にObject型配列に放り込みます。
CheckBox型配列ではなんかまずいんでしょうか?

投稿時間:2006/04/23(Sun) 20:49
投稿者名:neptune
Eメール:
URL :
タイトル:
Re^4: 取り急ぎお礼
> > 私なら、起動時にObject型配列に放り込みます。
> CheckBox型配列ではなんかまずいんでしょうか?
Sayさんではないですが、Object型と書いてますが、私は、
広い意味でのCheckBox型等のObjectを指しているように解釈しました。

CollectionよりこちらのほうがBetterなんですかね?
CollectionもKeyが指定できるから便利とは思うんですけど?
変数の使い方によりますかね?

投稿時間:2006/04/24(Mon) 11:18
投稿者名:ふく
Eメール:
URL :
タイトル:
***型配列とコレクション?
neptuneさん、Sayさん、Blueさん、回答ありがとうございます。

> > > 私なら、起動時にObject型配列に放り込みます。
> > CheckBox型配列ではなんかまずいんでしょうか?
> Sayさんではないですが、Object型と書いてますが、私は、
> 広い意味でのCheckBox型等のObjectを指しているように解釈しました。

宣言部で
Dim myCheck As Object
または
Dim myCheck As CheckBox
という意味に捉えてよろしいでしょうか?

> CollectionよりこちらのほうがBetterなんですかね?
> CollectionもKeyが指定できるから便利とは思うんですけど?
> 変数の使い方によりますかね?

Collection,をHelp等で検索してみましたが、
実力不足で理解できない結果に終わってしまいました。
砕いて、ご教授いただけるか、参考サイト等示していただけると
幸いです、よろしくおねがいします。

投稿時間:2006/04/24(Mon) 11:07
投稿者名:ふく
Eメール:
URL :
タイトル:
現状報告 非コントロール配列のループ処理
改めまして、
K.J.Kさん、花ちゃんさん、Blueさん、neptuneさん、Sayさん
回答ありがとうございました。

下記のコードで、今回の仕様変更は対応できそうです。
ありがとうございました。

Controls(i)で、コントロールを順次参照するとき、
参照する順序はどのように決まるのでしょうか?
また、順序の変更はできるのでしょうか?
恐れ入りますが、再びご教授お願いします。

順序は、貼り付け順でもなく、
コントロールの種類に分かれているでもなく…
TabIndex順でみなく…


以下、今回試作コード(どちらかを使う予定)

Private Sub Command1_Click()

Dim myCheck As Object
'Dim myCheck As CheckBox
Dim i As Long

    For i = Controls.Count - 1 To 0 Step -1

        If TypeName(Controls(i)) = "CheckBox" Then
            Set myCheck = Me.Controls(i)
                If myCheck.Value = 1 Then
                    MsgBox (myCheck.Name)
                End If
        End If
    Next i

End Sub

Private Sub Command2_Click()
Dim i As Long

For i = 1 To 8
    If Me.Controls("Check" & CStr(i)).Value = 1 Then
        MsgBox ("Check" & CStr(i))
    End If
Next i

End Sub

投稿時間:2006/04/24(Mon) 16:20
投稿者名:ダンボ
URL :
タイトル:
Re: 現状報告 非コントロール配列のループ処理
ふく さん、こんにちは

> Controls(i)で、コントロールを順次参照するとき、
> 参照する順序はどのように決まるのでしょうか?
IDEに新規追加した順番じゃないかな。名前もその順番で決まるし。

> また、順序の変更はできるのでしょうか?
基本的には順序を変えられると思わないほうが良いのでは。フォームを
テキストエディタで開いてコントロールの記述順番を換えればできそうな
気もするけれど(未確認)、そんなことをする位なら名前を付け直したほうが
ましな筈。

> 以下、今回試作コード(どちらかを使う予定)
方式2はまずいでしょう。
コントロールを削除したらその名前も欠番になり、連番という保証は無いです。
で方式1を、コントロール配列と考えるとふくさんのコーディングになり、
コントロール・コレクションと考えると下記コードかな。(コードは手打ちなので未試験)

Private Sub Command1_Click()
Dim CNT As Object
    For Each CNT in Controls
         If TypeName(CNT) = "CheckBox" Then
                 If CNT.Value Then
                     MsgBox (CNT.Name)
                 End If
         End If
     Next CNT
End Sub

投稿時間:2006/04/27(Thu) 11:30
投稿者名:ふく
Eメール:
URL :
タイトル:
Re^2: 現状報告 非コントロール配列のループ処理
ダンボさん回答ありがとうございます。

コントロール参照順序の件、
不可能もしくは、やるだけ無駄と解釈させていただきます。

又、仕様2での不具合の指摘、
コントロール・コレクションでのコード例の提示
ありがとうございます。
(貼り付けで、動作しました。)

フォーム上の仕様変更(チェックボックスの削除)は無いという前提条件のもと、
手っ取り早くいこうかと思ったのですが、
今後につながりませんので、オブジェクト型配列(?)を使用して見ました。

新しく追加された順に参照していくので、
for文で 後ろから回していくか、方式2のように強引にまわすか
順序を変えるか、の選択となりました。

最終的には、For文を後ろから回すこととなりそうです。

回答いただきました
K.J.Kさん 花ちゃんさん Blueさん neptuneさん Sayさん ダンボさん
ありがとうございました。