[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『VBA シートにあるActiveXコントロールについて』(げん)
過去ログ検索でわからなかったので教えてください。
シートにあるActiveXコントロールのリストボックスを選択するマクロを作成中です。
activesheet.listbox1
worksheets("Sheet1").listbox1
dim myList as object
set myList = activesheet.listbox1
という書き方だとうまく動いてくれます。
しかし
dim ws as worksheet
set ws = activesheet
と宣言しておいて
ws.listbox1
という書き方をするとエラーになってしまいます。
(コンパイルエラー: メソッドまたはデータメンバーが見つかりません)
なにかやり方がいけないのでしょうか?
それともこれは仕様なのでしょうか?
またはうまくいくと思っているやり方にも問題があるのでしょうか?
< 使用 Excel:Excel2016、使用 OS:Windows10 >
(もこな2 ) 2019/12/24(火) 12:07
下のEx1 を F8キーでステップ実行してください。 変数wsの型をローカルウインドウで確認すると、 Variant/Object/Sheet1 ←実際はシートのオブジェクト名 になっていると思います。
Sub Ex1()
Dim ws As Variant, myListBox As Object Set ws = ActiveSheet ' ws の型をローカルウインドウで確認 Set myListBox = ws.ListBox1
End Sub
この型が Sheet1型になっているところが重要です。 Sheet1には、「ListBox1」があることがコンパイル時に分かっているので、 コードの中で Set myListBox = ws.ListBox1 と書けます。
Dim ws As Sheet1
とかオブジェクト名を型にしてもいいです。
しかし、 Dim ws as WorkSheet と宣言すると wsはいろんなシートが代入される可能性があって ListBox1があるか、コンパイル時に確定できないのでコンパイルエラーになります。
Ex2のようにするとコンパイルエラーはでません もし、ListBox1が無ければ、実行時エラーになります。 Sub Ex2() Dim ws As Worksheet, myListBox As Object Set ws = Worksheets(1) Set myListBox = ws.Shapes("ListBox1") End Sub (´・ω・`) 2019/12/24(火) 12:21
リストの内容がファイル名で、繰り返し処理の中でlistプロパティを読み取ってファイルを開いたり閉じたりするときに
アクティブシートが切り替わってしまうのでこれをどうにかできないか、
というのが疑問のはじまりでしたが、これはリストボックス自身をオブジェクト変数化することで解決しました。
しかし試行錯誤を繰り返す中でこのような疑問が発生したので、後学のために質問した次第です。
(´・ω・`)さんの回答で原因がはっきりしていることはわかりましたが、まだ理解が追い付いていません。
これから理解できるようにいろいろ試してみたいと思います。
お二方ありがとうございました。
(げん) 2019/12/24(火) 13:21
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.