[[20191224111652]] 『VBA シートにあるActiveXコントロールについて』(げん) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『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 >


>シートにあるActiveXコントロールのリストボックスを選択するマクロを作成中
確認ですが、なぜ選択したいのですか?

(もこな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

(もこな2 )さん、(´・ω・`)さん、早速の回答ありがとうございます。

リストの内容がファイル名で、繰り返し処理の中でlistプロパティを読み取ってファイルを開いたり閉じたりするときに
アクティブシートが切り替わってしまうのでこれをどうにかできないか、
というのが疑問のはじまりでしたが、これはリストボックス自身をオブジェクト変数化することで解決しました。
しかし試行錯誤を繰り返す中でこのような疑問が発生したので、後学のために質問した次第です。

(´・ω・`)さんの回答で原因がはっきりしていることはわかりましたが、まだ理解が追い付いていません。
これから理解できるようにいろいろ試してみたいと思います。

お二方ありがとうございました。
(げん) 2019/12/24(火) 13:21


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.