[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『ユーザーフォームについて』(よしひろ)
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.