[[20080430091102]] 『ユーザーフォームについて』(よしひろ) ページの最後に飛ぶ

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

 

『ユーザーフォームについて』(よしひろ)
 Sheet1(データ)、Sheet2(展開表)の二つのシートを作成しました。
 ユーザーフォームを作成し、データから集めたものを展開表に貼付しています。
 Sheet1(データ)、Sheet2(展開表)それぞれにコマンドボタンを作成し、ボタンを押すと
 ユーザーフォームが表示される様にしました。
 それで、データシートを選択しているときは問題なくユーザーフォームが表示されるの
 ですが、展開表シートを表示させているときは、「実行時エラー1004 アプリケーション
 定義またはオブジェクト定義のエラーです。」
 というメッセージが表示されます。

 以下に、書いてある構文を載せます。

 Private Sub UserForm_Initialize()
 Dim i As Long, tbl
 tbl = Worksheets("データ").Range("A1", Range("p" & Rows.Count).End(xlUp))
 Set dic = CreateObject("Scripting.Dictionary")
 For i = 1 To UBound(tbl, 1) 'A列
    dic(tbl(i, 2) & tbl(i, 3) & tbl(i, 4) & tbl(i, 5)) = Array(tbl(i, 2), tbl(i, 3), tbl(i, 4), tbl(i, 5), tbl(i, 6), tbl(i, 7))
 Next

 '大分類代入
    Dim mDic1  As Object
    Dim mData1 As Variant
    Dim mD1    As Variant

    Set mDic1 = CreateObject("Scripting.Dictionary")
    With Worksheets("データ")
        mData1 = Worksheets("データ").Range("b1", .Range("b65536").End(xlUp)).Value
    End With
    If Not IsArray(mData1) Then
        mData1 = Array(mData1)
    End If
    On Error Resume Next
    For Each mD1 In mData1
        mDic1.Add mD1, Empty
    Next
    On Error GoTo 0
    UserForm1.ComboBox1.List = mDic1.Keys
    Set mDic1 = Nothing

 ComboBox5.Style = fmStyleDropDownCombo
 ComboBox5.RowSource = ""
 ComboBox5.Clear
 ComboBox5.AddItem "NO.1"
 ComboBox5.AddItem "NO.2" 
   ・
  ・
 end sub

 できたら、展開表シートを選択してユーザーフォーム表示をさせたいのですが、
 worksheets("展開表").select
 userform1.show 0
 では上記と同じエラーメッセージが出てしまいます。
 どこを直したらよろしいのでしょうか
 よろしくお願いいたします。

 excel:2003
 os:xp

 - - - -
 先ほど投稿した(よしひろ)です。
 private sub userform_Initialize() のuserformをuserform1にすると、ユーザーフォームは
 表示させることができました。
 ただ、今度はコンボボックス1の値が表示できなくなりました。
 別のワークシートの値を引っ張ってくることは出来るのでしょうか。


 他読んでないけど。
 >private sub userform_Initialize() のuserformをuserform1にすると、ユーザーフォームは
 >表示させることができました。
 ??????
 Private Sub UserForm_Initialize()
             ^^^^^^^^
                ↑
     この部分を勝手に変えてはダメ。

 追加、
 >Private Sub UserForm_Initialize()
 >Dim i As Long, tbl
 >tbl = Worksheets("データ").Range("A1", Range("p" & Rows.Count).End(xlUp))
    ↑この行にブレークポイントを置いて、form.show後にステップ実行すると
      どこがエラーなのか解ると思います。
 BJ

 BJさん、返信ありがとうございます。
 このサイト等にて検索、若しくは教えていただいた構文をそのまま書いていますので、
 構文については理解せずに使用しております。
 tbl = 〜 の行にブレークポイントを置いて、ステップを実行させると、必ずその行より後はエラーがでます。
 データシートを選択した時は、ユーザーフォームが表示できて、
 展開表シートを選択したときは、エラーがでる。ということは、
 テーブルとして「データシート」を設定しているので、他のシートで参照しようとしても、エラーに
 なる、という解釈でよろしいのでしょうか。


 tbl = Worksheets("データ").Range("A1", Range("p" & Rows.Count).End(xlUp))
の
Range("p" & Rows.Count).End(xlUp) の部分は、Rangeオブジェクトの
親オブジェクト(ワークシートオブジェクト)が明記されていないので、
実行時点でのActiveなシートを親オブジェクトとして暗黙的なインスタンスが
生成されます。しかしながら、取得しようとしているのは、Worksheets("データ")
上のRangeオブジェクトなので、Worksheets("データ")以外のシートが選択
されている場合はRangeオブジェクトの定義と矛盾する(同一シートの左端
上端セルと右端下端セルを対角とする矩形範囲)ので、
「実行時エラー1004」の「オブジェクト定義のエラー」になります。
 
したがって、次のように書く必要があります。
 tbl = Worksheets("データ").Range("A1", Worksheets("データ").Range("p" & Rows.Count).End(xlUp))
 
実はその後に出てくる、
    With Worksheets("データ")
        mData1 = Worksheets("データ").Range("b1", .Range("b65536").End(xlUp)).Value
    End With
 
はこのエラーが起こらないような構文なのですが、違いが判らないのなら、
With 〜 End Withステートメントの解釈を理解する必要があります。
 
(自分の投稿、大幅書き直ししました)
(みやほりん)(-_∂)b


 みやほりんさん、ありがとうございます。
 書き換えたところ、思っていたことが出来ました。
 Worksheets("データ")と最初に記述していたので、それで選択しているものと思っていました。
 With構文については、勉強してみます(よしひろ)

コメント返信:

[ 一覧(最新更新順) ]


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