エクセルマクロ初心者のためのテキストボックス反映方法

このQ&Aのポイント
  • ユーザーフォームにリストボックスとテキストボックスを配置し、リストボックスで選択した管理番号の情報をSheet2に反映する方法を教えてください。
  • テキストボックス1に回答日を入力した場合、選択した管理番号の行の隣の列(B列)に記載されます。テキストボックス2に出荷予定日を入力した場合、選択した管理番号の行の隣の列(C列)に記載されます。テキストボックス3に数量を入力した場合、選択した管理番号の行の隣の列(C列)に記載されます。
  • offsetを使って上記の処理を行おうとしましたが、うまくいきませんでした。どなたか教えていただけないでしょうか?
回答を見る
  • ベストアンサー

エクセルマクロ_テキストボックスをシートに反映

エクセルマクロ初心者です。(2003使用_ユーザーフォーム) ユーザーフォームにリストボックスとテキストボックスを配置しています。リストボックス(Sheet1データを反映)の管理番号データを取得し、Sheet2のA1最終行に記載するところまではできました。 その後、もしテキストボックス1に日付型データ(回答日)があれば、先ほどの管理番号取得行の列のとなり(B列)に記載、空白であれば記載しない。 もしテキストボックス2に日付型データ(出荷予定日)があれば、先ほどの管理番号取得行の列のとなり(C列)に記載、空白であれば記載しない。 もしテキストボックス3にデータ(数量)があれば、先ほどの管理番号取得行の列のとなり(C列)に記載、空白であれば記載しない。 としたいのですが、offsetを使おうとしたのですが、うまくできませんでした。 すみませんが、どなたかご親切な方ご教授よろしくお願いいたします。 (エクセルSheet1=データベース) C5  D5 管理番号   品名       アカ12    りんご       アオ56    みかん       クロ34    なし       クロ89    すいか       アオ12    もも (エクセルSheet2=記入シート) 管理番号 回答日      出荷予定日 数量 アカ12 9月20日       9月23日 100 アオ56            9月21日 800 ↑回答日の記載はない場合もあります。 リストボックス1で選んだ管理番号取得行に一行に内容を表示させたいと思っています。 Private Sub UserForm_Initialize() With ListBox1 .ColumnWidths = "0;0;50;50" .ColumnCount = 4 .RowSource = "Sheet1!A5:D" & Worksheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row End With End Sub Private Sub CommandButton1_Click() Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ListBox1.List(ListBox1.ListIndex, 2) End With (ユーザーフォーム配置)   リストボックス1   テキストボックス1(回答日=9/20)   テキストボックス2(出荷予定日=9/21) テキストボックス3(数量=900)  テキストボックス4(コメント=送り先一部変更あり) すみませんが、どなたかご親切な方ご教授よろしくお願いいたします。

  • kkk-z
  • お礼率50% (17/34)

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

  • ベストアンサー
  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.3

> お手数ですが、テキストボックスで文字を反映させる関数も ちょっと意味が分かりかねますが、文字として判定したいと言うことでしょうか If VarType(TextBox4.Value) = vbString Then .Range("D" & lRow + 1).Value = TextBox4.Value End If か If Not IsNumeric(TextBox4.Value) Then .Range("E" & lRow + 1).Value = TextBox4.Value End If それか両方とも判定条件として If Not IsNumeric(TextBox4.Value) And VarType(TextBox4.Value) = vbString Then .Range("E" & lRow + 1).Value = TextBox4.Value End If とかでしょうか

kkk-z
質問者

お礼

ご丁寧な回答、本当にありがとうございました。 .Range("K" & lRow + 1).Value = TextBox4.Valueでできました。 助かりました。ありがとうございます。

その他の回答 (2)

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.2

訂正 .Range("A" & lRow + 1).Value = ListBox1.List(1, 2) じゃなくて .Range("A" & lRow + 1).Value = ListBox1.List(ListBox1.ListIndex, 2) でした

kkk-z
質問者

補足

早急のご回答どうもありがとうございます。 テキストボックス4(コメント = 送り先一部変更あり) を追加したいと思い、IsDateなどにかわる文字関数があるか調べたのですが、どうしても応用がききませんでした。 お手数ですが、テキストボックスで文字を反映させる関数も教えていただきたく、よろしくお願いいたします。

  • kmetu
  • ベストアンサー率41% (562/1346)
回答No.1

