Excel (VBA)

Excel VBAに関するフォーラムです。
  • 掲示板への投稿には会員登録(無料)が必要です。会員登録がまだの方はこちら
  • 掲示板ご利用上のお願い」に反するご記入はご遠慮ください。
  • Q&A掲示板の使い方はこちらをご覧ください
トピックに返信
質問

 
(Windows 10 Pro : Excel 2016)
Excelシート上に配置されたフォームコントロールのcheckboxの特定
投稿日時: 21/08/14 18:01:26
投稿者: aa_ii_uu

Excelシート上に100個ほどのチェックボックス(フォームコントロール)が配置されております。
VBAにてその100個それぞれの値を取得したいと思ったのですが、チェックボックス名が同じものが複数あり(恐らくチェックボックスをコピペして使っている)、特定がうまくいきません。
//コード例
If ws.CheckBoxes("Check Box 140").Value = xlOn Then Arr_info(16) = "女性"
このようなコードで、シート上に配置されているチェックボックス一個ずつの値を調べて、その結果を配列に入れていこうと思ったのですが、例でいくと「Check Box 140」という名前のチェックボックスがシート上に複数あり、エラーになる状況です。Nameが重複していない場合はエラーは出ないです。
セルとリンクはしておりません。
 
シートに配置されているフォームコントロールのチェックボックスを特定することは不可能なのでしょうか。NameとIndexは重複したものが表示され特定不可能でした。
IDなどがあれば…思ったのですがプロパティに見当たらず…。
 
ちなみに、過去社内で使っていた300個のブックの内容を自動で読み取って集約するということなので、シート上のチェックボックスを何かすることは出来ません。
 
何かいい案をご存じの方はご教示いただけないでしょうか。
よろしくお願いいたします。
(初めて質問を投稿しますので足りない点などありましたら教えてください。)
 

回答
投稿日時: 21/08/14 20:04:36
投稿者: simple

TopLeftCellでそのCheckboxの位置を調べ、
上から順に(同じなら、左を優先して)並べ替える(*)ことによって
そのCheckBoxの名前をマクロで振り直すことが考えられます。
(*の部分の手法は目処が付く感じです)
 
ただ、
>過去社内で使っていた300個のブックの内容を自動で読み取って集約するということなので、
>シート上のチェックボックスを何かすることは出来ません。
ということなので、名前の付け替えは不可なんですか?
その場合は、上記はボツになりますね。
 
その縛りをもう少し具体的に書いたほうが回答は付きやすいでしょうね。
(提案してもNG連発されるのも、余りよい気持ちはしないでしょうから。)

投稿日時: 21/08/14 20:53:34
投稿者: aa_ii_uu

simple様
 
早速のご回答ありがとうございます!
>TopLeftCellでそのCheckboxの位置を調べ、
>上から順に(同じなら、左を優先して)並べ替える(*)ことによって
>そのCheckBoxの名前をマクロで振り直すことが考えられます。
なるほど、チェックボックスの位置を利用するということですね!思いつきませんでした。
 
シート上のチェックボックスを今からフォームコントロール→ActiveXに変える等は不可能と思っていたので
>シート上のチェックボックスを何かすることは出来ません。
と記載しましたが、ブック保護もかかってないですし今後このブックを何かに使うわけではなく
とにかくデータを抽出したいだけなのでこの方法で行ける気がします。
今からこの方法で試してみます!また出来ましたらこちらに投稿させていただきます!
本当にありがとうございます。

回答
投稿日時: 21/08/14 21:04:57
投稿者: 半平太

1.CheckBoxes("Check Box 140") と Arr_info(16)の16 はどんな紐づけ関係にあるんですか?
 
2.Indexが重複することはあり得ないと思いますけども。。

For i = 1 To ws.CheckBoxes.Count
    Debug.Print ws.CheckBoxes(i).Name; " ← " & i & "番目/全" & ws.CheckBoxes.Count & "個"
Next i

投稿日時: 21/08/14 22:08:56
投稿者: aa_ii_uu

半平太様 ご回答ありがとうございます!
 
>1.CheckBoxes("Check Box 140") と Arr_info(16)の16 はどんな紐づけ関係にあるんですか?
→チェックボックスの名称(140にあたる部分)は上から順になっておらずバラバラなので、添え字とは無関係ですm(_ _)mわかりづらくてすみません。
 
>2.Indexが重複することはあり得ないと思いますけども。。
>For i = 1 To ws.CheckBoxes.Count
> Debug.Print ws.CheckBoxes(i).Name; " ← " & i & "番目/全" & ws.CheckBoxes.Count & "個"
>Next i

