Excel VBA ユーザフォームの検索について

このQ&Aのポイント
  • Excel VBAでユーザフォームを作成し、検索機能を実装したい場合に発生するエラーについて質問です。
  • ユーザフォームの初期化時に、特定のシートからリストを取得し、ComboBoxに表示する処理にエラーが発生しています。
  • エラーの内容が「実行時エラー9 インデックスが有効範囲にありません」と表示されています。
回答を見る
  • ベストアンサー

Excel VBA ユーザフォームの検索について

添付の画像のようなユーザフォームを作っています。 TextBox1に検索ワードを入力して、CommandButton1をクリックすると、下のComboBox1に一覧が出るようにしたいと思い、ほかのサイトから下記のコードを見つけて、作ってみました。参照先のsheet2を表示しているときは大丈夫なのですが、別のシートを選んでいるとエラーになります。 sheetは3つあり、それぞれ違うリストが入力されています。今回はsheet2のリストを参照したいのですが、最初はsheet1が表示されている状態で実行したいです。 エラーの内容は 実行時エラー9 インデックスが有効範囲にありません。 コチラがコードです。 Private Sub UserForm_Initialize() Dim i As Long, imax As Long Dim tbl() As Variant imax = ThisWorkbook.Worksheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Row ReDim tbl(imax) For i = 1 To imax tbl(i) = Range("A" & i).Value Next i With ComboBox1 .List() = tbl() End With End Sub Private Sub CommandButton1_Click() Dim i As Long, imax As Long Dim tbl() As Variant Dim cnt As Long, j As Long j = -1 With ThisWorkbook.Worksheets("sheet2") imax = .Cells(Rows.Count, "A").End(xlUp).Row cnt = Application.CountIf(Range("A1:A" & imax), "*" & TextBox1.Text & "*") ReDim tbl(cnt) For i = 1 To imax If InStr(.Range("A" & i), TextBox1.Text) > 0 Then j = j + 1 tbl(j) = Range("A" & i).Value ←この部分がエラーになる End If Next i End With With ComboBox1 .List() = tbl() End With End Sub どこを直せば良いか、教えてください。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • chie65535
  • ベストアンサー率43% (8508/19344)
回答No.3

もう1つ。 宣言文で Option Base 1 と書いてある所はありませんか? これがかいてある場合、配列の添え字は「1から」になります。 Private Sub UserForm_Initialize() の方では ReDim tbl(imax) For i = 1 To imax tbl(i) = Range("A" & i).Value Next i のように、配列の添え字は「1からimaxまで、imax個」になっています。 一方 Private Sub CommandButton1_Click() の方では j = -1 とやってから j = j + 1 tbl(j) = Range("A" & i).Value とやってますから、配列の添え字は「0からcntまで、cnt+1個」のツモリで動い ています。 Option Base 1 が宣言されている場合は、配列の添え字は「1から」ですから「jが0の状態で、tbl(j)に値を入れようとすると、添え字の値がエラーになる」のです。 実は、コレがエラーが出ている「直接の原因」です。 プログラム全体を見直しして「配列を、1番から使うか、0番から使うか、統一しないといけない」です。 現在は、UserForm_Initialize()の方は「1番から使うつもり」になっていて、CommandButton1_Click()の方は「0番から使うつもり」になっていて、整合性が取れていません。 とりあえずは「j = -1」と書いてあるのを「j = 0」に直して、プログラムの先頭行に「Option Base 1」と言う行を追加しましょう。これで「とりあえずはエラーが消える筈」です。 なお「色々なサイトから参考にした」という場合、これ以外にも「整合性がとれてない部分」が多く存在する筈なので、プログラム全体を見直しする必要があるでしょう。隠れたバグは、ここだけでは無い筈です。

その他の回答 (3)

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.4