Private Sub CommandButton1_Click() Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ListBox1.List(1, 2) If IsDate(TextBox1.Value) Then .Range("B" & lRow + 1).Value = TextBox1.Value End If If IsDate(TextBox2.Value) Then .Range("C" & lRow + 1).Value = TextBox2.Value End If If IsNumeric(TextBox3.Value) Then .Range("D" & lRow + 1).Value = TextBox3.Value End If End With End Sub でいかがですか

関連するQ&A

  • エクセルマクロ_テキストボックスをシートに反映(その2)

    エクセルマクロ初心者です。(2003使用_ユーザーフォーム) 先ほどは大変お世話になりました。 複数行に応用させようとしたのですが、管理番号が余計に記載(テキストボックス(出荷日など)が空欄であっても、管理番号だけはとられてしまいます)されてしまいます。すみませんが、ご教授よろしくお願いいたします。 リストボックス1のデータは、Sheet1を表示しています。→管理番号はSheet2のA最終行に記載されます。 テキストボックス1(回答日)は、上記の管理番号記載のとなりに、 テキストボックス2(出荷日)は、テキストボックス1記載のとなりに、 ・・・とテキストボックス4(コメント)(これはK列)に1行で記載されます。 ↑ここまでは、教えていただいたので、完璧なのですが、 テキストボックス2~4までの内容を、あと複数行(4件)追加できるように試してみたのですが、空欄であっても管理番号だけは常に記載されてしまいます。 テキストボックス2と5に記載されている場合は、Sheet2に値を反映させるが、空欄の場合は、値を反映させないようにしたいのです。 (Sheet1=データベース) C5   D5 管理番号 品名 アカ12 りんご アオ56 みかん クロ34 なし クロ89 すいか アオ12 もも (Sheet2=入力シート) A(管理番号)    B(回答日)    C(出荷日)   D(数量)     K(コメント) アオ56        8月9日        8月10日      75     送り先の確認 アオ56                    8月11日      80 クロ34        9月4日        9月5日      80 (今回は、2行で作成した場合のマクロを記載しました) Private Sub UserForm_Initialize() With ListBox1 .ColumnWidths = "0;0;50;50" .ColumnCount = 4 .RowSource = "Sheet1!A5:D" & Worksheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row End With End Sub Private Sub CommandButton1_Click() If TextBox2.Value Then Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ListBox1.List(ListBox1.ListIndex, 2) If IsDate(TextBox1.Value) Then .Range("B" & lRow + 1).Value = TextBox1.Value End If If IsDate(TextBox2.Value) Then .Range("C" & lRow + 1).Value = TextBox2.Value End If If IsNumeric(TextBox3.Value) Then .Range("D" & lRow + 1).Value = TextBox3.Value End If .Range("K" & lRow + 1).Value = TextBox4.Value End With End If If TextBox5.Value Then Dim llRow As Long With Worksheets("Sheet2") llRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & llRow + 1).Value = ListBox1.List(ListBox1.ListIndex, 2) If IsDate(TextBox5.Value) Then .Range("C" & llRow + 1).Value = TextBox5.Value End If If IsNumeric(TextBox6.Value) Then .Range("D" & llRow + 1).Value = TextBox6.Value End If .Range("K" & llRow + 1).Value = TextBox7.Value End With End If Dim myCtrl As Control For Each myCtrl In Controls If TypeName(myCtrl) = "TextBox" Then myCtrl.Value = vbNullString End If Next End Sub (ユーザーフォーム) リストボックス1=Sheet1のデータを反映 テキストボックス1(回答日) テキストボックス2(出荷日),テキストボックス3(数量),テキストボックス4(コメント)←1件目 テキストボックス5(出荷日),テキストボックス6(数量),テキストボックス7(コメント)←2件目 ↑1件目のみでコマンドボタンを押した場合は、1件目のみの管理番号取得をしたいのです。が今は、2件目が空欄でも管理番号はとられてしまいます。 長くなってしまいすみません。 どなたかご回答いただければ幸いです。よろしくお願いいたします。

  • Excel オーダーフォームのテキストボックス入力について

    オーダーフォームを作成し、テキストボックスを2つ以上作成し、コマンドボタンを1つ作りました。 同じ行ですべてを入力できるようにしたいのですが、どうしたらよいでしょうか? テキストボックス1の値を入力するためのコマンドは、最下位の行を探してそこに入力するようなコマンドを作っているはずです…その横の列にテキストボックス2の値を入力し、その横の列にテキストボックス3の値を入力し…というようにしていきたいのです。 Private Sub CommandButton1_Click() Dim lRow As Long With Worksheets("sheet1") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = TextBox1.Value End With TextBox1.Value = "" TextBox1.SetFocus End Sub

  • コンボボックスとテキストボックスをセルへ

    コンボボックスのデータを行へ表示されるよう下記の通りやりました。 続けてテキストボックスを指定した同じ行のセルへ入力されるように したいのですが、いろいろ調べたのですが、解決できず ここで助言いただけたらと思います。 また textbox1はA列 textbox2はB列 textbox3はM列 へとコンボボックスのデータを挟む形での入力となります。 ちなみにテキストボックスのプロジェクト名は変更してあります。 Private Sub CommandButton1_Click() Dim lrow As Long, i As Long With Worksheets("製品化") lrow = .Range("F" & Rows.Count).End(xlUp).Row For i = 0 To 6    .Cells(lrow + 1, i + 6).Value = itemname.List(listno, i) Next i End With End Sub

  • コンボボックス or リストボックス (複数列表示→値の取得)

    マクロ初心者です。(エクセル2003使用-ユーザーフォーム) 先日はお世話になり、ありがとうございました。 作成していくうちにさらに改良を加えたく、再質問させていただきます。 ※コンボボックス内の表示を複数行表示(Sheet1の管理番号,品名,注文数量)し、そのデータをSheet2のセルA(管理番号),セルB(品名),セルC(注文数量)と貼り付けようとしております。 が、本で探したところ複数行表示のやり方がリストボックスでしかのっていなく、さらに自分で作成したマクロでは動きませんでした。 すみませんが、お力をお貸しください。 (Sheet1) 担当課 客先 管理番号 品名 注文数量 出荷数量 A 岡田さん 1324 りんご 30 20 B 山田さん 1554 みかん 250 70 C 岡田さん 7634 なし 40 25 B 金子さん 4653 みかん 75 70 A 金子さん 6675 りんご 170 60 C 杉浦さん 7789 りんご 200 120 (↓こちらは、前回質問させていただいた内容です。) Private Sub UserForm_Initialize() ComboBox1.RowSource = "Sheet1! C2:C" & Worksheets("Sheet1").Range("C" & Rows.Count).End(xlUp).Row ←ここを複数行用に変更するのでしょうか?いろいろ試したのですがダメでした。 ComboBox1.ListIndex = -1 ComboBox1.SetFocus End Sub Private Sub CommandButton1_Click() Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ComboBox1.Value End With End Sub (↓こちらは、リストボックスでのマクロですが、動きません) Private Sub UserForm_Initialize() With UserForm2.ListBox1 .ColumnWidths = "70;50;50" .ColumnCount = 3 End With With Worksheets("Sheet1") Dim MyA As Variant Dim i As Long For i = 2 To UBound(MyA, 1) .AddItem .List(i - 2, 0) = Cells(i, 1).Value .List(i - 2, 1) = Cells(i, 2).Value .List(i - 2, 2) = Cells(i, 3).Value Next End With End Sub Private Sub CommandButton1_Click() Dim lRow As Long With Worksheets("Sheet2") lRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & lRow + 1).Value = ListBox1.Value End With End Sub 教えていただけましたら幸いです。 よろしくお願いいたします。

  • リストボックスでデータを呼び出し→修正を反映させる方法を教えてください

    マクロ初心者です。(エクセル2003使用_ユーザーフォーム) リストボックスで表示した行のデータをユーザーフォームに呼び出し、修正を加える方法を教えてください。 (Sheet1のデータ) 客先 管理番号 品名 注文数量 出荷数量 出荷日 完納状況 G社  1324   パソコン    30    20 K社  1554   プリンタ    250    70    8月9日 J社  7634   テレビ      40    25 K社  4653   パソコン    75    75    6月4日  完納 G社  6675   パソコン    170    60 G社  7789   プリンタ    200    120 表の行数は、日々変動し、出荷日や完納状況欄は、分かり次第記入や変更をするため、空白の箇所もあります。 (コマンドボタン1まで動く(日付が数字になってしまうが)コード) Private Sub UserForm_Initialize()   With ListBox1 .ColumnWidths = "50;50;50" .ColumnCount = 2 .RowSource = "Sheet1!A2:G" & Worksheets("Sheet1").Range("G" & Rows.Count).End(xlUp).Row End With End Sub            →リストに表示されるが、本当は<管理番号>と<品名>を表示させたいです。(今は、客先と管理番号です) Private Sub CommandButton1_Click() TextBox1.Value = ListBox1.List(ListBox1.ListIndex, 5) →日付が数字ででてしまいます。 TextBox2.Value = ListBox1.List(ListBox1.ListIndex, 6) End Sub Private Sub CommandButton2_Click() TextBox1.Value = ListBox1.List(ListBox1.ListIndex, 5) →動きません。 TextBox2.Value = ListBox1.List(ListBox1.ListIndex, 6) →動きません。 End Sub 空白は、空白のまま表示させたり、修正したいと思っています。 (例 管理番号1554の日付を8月14日にのみ修正したい時、そこは修正し、完納欄は空白のまま表示され、空白の状態でコマンド2を押すことができてほしいということです) すみませんが、どなたかご回答よろしくお願いいたします。

  • マクロ初心者です。エクセルのあるシートにテキストボックスが2個張り付い

    マクロ初心者です。エクセルのあるシートにテキストボックスが2個張り付いてます。 テキストボックスの番号はわからず任意に変化します。この2つのテキストボックスの番号を取得するマクロを教えて下さい。(テキストボックスの番号とは、テキストボックスを選択した時に名前ボックスに表示される番号のことです。)

  • リストボックスから複数行を選択し、その複数のデータをセルに入力したい

    Excel2003でマクロをつくっています。シートのB列を右クリックすると、リストボックスが表示され 任意1行を選択するとシートのB列、C列、D列のセルにデーターが入力されます。 Private Sub ListBox2_Click() With ListBox2 If .ListIndex = -1 Then MsgBox "項目を選択してくだい" Else ’シートが保護されていたら保護を解除 If ActiveSheet.ProtectContents = True Then ActiveSheet.Unprotect End If ActiveCell.Value = ListBox2.List(ListBox2.ListIndex, 0) ActiveCell.Offset(0, 1).Value = ListBox2.List(ListBox2.ListIndex, 1) ActiveCell.Offset(0, 2).Value = ListBox2.List(ListBox2.ListIndex, 2) ActiveSheet.Protect End If End With Unload UserForm3 End Sub このリストボックスから複数の行を選択し、シートのB列、C列、D列のセルにデーターを入力したいのですが、Multiselectプロパティを変更しても、一行のみしか入力できません。 上のコードをどうかえたらよろしいでしょうか。

  • エクセルマクロ_上書き(リストボックスでデータを抽出し、その行へ上書き)

    エクセルマクロ初心者です。(2003使用_ユーザーフォーム,リストボックス,テキストボックス,チャックボックス) Sheet1のデータをユーザーフォームへ反映させ、修正したものをその行へ上書きするマクロを作成したいと思っていますが、うまくいかないのでどなたかお教え願います。 (Sheet1―A8より表がはじまります) 管理番号 品名 数量 希望納期 変更数量 完納 コメント アカ12 みかん     40   8月3日 アオ35 りんご     30   8月5日 クロ54 なし     50   7月7日 アカ98 もも     20   9月1日 アオ43 すいか     35   8月3日 ●完納の行がチャックボックスで、チェックがついたら、”完納”と記載、チェックがついていなかったら空欄のまま。もし表に”完納”と記載されていたら、コマンドボタン1でデータを抽出した時に、チェックがつくようにしたいのです。が、まったくうまくいかないのです。 ●また、コマンド1での抽出データに値を入力したものを上書きすることは一部できるのですが、空欄にしたときに、空欄の状態(無記入)に上書きすることができません。 Private Sub UserForm_Initialize() Dim r As Range Set r = Sheets("Sheet1").Range("A8").CurrentRegion.Offset(1) Set r = r.Resize(r.Rows.Count - 1) With ListBox1 .ColumnWidths = "50;50;0;0;0;0;0" .ColumnCount = 7 .RowSource = r.Address(A8, G) End With End Sub Private Sub CommandButton1_Click() If ListBox1.ListIndex <> -1 Then TextBox1.Value = ListBox1.List(ListBox1.ListIndex, 0) TextBox2.Value = ListBox1.List(ListBox1.ListIndex, 1) TextBox3.Value = ListBox1.List(ListBox1.ListIndex, 2) TextBox5.Value = ListBox1.List(ListBox1.ListIndex, 4) TextBox6.Value = ListBox1.List(ListBox1.ListIndex, 6) End If If Not IsEmpty(ListBox1.List(ListBox1.ListIndex, 3)) Then TextBox4.Value = Format(CDate(ListBox1.List(ListBox1.ListIndex, 3)), "m/d") Else TextBox4.Value = "" End If End Sub Private Sub CommandButton2_Click() If ListBox1.ListIndex <> -1 Then Dim r As Range ' 元データの範囲を取得 Set r = Sheets("Sheet1").Range("A8").CurrentRegion.Offset(1) Set r = r.Resize(r.Rows.Count - 1) ' 日付型かどうかをチェック If IsDate(TextBox4.Value) Then ' 選択されたセルの更新 r(ListBox1.ListIndex + 1, 4) = TextBox4.Value End If r(ListBox1.ListIndex + 1, 7) = TextBox6.Value End If End Sub Private Sub CheckBox1_Click() If ListBox1.ListIndex <> -1 Then Dim l As Range Set l = Sheets("Sheet1").Range("A8").CurrentRegion.Offset(1) Set l = l.Resize(l.Rows.Count - 1) If CheckBox1.Value = True Then l(ListBox1.ListIndex + 1, 5).Value = "完納" If CheckBox1.Value = False Then l(ListBox1.ListIndex + 1, 5).Value = "<>" End If End If End If End Sub すみませんが、ご親切に教えていただけましたら幸いです。 よろしくお願いいたします。

  • Excel マクロ リストボックス複数選択

    いろいろ拝見させていただいているのですが 理解が低いのが原因で困っています。 データのシートがあります。 ・B列には、起点となる人の名前が記載(300名ほど) ・データの入っている列は、A:CE データシートでB列にてオートフィルタをかけ 抽出シートに転記したい。 抽出シートでは、ユーザーフォームを組みました。 オプションボタン1 単一選択 オプションボタン2 複数選択 オプションボタン3 拡張選択 リストボックス(2・3に対して) コマンドボタン   終了 とした場合、単一選択はできたのですが 複数選択の場合 該当数が「0」の表記となってしまい、うまくいきません。 同じような質問が…というお返事があることを承知でお伺いしています。 いただいた回答を基に、勉強をしていきたいと思っていますので なにとぞよろしくお願い申し上げます。 Private Sub UserForm_Initialize() ListBox1.ColumnCount = 1 'リストボックスの列は1 ListBox1.BoundColumn = 0 'ListIndexの値(行数)を使用する ListBox1.MultiSelect = 0 '最初は単一選択状態にする ListBox1.RowSource = 'リストのソース ListBox1.ColumnHeads = True '列見出し表示 OptionButton1.Value = -1 'オプションボタン1を選択状態にする End Sub Private Sub OptionButton1_Click() ListBox1.MultiSelect = fmMultiSelectSingle '単一選択状態にする End Sub Private Sub OptionButton2_Click() ListBox1.MultiSelect = fmMultiSelectMulti '複数選択状態にする End Sub Private Sub OptionButton3_Click() ListBox1.MultiSelect = fmMultiSelectExtended '拡張(連続)選択状態にする End Sub Private Sub ListBox1_Click() 'リストボックスがクリックされたとき(単一選択) Dim 条件 As String 条件 = UserForm1.ListBox1.Text '氏名 With Worksheets("データ") .Range("A1").AutoFilter _ field:=2, Criteria1:=条件 .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _ Worksheets("抽出").Range("A1") .Range("A1").AutoFilter End With End Sub Private Sub CommandButton1_Click() '選択終了ボタンがクリックされたとき(複数・拡張選択) Dim 条件 As String Dim lastRow As Long With ListBox1 If .ListIndex = -1 Then Exit Sub '何も選択されていない For 条件 = 0 To .ListCount - 1 If .Selected(条件) Then '行選択あり With Worksheets("データ") .Range("A1").AutoFilter _ field:=2, Criteria1:=条件 .Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy _ Worksheets("抽出").Range("A1") .Range("A1").AutoFilter End With End If Next End With End Sub Private Sub UserForm_Deactivate() Unload UserForm1 '×ボタンを押したら、ユーザーフォームのunloadをする End Sub

  • EXCEL コンボボックスのリスト設定

    リストインデックスが複数ある場合は動くのですが、 インデックスが0 もしくは1個しかない場合は、どのように処理を追加したらいいでしょうか。。 実行時エラー381 Lisプロパティを設定できません。プロパティの配列のインデックスが無効です、と メッセージが出ます。 いろいろ試してるのですがわかりません。 コンボボックスの値は別シートで参照先を指定しています。 ----------- Private Sub ComboBox3_DropButtonClick() Dim lRow As Long Dim i As Long, myCnt As Long Dim myData With Worksheets("部門名") lRow = .Range("O" & Rows.Count).End(xlUp).Row ’O列の最終行を確認 myData = .Range("O2:O" & lRow).Value ’コンボボックスのリストデータ End With With ComboBox3 .ColumnCount = 1 .ColumnWidths = "50" .List = myData End With End Sub

専門家に質問してみよう