- ベストアンサー
コンボボックスの値で参照するワークシートを変えたい
- ComboBox3で選択した文字列によって、参照するワークシートを変え、そのワークシートからComboBox4に代入するには、以下のコードをどのように書き換えればよいでしょうか?ご教示願います。
- 営業、技術、総務の3つのワークシートをそれぞれ参照したいと考えています。また、それぞれのワークシートには異なった仕事内容の表があります。
- 現在の問題点は、コードを実行しようとすると「実行時エラー91」というエラーが返されることです。また、デバックするとユーザーフォームではなく、標準モジュールの2行目が黄色くなります。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
>...の部分の記述を違うイベント内に書き換えました。 の結果が >Private Sub ComboBox3_Change1() ですか? そのプロシージャ名ではイベント実行されません。 Formモジュールに限らず、SheetモジュールやThisWorkbookモジュールなどに記述するイベントプロシージャは、 VBEコードウィンドウの上部に2つ並んでいるドロップダウンリスト、 [(General) ▼][(Declarations) ▼] の各パートから対象コントロールとイベント種別を選択してコード記述します。 http://excelvba.pc-users.net/fol9/9_3.html それとも Private Sub ComboBox3_Change() のイベントコードから Call ComboBox3_Change1 しているのでしょうか? それはムダな処理です。 また、 Dim te As String teは文字列型変数ですね。Object型変数ではありませんから Set te = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) これではコンパイルエラーです。 また、Select Caseで分岐させる事を考えるのではなく、 >'ComboBox3をクリックして大分類が「営業」の場合 目的のワークシートの名前が "営業" だったら、 A No.1のimogasiさんのアドバイスのように With Worksheets("営業") : とワークシート名で指定できます。 変数teに目的のワークシート名をセットする事ができるなら With Worksheets(te) : で良い事になります。 見直してみてください。
その他の回答 (2)
- end-u
- ベストアンサー率79% (496/625)
>2.デバックするとユーザーフォームではなく、 >標準モジュールの2行目 >UserForm1.Show >が黄色くなります。 そこから[F8]キーを押すたびに1ステップずつ処理がすすみます。 エラー箇所を特定してください。 http://www.asahi-net.or.jp/~ef2o-inue/vba_k/sub04_030.html デバッグは基本です。マスターしてください。 >Select Case t ここで止まるハズです。 t には何もSetされてませんから。 そもそもUserForm_Initializeイベントは >'ユーザーフォームの初期化 と書かれているように、UserFormを読み込む時に走るイベントです。 >ComboBox3で選択した文字列によって、参照するワークシートを変え... ComboBox3を選択するのはユーザー操作ですよね。 ユーザーフォームの初期化イベントではないです。 違うイベント内に書いてください。 その際、 ComboBox3("営業") という書き方はしません。 ValueプロパティやTextプロパティで判定してください。
お礼
3日続けてご丁寧なご回答ありがとうございます。 またもや補足質問を投稿していますが、今回も ご確認くだされば幸いです。
補足
たびたびの補足質問大変恐れ入ります。 end-u様のアドバイスをもとに Select Case t Case Is = ComboBox3("営業") … の部分の記述を違うイベント内に書き換えました。 おかげさまでデバックは発生しなくなりました。 ありがとうございます。 しかし問題点が2つでてきてどうしても解決できません。 ●問題点 1.ComboBox4にWorksheets(5)において予め記載されている 仕事内容が表示されない。 2.F5キーを押したり、エクセルボタン(Alt+F11キー)押すと とWorksheets(1)ではなく、Worksheets(4)が表示される。 追加の質問のようで大変恐縮ですが、この点についても ご教示くだされば幸いです。よろしくお願い申し上げます。 ●書き換えたコード 'ComboBox3をクリックして大分類が「営業」の場合 Private Sub ComboBox3_Change1() Dim te As String te = ComboBox3.Text If te = "営業" Then With Worksheets(5) Set te = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox4 .ColumnCount = 2 .ColumnWidths = ";0" .List = ComboBox4.Value End With Else Call ComboBox3_Change2 End Sub 'ComboBox3をクリックして大分類が「技術」の場合 Private Sub ComboBox3_Change2() (以下は「営業」の場合と同じ)
- imogasi
- ベストアンサー率27% (4737/17069)
自分の作ったコードを長々と書いて回答者に読ませないこと。 デバックは質問者が自己でやる問題だ。データなど他者には見えない、テストできない。 ここは質問者が作ったコードの添削や、デバッグをするコーナーではない。 質問の点を絞ること。又あれやこれやの質問にせず2,3にし、別質問にわけよ。 数個なら箇条書きにでもすること。 ーー >ComboBox3で選択した文字列によって、参照するワークシートを変えなら そもそも、ワークシートを特定する(掴む)のは A.シートのインデクす番号による B.ワークシートの名前による C。その他(略) しかないのだ。A.は使途のタブの位置が変わったりすると変わッ田利するので、普通は名前によって特定する。 この点の勉強がしっかりされていない。 あとはソノシートは s=ComboBox3.text Worksheets(s).Range("a2").Select などを書くだけ。 Sub test01() s = "Sheet3" '"ComboBox3.Text Worksheets(s).Select End Sub シートによって処理を分けるなら、上記のあとの行にしては。 全般的にエクセルVBA(とコントロール)の勉強不足で、自分が学んだ、他の場合で使うコードを強引に他にも使おうとしているようだ。 VBや他言語など経験があっても、エクセル固有の勉強やエクセルVBA固有の勉強などが加えて必要。そういうタイプの 人を連想する。
お礼
お礼が大変遅くなり恐縮です。 imogasi様やend-u様からのご回答を もとにNo.3でのお礼で記述したコードをもって QNo.6845554に対する疑問を解決することが できました。 まだまだ問題が多いと思いますが、 VBAについて少しずつ勉強していきたいと 思います。
お礼
お礼が遅くなり、大変恐縮です。 結局imogasi様のご回答やN0.3のご回答を もとに考えたところ、下記のコードに書き換えると 補足質問で申し上げた問題点が解決できました。 'ComboBox3をクリックしたときの参照先変更 Private Sub ComboBox3_Click() Dim te As String te = ComboBox3.Text With Me.ComboBox4 .ColumnCount = 2 .ColumnWidths = ";0" .List = Worksheets(te).Range("C3", Worksheets(te).Cells(Worksheets(te).Rows.Count, 2).End(xlUp)).Value End With End Sub 'ComboBox4をクリックしたときの処理 Private Sub ComboBox4_Click() With Me.ComboBox4 Me.Label8.Caption = .List(.ListIndex, 1) End With End Sub このコードでも実際に使うとなると、問題が発生する ような気がしますが、それはまた使いながら考える ことにします。 大変ありがとうございました。