>Excel VBA ユーザフォームの検索について は表現が不適切。 「Excel VBA ユーザフォームを使っての検索について」 ぐらいならおかしくはないと思うが。 ーー どういう道具立てで、検索しようとしているのか、文章ではっきり説明せよ。 読者に、質問者の、十分でないコードをコピぺして読み解いてくれ、修正して回答してくれと言うのは、質問者として手抜きすぎる。 ーー もう一つの要求は、Sheet1-Sheet3の簡単な模擬実例でも挙げて説明すべきだ。 Sheet1、Sheet2、Sheet3があるらしいが、Sheet2から、Combobox1にリストするのはどういうものか。 Sheet2の役割は何か? 検索語はTextBox1の語とどういう関係にあるのか。 TextBoxとCombobxとの役割はどうなっているのか? ーー シートを検索するのは、普通はFindメソッドを使うが、INSTR関数を使っているのは知らないからか(Find、FindNextは確かにむつかしいが) ーー そういうやりたいこの「仕組み(検索語)と対象」の説明が不足しているとおもう。. ーー すでにご指摘があるが、シートが複数の場合は、神経質ぐらい、繰り返してシート部分から、記述したほうが良いと思う。AvtiveSheetに当たる考えは封印すべきと思う。 プロシの初めに Set Sh1 = Worksheets("Sheet1") Set Sh2 = Worksheets("Sheet2") Set Sh3 = Worksheets("Sheet3") と定義してSh1、Sh2,Sh3のどれかをRange表現の前につけて限定するとか。 ーー Imaxの値は、別モジュールに変数結果を渡すのは高等テクニックなので、注すること。質問のコードではその工夫が見られないようだが。 ーー 質問掲示コードを修正して上げるつもりだったが、やりたいことの仕組みが理解できず諦めた。上記で何かの参考になれば。

  • chie65535
  • ベストアンサー率43% (8508/19344)
回答No.2