私が確認したindexというのは
For Each c In ActiveSheet.CheckBoxes
 Debug.Print c.Index, c.Name
Next c
このCheckBoxesプロパティのIndexなのですがこのコードだと、c.Nameが同じチェックボックスはc.Indexも同じになり…。なのでコピーしたチェックボックスはIndexの値も一緒になってしまうのか?と思っていました。ですが、確かに、半平太様のコードのようにiを使ってこちらで名称を設定すれば一意の名称にできますね!
 
ちょっとこちらの方法も取り入れて実装してみます。ありがとうございます!!
 
 

回答
投稿日時: 21/08/17 20:36:36
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

私が確認したindexというのは
For Each c In ActiveSheet.CheckBoxes
 Debug.Print c.Index, c.Name
Next c

  
Shapeオブジェクトには、Index というプロパテイはありません。
  
半平太さんの質問の↓
引用:

1.CheckBoxes("Check Box 140") と Arr_info(16)の16 はどんな紐づけ関係にあるんですか?

の回答でNameとの関係になっていると思います。
  
CheckBoxes(I)
のように変更しただけでは、解決しませんよね・・・・・
 
For i = 1 To ws.CheckBoxes.Count
    ws.CheckBoxes(i).Name = "CheckBox & format(i,"000")
Next i
のように一意となる名前に変更し、Arr_info(i)と同じになるよう変更することではないでしょうか?

回答
投稿日時: 21/08/17 21:51:04
投稿者: simple

今晩は。
 
> Shapeオブジェクトには、Index というプロパテイはありません。
それはCheckbox型オブジェクトではないですか?
Indexプロパティもあったかと思います。
 
(名前付け替えのコードを書いた時の記憶なので、あやふやですけど)

回答
投稿日時: 21/08/17 22:23:50
投稿者: WinArrow
投稿者のウェブサイトに移動

simple さんの引用:
今晩は。
 
>
 Shapeオブジェクトには、Index というプロパテイはありません。
それはCheckbox型オブジェクトではないですか?
Indexプロパティもあったかと思います。
 
(名前付け替えのコードを書いた時の記憶なので、あやふやですけど)

 
わ〜〜〜〜
大変な間違いをしてしまいました。
.Checkbox
と書くところ、
なぜか
.Shape
とかいてテスト押していました。
このコメントを無視してください。
申し訳ありませんでした。
 

回答
投稿日時: 21/08/18 17:07:33
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:
>1.CheckBoxes("Check Box 140") と Arr_info(16)の16 はどんな紐づけ関係にあるんですか?
→チェックボックスの名称(140にあたる部分)は上から順になっておらずバラバラな

 
再質問
>CheckBoxes("Check Box 140") と Arr_info(16)の16 はどんな紐づけ関係にあるんですか?
ばらばらとかではなく、
対応表などは、存在するのでしょうか?

回答
投稿日時: 21/08/21 08:09:11
投稿者: WinArrow
投稿者のウェブサイトに移動

引用:

VBAにてその100個それぞれの値を取得したいと思ったのですが、チェックボックス名が同じものが複数あり(恐らくチェックボックスをコピペして使っている)、特定がうまくいきません。
//コード例
If ws.CheckBoxes("Check Box 140").Value = xlOn Then Arr_info(16) = "女性"

↑の説明から、
チェックボックス100個分の条件を記述すると推測されます。
実際には、どの様になっているのでしょうか?

回答
投稿日時: 21/08/22 17:59:33
投稿者: コレ

 チェックボックスのTextプロパティが”女性”なのでしょうか?
それとも、チェックが付いているのが女性という意味になっているのでしょうか?
 
全てのチェックボックスを拾うには、For each 〜Nextで回してみてはどうでしょうか?
上記疑問点があるため解決の一助となればと思います。
 
下記コードは、チェックが付いているチェックボックスだけを、
Top=10
Leftを横一列に並べるようにしました。
 
Sub CheckBoxFind()
    Dim myCheck As CheckBox
    Dim WS As Worksheet
    Dim BeCheck As CheckBox
    Dim Cnt As Integer
     
    Set WS = ThisWorkbook.Worksheets(1)
     
    For Each myCheck In WS.CheckBoxes
        If myCheck.Value = xlOn Then
            Cnt = Cnt + 1
            Debug.Print myCheck.Text
            With myCheck
                If BeCheck Is Nothing Then
                    .Left = 0
                Else
                    .Left = BeCheck.Left + BeCheck.Width
                End If
                .Top = 10
            End With
            Set BeCheck = myCheck
        End If
    Next myCheck
     
End Sub
 
コメントを読んだわけではないので主旨と違った場合はスルーしてください。

トピックに返信