|
▼ととりん さん:
おはようございます。
出かけなければいけないので、ざっと見た限りですが・・・。
>はじめまして、ExcelのVBA初心者です。
>質問2577「コンボボックスで選択、そしてまた次のコンボボックスで選択」で私がしたいことの半分はできたのですが、残りができないので教えてください。
>
>まず、2577の内容から...
> A B
>1 東京都 渋谷区
>2 東京都 新宿区
>3 東京都 港区
>4 茨城県 水戸市
>5 茨城県 つくば市
>6 茨城県 ひたちなか市
>. . .
>. . .
>. . .
>
>ユーザーフォームを作り、そこにコンボボックス1、
>コンボボックス2を作ります。
>コンボボックス1で都道府県名を選択し、
>コンボボックス2で、1で選択した都道府県の「区市郡」
>を選択できるようにするにはどうしたらよいのでしょう。
>
>というのが質問内容でした。
>そして、ichinoseさんの返信で
>
>A列が全て空白だった場合のエラー処理をしていませんが、
>A列の重複なしのデータを取り出すのにC列をワークで使いました。
>他の列が都合がよければ変更してください。
>当該フォームモジュールに・・・
>'===============================================================
>Sub set_combo_item(cmb As MSForms.ComboBox, func_str As String)
>'input: cmb データをセットするコンボボックス
>'input: func_str データ抽出のための関数式
> Dim rng As Range
> Dim rng2 As Range
> Dim rng3 As Range
> With ThisWorkbook.Worksheets(1)
> Set rng = .Range("a1", .Range("a65536").End(xlUp))
> End With
> rng.Offset(0, 2).Formula = func_str
> rng.Offset(0, 2) = rng.Offset(0, 2).Value
> Set rng2 = rng.Offset(0, 2).SpecialCells(xlCellTypeConstants)
> cmb.Clear
> For Each rng3 In rng2
> cmb.AddItem rng3.Value
> Next
> cmb.ListIndex = 0
> rng2.Value = ""
> Set rng = Nothing
> Set rng2 = Nothing
> Set rng3 = Nothing
>End Sub
>'==============================
>Private Sub ComboBox1_Change()
> Dim func_str As String
> func_str = "=if(a1=""" & ComboBox1.Text & """,b1,"""")"
> Call set_combo_item(ComboBox2, func_str)
>End Sub
>'==========================================================
>Private Sub UserForm_Initialize()
> Dim func_str As String
> func_str = "=if(countif($a$1:a1,a1)>1,"""",a1)"
> Call set_combo_item(ComboBox1, func_str)
> func_str = "=if(a1=""" & ComboBox1.Text & """,b1,"""")"
> Call set_combo_item(ComboBox2, func_str)
>End Sub
>
>上記で2577の内容はできました。
>
>私が、この続きでしたいことは、
>フォームにコマンドボタンを配置し、クリックをするとコンボボックス1と2に表示された内容を、シート2のA列とB列の上から入力をしていきたいのです。
>(上からというのは、1行目からデータが入力されているかどうかを検索し、
>空白行が見つかったら、その行から入力したいという意味です。)
>
>それを私なりに考え、下記のコードを入力しました。
>
>Private Sub InputBtn_Click()
> '変数の宣言
> Dim CelPos As Integer
> Dim CelNo As String
>
> Set WS = Worksheets(2)
>
> Do
> CelPos = CelPos + 1
> CelNo = "A" & CelPos
> Rtn = WS.Range(CelNo).Value
> Loop While Rtn <> ""
>
> '空白のセルが見つかったら、テキストボックスのデータを書き込む
> CelNo = "A" & CelPos
> WS.Range(CelNo) = UserForm1.ComboBox1.Text
'UserForm1.ComboBox1.Text = "" ←これ止めて・・・
' 原因は、↑このステートメントですね?
' コンボックスの内容が変更した時点で
' ComboBox1_Changeイベントが実行してしまいます。
' 最初にフォームを表示した状態に戻すなら
> CelNo = "B" & CelPos
> WS.Range(CelNo) = UserForm1.ComboBox2.Text
'UserForm1.ComboBox2.Text = "" ' ←これも止めて・・
ComboBox1.listindex=0
' ↑このコードを入れて下さい。
' 他のコントロールでもそうですが、
' Changeイベントを使っているときはそのコントロールをコードで
' 変更するような場合、注意が必要です。
' 場合によっては、フラグを作ってイベントコードを実行するか否かの
' 制御をしなければなりません。
> End Sub
>
>これで実行すると、
>ichinoseさんの返信の
>
> Set rng2 = rng.Offset(0, 2).SpecialCells(xlCellTypeConstants)
>
>で引っかかってしまいます。
>
>解決方法がわからずに悩んでいます。
>上記内容の補足、修正、または別の解決方法を教えてください。
>よろしくお願いいたします。
>
>文章が長くなってしまい申し訳ありません。
確認してみて下さい。
|
|