なお、UserForm_Initialize()の方も「呼び出した瞬間(ユーザーフォームを初期化した瞬間」のアクティブシートがsheet2じゃなかったら tbl(i) = Range("A" & i).Value の「Range()」は「Sheet2じゃないシート」を参照するので、やはり、誤動作します。 こっちも同様に Private Sub UserForm_Initialize() Dim i As Long, imax As Long Dim tbl() As Variant imax = ThisWorkbook.Worksheets("sheet2").Cells(ThisWorkbook.Worksheets("sheet2").Rows.Count, "A").End(xlUp).Row ReDim tbl(imax) For i = 1 To imax tbl(i) = ThisWorkbook.Worksheets("sheet2").Range("A" & i).Value Next i ComboBox1.List() = tbl() End Sub のようにしないといけません。 あと imax = ThisWorkbook.Worksheets("sheet2").Cells(ThisWorkbook.Worksheets("sheet2").Rows.Count, "A").End(xlUp).Row ではなく imax = ThisWorkbook.Worksheets("sheet2").Cells(Rows.Count, "A").End(xlUp).Row としてしまった場合、1つのブックしか開いてなければ問題ありませんが、旧バージョン(2007より古いバージョン)のEXCELのブックを開いている場合、問題が出る可能性があります。 Excel 2007以前のバージョンで作成したブックを開いていて、そのブックがアクティブになっていると「Rows.Count」の値は「65536」になってしまいます。 しかし、Excel 2007以降のブックは、行数の最大値は「1048576」ですから「入力されている最後の行」を求めるのに失敗してしまいます。 「Range」や「Cells」や「Rows.Count」など「現在アクティブになっているブックの、現在アクティブになっているシートに関連するプロパティやメソッド」を使用する場合は「今、どのブックの、どのシートがアクティブなのか?」を、きちんと把握していなければなりません。 さもないと「シート2をいじってるツモリで、全然ちがうシートをいじってた」なんて事が起きます(それでエラーが起きれば不具合に気付けますが、エラーが起きなければ「実行してる筈なのに、なにも起きない」とか「変な値がセットされる」とか、どうして良いか判らなくなります)

  • chie65535
  • ベストアンサー率43% (8508/19344)
回答No.1

With ThisWorkbook.Worksheets("sheet2") から End With までの間は「Range()やCells()」と「.Range()や.Cells()」は、意味が異なります。 「.Range()」は「ThisWorkbook.Worksheets("sheet2").Range()」を意味します。 一方「Rnage()」は「ActiveSheet.Range()」を意味します。 「Cells()」や「Rows」など、他の物も同様です。 ですので「アクティブシートがsheet2じゃない状態」の場合「Range」や「Cells」は「sheet2じゃないシート」を参照してしまいます。 つまり「Rangeと.Range、Cellsと.Cellsなど、ピリオドがある物とない物が混在してしまっているので、アクティブシートがsheet2じゃないと正常に動作しない状態」になってしまっています。 「アクティブなシートがどこであっても、ちゃんと動くようにしたい」のであれば「With文を使わず、シートの指定をきちんと書く」ようにしましょう。 とりあえず Private Sub CommandButton1_Click() Dim i As Long, imax As Long Dim tbl() As Variant Dim cnt As Long, j As Long j = -1 imax = ThisWorkbook.Worksheets("sheet2").Cells(ThisWorkbook.Worksheets("sheet2").Rows.Count, "A").End(xlUp).Row cnt = Application.CountIf(ThisWorkbook.Worksheets("sheet2").Range("A1:A" & imax), "*" & TextBox1.Text & "*") ReDim tbl(cnt) For i = 1 To imax If InStr(ThisWorkbook.Worksheets("sheet2").Range("A" & i), TextBox1.Text) > 0 Then j = j + 1 tbl(j) = ThisWorkbook.Worksheets("sheet2").Range("A" & i).Value End If Next i ComboBox1.List() = tbl() End Sub のように、With文を一切使わないで、1つ1つ、こまめにシートを指定してみて下さい。

関連するQ&A

  • Excel2010 VBA ユーザーフォーム

    コンボボックスのリストに表示されているときはA列とB列が表示されているのに、 1つをクリックして選択した後はA列しか表示されません 選択した後もそのまま表示を維持したいのですが… ↓こんな感じでやりました Private Sub UserForm_Initialize()   Dim lRow As Long     With Worksheets("Sheet1")       lRow = .Range("A" & Rows.Count).End(xlUp).Row     End With     With ComboBox1       .ColumnCount = 2       .ColumnWidths = "50"       .RowSource = "Sheet1!A2:B" & lRow     End With End Sub よろしくお願いします

  • エクセルVBAプログラム質問 リストボックス応用

    エクセルVBAプログラムについて質問です。 リストボックスから結果をリストボックスに表示させる リストボックスを応用した内容です。 (1)今回追加したいのは、チェックボックスにチェックすることで、 期限が今月中に切れるもののみをリストボックスに表示させたいです。 (2)期限更新ボタンを押したら、3カ月プラスして延長させたいです。 期限更新したら、リストボックスの中身も更新したいです。 例(1):今日の日付 2018/9/23だとしたら、期限切れる(9月分すべて)を表示させたい。 例(2):期限(変更前)『2018/9/23』から期限(変更後)『2018/12/23』に変更 下記のプログラムで追加していきたいです。 Dim myData Private Sub UserForm_Initialize() Dim Dic, Keys, buf As String, i As Long Me.ComboBox1.Style = fmStyleDropDownList Me.ListBox1.ColumnCount = 4 Me.ListBox1.ListStyle = fmListStyleOption Me.ListBox1.MultiSelect = fmMultiSelectMulti Me.CommandButton1.Caption = "印刷" Me.CommandButton1.Enabled = False With Worksheets("DATA") myData = .Range("A1:E" & .Cells(.Rows.Count, 1).End(xlUp).Row) End With Set Dic = CreateObject("Scripting.Dictionary") On Error Resume Next For i = 2 To UBound(myData, 1) buf = myData(i, 1) Dic.Add buf, buf Next i Keys = Dic.Keys For i = 0 To Dic.Count - 1 Me.ComboBox1.AddItem Keys(i) Next i Set Dic = Nothing End Sub Private Sub ComboBox1_Change() Dim i As Long, j As Integer With Me.ListBox1 .Clear For i = 2 To UBound(myData, 1) If Me.ComboBox1.Value = myData(i, 1) Then .AddItem "" For j = 2 To 5 .List(.ListCount - 1, j - 2) = myData(i, j) Next j End If Next i End With End Sub Private Sub ListBox1_Change() Dim i As Long, cnt As Long With Me.ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) Then cnt = cnt + 1 End If Next i End With Me.CommandButton1.Enabled = (1 <= cnt And cnt <= 2) End Sub Private Sub CommandButton1_Click() Dim ws As Worksheet, i As Long, j As Integer, cnt As Byte Set ws = Worksheets("印刷") ws.PageSetup.PrintArea = "$I$2:$P$5" ws.Range("J2:L5,N2:P5").ClearContents With Me.ListBox1 For i = 0 To .ListCount - 1 If .Selected(i) Then ws.Range("J2").Offset(0, cnt).Value = Me.ComboBox1.Value For j = 0 To 2 ws.Range("J5").Offset(j * -1, cnt).Value = .List(i, j) Next j cnt = cnt + 2 End If Next i End With Unload Me ws.PrintPreview End Sub

  • ユーザーフォームがエラーになってしまって困っています。

    VBA初心者なので、テキスト本を参考にユーザーフォームを作ったのですが、エラーになってしまって困っています。 フォーム上のコンボボックス、テキストボックスに入力した値をワークシート上に転記したいのですがエラーが出てしまって先に進めずに困っています。 どなたかお力をお貸し頂けませんでしょうか? Option Explicit Dim TBL(1 To 8) As Control Dim データ範囲 As Range ---------------------------- Private Sub UserForm_Initialize() With Combo会社名 .MatchEntry = fmMatchEntryFirstLetter .ColumnCount = 2 .TextColumn = 1 End With With Combo住所1 .AddItem "東京都" .AddItem "埼玉県" .AddItem "神奈川県" End With Set TBL(1) = Textコード番号 Set TBL(2) = Text登録年月日 Set TBL(3) = Combo住所1 Set TBL(4) = Combo会社名 Set TBL(5) = Text郵便番号 Set TBL(6) =Text住所2 Set TBL(7) = Text 住所3 Set TBL(8) = Text電話番号 Set データ範囲 = Range("A1").CurrentRegion Spin移動.Max = レコード数取得 + 1 If データ範囲.Rows.Count = 1 Then Else データ表示 2 End If End Sub ---------------------------------------- Public Function レコード数取得() As Integer レコード数取得 = Range("A1").CurrentRegion.Rows.Count - 1 End Function ---------------------------------------- Public Sub データ表示(行数 As Integer) Dim Cnt As Integer For Cnt = 1 To 19 TBL(Cnt).Value = データ範囲.Cells(行数, Cnt).Value  ---この部分でエラー Next Textレコード.Value = Spin移動.Value - 1 & "/" & レコード数取得 End Sub ------------------------------------- Private Sub Spin移動_Change() If データ範囲.Rows.Count <> 1 Then データ表示 (Spin移動.Value) End If End Sub ------------------------------------ Private Sub Button追加_Click() Dim AddRow As Integer AddRow = データ範囲.Rows.Count + 1 データ書き込み (AddRow) Textレコード.Text = Spin移動.Value - 1 & "/" & レコード数取得 Set データ範囲 = Range("A1").CurrentRegion Spin移動.Max = データ範囲.Rows.Count Spin移動.Value = データ範囲.Rows.Count データ表示 (AddRow) End Sub ------------------------------------- Private Sub Button更新_Click() データ書き込み (Spin移動.Value) End Sub ------------------------------------- Public Sub データ書き込み(行数 As Integer) Dim Cnt As Integer For Cnt = 1 To 19 データ範囲.celles(行数, Cnt).Value = TBL(Cnt).Value Next End Sub -------------------------------------- Private Sub Button終了_Click() ActiveWorkbook.Save Application.DisplayAlerts = False Unload Me ActiveWorkbook.Close Application.Quit End Sub

  • エクセルVBA  どうしても動きません。

    お世話になります。 なかなか上達しない超初心者です。 ↓↓ですが、Activesheetにすると動くのに、シート名を元々存在するシート”実験"に指定すると動きません(データ内容はまったく同じで、A列に色んな名前が入っていて、重複しているとC列に重複と入力します)。 2日間試行錯誤したのですが、やっぱり動かず・・・ ちなみに、Activateにするとアクティブになるし、CurrentRegionも選択できるのに なんでうごかないんでしょうか・・・ 何卒ご指導くださいませ。よろしくお願いいたします!!!!!! Sub Test2() With Sheets("実験").Range("A1").CurrentRegion Dim i As Long Dim LastRow As Long LastRow = Range("A" & Rows.Count).End(xlUp).Row For i = 1 To LastRow If WorksheetFunction.CountIf(Range("A:A"), Cells(i, 1)) > 1 Then Cells(i, 3) = "重複" End If Next i End With End Sub Sheets("実験")をActivesheetに変えると別のシートがしっかり動いてくれます・・・が、なんとしてでも”実験”シートに動いていただきたいです・・・。

  • ExcelのVBAの配列に関する質問です。

    ExcelのVBAの配列に関する質問です。 sheet1のデータをsheet2に表示するVBAを作成しています。。 sheet1のデータは7行目からスタートし、sheet2のデータは26行目からスタートしています。。 sheet1とsheet2の列は同じ並びではないため、それぞれのシートの列番号をCellsを用いて指定しています。 Sub test1() Dim endrow As Long endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row Dim i As Long Dim j As Long For i = 7 To endrow j = i + 19 Worksheets("sheet2").Cells(j, 1) = Worksheets("sheet1").Cells(i, 2) Worksheets("sheet2").Cells(j, 8) = Worksheets("sheet1").Cells(i, 28) Worksheets("sheet2").Cells(j, 9) = Worksheets("sheet1").Cells(i, 31) Worksheets("sheet2").Cells(j, 10) = Worksheets("sheet1").Cells(i, 32) ・ ・ ・ ※長いので省略 Next i End Sub 上記のtest1は正常に動くのですが、データ量が多いため、処理に時間がかかってしまいます。 高速化できないかと、以下のように変更しました。 Sub test2() Dim dataRange1 As Variant Dim dataRange2 As Variant dataRange1 = Worksheets("sheet1").Range("A1:GI10006") dataRange2 = Worksheets("sheet2").Range("A1:DZ10018") Dim endrow As Long endrow = Worksheets("sheet1").Range("A65536").End(xlUp).Row Dim i As Long Dim j As Long For i = 7 To endrow j = i + 19 dataRange2(j, 1) = dataRange1(i, 2) dataRange2(j, 8) = dataRange1(i, 28) dataRange2(j, 9) = dataRange1(i, 31) dataRange2(j, 10) = dataRange1(i, 32) ・ ・ ・ ※長いので省略 Next i End Sub test2は、エラーメッセージ等は表示されませんが、sheet2にデータが表示されません。 ちなみに、以下のようにsheet1のみ配列化した場合は、正常に表示されました。 Worksheets("sheet2").Cells(j, 1) = dataRange1(i, 2) Worksheets("sheet2").Cells(j, 8) = dataRange1(i, 28) Worksheets("sheet2").Cells(j, 9) = dataRange1(i, 31) Worksheets("sheet2").Cells(j, 10) = dataRange1(i, 32) test2は、どこが間違っているのでしょうか? ご教示ください。 よろしくお願いいたします。

  • エクセルVBA抽出がうまく出来ません

    エクセル2013VBA初心者です。 入力シートからDBシートへ、DBシートから印刷シートへのデータ転記と印刷、入力内容のクリアまでは出来るようになりました。 DBシートの検索を行い、記録内容を入力シートに転記する抽出を行いたいのですが、下記構文を書いたところで問題が発生しました。 If Sh2.Range("A & i").Value = j And Sh2.Range("B & i").Value = k Then  でとまります。メッセージは ‘Range’メソッドは失敗しました:‘Workshieet’オブジェクトというものです。 やろうとしていることは、入力シートに設けた“E12”と”G12”の二つの検索項目をキーにDBシートの行を特定し、この行の内容を入力シートに反映しようということです。 入力シートの検索項目“E12”、 ”G12”はそれぞれDBシートのA列、B列に格納されている項目で、年度と連番です。サンプルとして入力シート"C5"に抽出しようとしているDBシートD列は申請者名です。 恐れ入りますがよろしくご教示頂きたく、お願い申し上げます。 Sub DBシートから力情報を抽出する () Dim Sh1 As Worksheet Dim Sh2 As Worksheet Dim i As Long Dim j As Long Dim k As Long Set Sh1 = Worksheets("入力") Set Sh2 = Worksheets("DB") j = Sh1.Range("E12").Value k = Sh1.Range("G12").Value With Sh2 For i = 2 To .Range("A" & Rows.Count).End(xlUp).Row If Sh2.Range("A & i").Value = j And Sh2.Range("B & i").Value = k Then Sh1.Range("C5").Value = Sh2.Range("D & i").Value End If Next  End With End Sub

  • VBA ユーザーフォーム

    VBA初心者です。以下の様なソースを見つけました。この場合は、文字を検索するとD1 にその該当番号が表示されます。 ※A列には番号、B列には文字列 そうではなく、そのクリックした行のA列にセルが移動し、ユーザーフォームが閉じられる様にできますでしょうか? よろしくお願い致します。 Private Sub ListBox1_Click() Sheets("Sheet1").Range("D1").Value = ListBox1.Value End Sub Private Sub TextBox1_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean) Dim v() As Variant Dim c As Range Dim k As Long ListBox1.Clear With Sheets("Sheet1") With .Range("A1", .Range("A" & .Rows.Count).End(xlUp)) ReDim v(1 To 2, 1 To .Rows.Count) For Each c In .Cells If c.Offset(, 1).Value Like TextBox1.Value & "*" Then k = k + 1 v(1, k) = c.Value v(2, k) = c.Offset(, 1).Value End If Next If k = 0 Then MsgBox "指定の値は存在しません" Else ReDim Preserve v(1 To 2, 1 To k) ListBox1.List = WorksheetFunction.Transpose(v) End If End With End With End Sub

  • ユーザーフォームをWorkSheet(1)に固定

    ●質問の主旨 WorkSheet(1)(「柴田8月分」)にユーザーフォームを固定的に 表示させつつ、WorkSheet(1)以降のWorkSheet(2)、 WorkSheet(3)、WorkSheet(4)の表を参照しながら ComboBox1、ComboBox2、ComboBox3にリストを 選択して、データベースに入力したいと考えています。 以下のコードをどのように書き換えれば良いでしょうか? ご教示のほどよろしくお願い申し上げます。 ●質問の補足 現在のコードでは、ComboBox1、ComboBox2、ComboBox3を それぞれ選択しているとユーザーフォームがそれぞれ WorkSheet(2)、WorkSheet(1)(顧客リスト)、WorkSheet(3)(社員名)、 WorkSheet(4)(大分類)にとんでしまいます。 転記入力が終了すると、また手作業でWorkSheet(1)に戻らなければなりません。 その手作業を回避したいと考えています。 なお添付画像はComboBox1の選択前なのでWorkSheet(1) に留まってくれています。 ●コード Option Explicit 'ユーザーフォームの初期化 Private Sub UserForm_Initialize() Dim r As Range Dim n As Range Dim d As Range With Worksheets(2) Set r = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox1 .ColumnCount = 2 .ColumnWidths = ";0" .List = r.Value End With With Worksheets(3) Set n = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox2 .ColumnCount = 2 .ColumnWidths = ";0" .List = n.Value End With With Worksheets(4) Set d = .Range("C3", .Cells(.Rows.Count, 2).End(xlUp)) End With With Me.ComboBox3 .ColumnCount = 2 .ColumnWidths = ";0" .List = d.Value End With Set r = Nothing Set n = Nothing Set d = Nothing TextBox3.Value = Worksheets(1).Range("A2").Value + 1 txtdate = Date OptionButton1.Value = True End Sub 'ComboBox1をクリックしたときの処理 Private Sub ComboBox1_Click() Worksheets(2).Select With Me.ComboBox1 Me.Label19.Caption = .List(.ListIndex, 1) Worksheets(2).Select Replace:=False End With End Sub 'ComboBox2をクリックしたときの処理 Private Sub ComboBox2_Click() Worksheets(3).Select With Me.ComboBox2 Me.Label20.Caption = .List(.ListIndex, 1) Worksheets(3).Select Replace:=False End With End Sub 'フォームからデータベースへの転記 Private Sub CommandButton3_Click() Dim Rowpos As Long Dim ColPos As Long Rowpos = Worksheets("柴田8月分").Range("a10000").End(xlUp).Row ColPos = 1 Rowpos = Rowpos + 1 With Worksheets("柴田8月分") .Cells(Rowpos, ColPos) = TextBox3.Value .Cells(Rowpos, ColPos + 1) = txtdate.Value .Cells(Rowpos, ColPos + 2) = Label19.Caption .Cells(Rowpos, ColPos + 3) = ComboBox1.Text .Cells(Rowpos, ColPos + 4) = ComboBox2.Text .Cells(Rowpos, ColPos + 5) = Label20.Caption .Cells(Rowpos, ColPos + 6) = ComboBox3.Text End With 'Noの加算 Dim i As Long For i = 1 To 1 Step 1 TextBox3.Value = TextBox3.Value + 1 Next Call Clearcmb End Sub 'データベース入力後にコンボボックスを空欄にする Private Sub Clearcmb() ComboBox1.Text = "" ComboBox2.Text = "" ComboBox3.Text = "" End Sub 'ユーザーフォームの終了 Private Sub CommandButton5_Click() Unload UserForm1 End End Sub 以上よろしくお願い申し上げます。使用機種はWindowsVistaで、 Excel2007です。私はVBA初心者です。

  • エクセルのフォームのVBAについて

    VBAがまったくわからないのに参考書を見て高度な事に挑戦しています フォームは作れてフォームをクリックやら入力やらして作ったOKボタンを押すと シート2のA1B1C1‥の列に入力文字だけが羅列されます。 しかし次にやろうとするとA2B2C2‥と下に行かず又A1B1C1‥の列の文字が変更になり続きません。何がいけないのでしょうか? Sub 入力() Dim LastRow As Long With Worksheets("sheet2") LastRow = Worksheets("sheet2").Range("A" & Rows.Count).End(xlUp).Row .Range("A" & LastRow).Value = Worksheets("sheet1").Range("A5").Value .Range("B" & LastRow).Value = Worksheets("sheet1").Range("A7").Value .Range("C" & LastRow).Value = Worksheets("sheet1").Range("A8").Value .Range("D" & LastRow).Value = Worksheets("sheet1").Range("A10").Value End With End Sub と参考書とおりいれたのですが‥。教えて下さい。

  • VBA ユーザーフォーム

    VBAにおけるユーザーフォームの件 今,下記の様なプログラムを組んでいるのですが,「myComboBox」に入った?値をこの後で使用したいのですが, どうすればいいのかわからなくて困っています. これで何がしたいかというと,ある個数分のコンボボックスを自動で作成して使用しようとしているのです. Private Sub UserForm_Initialize() Dim a As String Dim jj As Long Dim s As Integer Dim myComboBox As Control N = InputBox("抜き出したいデータ数は?") EffectiveRow = Range("A65536").End(xlUp).Row Effectivecolumn = Cells(2, 16384).End(xlToLeft).Column For s = 1 To N Set myComboBox = Me.Controls.Add("Forms.ComboBox.1") With myComboBox .Height = 20 .Width = 150 .Left = 120 .Top = (s - 1) * .Height + 10 End With For jj = 1 To Effectivecolumn myComboBox.AddItem Worksheets(1).Cells(1, jj).Value Next jj a = myComboBox.Value Worksheets(2).Cells(1, 1) = a Next s End Sub