• ベストアンサー

【Excel・マクロ】コンボボックス・テキストボックスからのデータの入力について

教えて下さい! 今シートにはA列に日付(2003/1/1~2010/12/31)、B列からI列の1行目には項目名が入っています。 これから行いたいことは、別マクロで表示させたフォームのコンボボックスから日付を選択し、同じフォーム上にある項目名に沿った8つのテキストボックスにデータを入力することにより、そのデータがシートに反映されるというものを作成したいのです。 データが入力される部分は選択された日付の行の、各項目名と交わる部分となります。 (例)        |あああ|いいい|ううう・・・ 2003/1/1 |    |    | 2003/1/2 |    |    | 2003/1/3 |    |    | ※上の表だとコンボボックスから2003/1/2を選択し、テキストボックス「いいい」部分にデータを入力するとC3セルにデータが入力されます。 コンボボックスにデータを表示させることは出来るのですが、そこから先(この日付を選んでテキストに入力して・・・)が出来ません。 よろしければ、記述を教えて頂きたいと思います。 宜しくお願い致します。

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

  • ベストアンサー
  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.5

#1です。 Cells(行番号, 列番号)ですので、列を変えたいなら列番号を工夫します。 i = 1 To 8 のループをしていて Cells( 行番号 , i + 1) ですので、i + 1 は 2 ~ 9 まで変化している事になります。 つまり B ~ I です。これを 11 ~ 17 (K~R)と 20 ~ 27 (T~AA)になるように考えれば良い訳です。 i + x の「x」部分を OptionButton の状態によって値を返す関数に変え、各OptionButtonの変化でもTextBoxの値が切り替わるように修正してみました。 '--ここから---------------------------------------------------------- Dim ws As Worksheet Private Sub UserForm_Initialize()  Set ws = ActiveSheet  For Each r In ws.Range("A2", ws.Range("A65536").End(xlUp))    Me.ComboBox1.AddItem r.Text  Next r  Me.ComboBox1.Style = fmStyleDropDownList  Me.CommandButton1.Caption = "転記"  Me.OptionButton1.Value = True End Sub Private Sub CommandButton1_Click() Dim i As Integer, j As Integer  If ComboBox1.ListIndex < 0 Then Exit Sub  For i = 1 To 8    ws.Cells(ComboBox1.ListIndex + 2, i + OpBtnChk).Value = _           Me.Controls("TextBox" & i).Value  Next i End Sub Private Sub ComboBox1_Change() Dim i As Integer  If ComboBox1.ListIndex < 0 Then Exit Sub  For i = 1 To 8    Me.Controls("TextBox" & i).Value = _    ws.Cells(ComboBox1.ListIndex + 2, i + OpBtnChk).Value  Next i End Sub Private Sub OptionButton1_Click()  ComboBox1_Change End Sub Private Sub OptionButton2_Click()  ComboBox1_Change End Sub Private Sub OptionButton3_Click()  ComboBox1_Change End Sub Private Function OpBtnChk() As Integer  If Me.OptionButton1.Value Then OpBtnChk = 1  If Me.OptionButton2.Value Then OpBtnChk = 10  If Me.OptionButton3.Value Then OpBtnChk = 19 End Function '--ここまで----------------------------------------------------------

froma_a
質問者

お礼

あぁ~、なるほど!! わかりました◎ また一つ勉強させて頂きました。 何かと本当にありがとうございました。

その他の回答 (4)

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.4

#1です。 Offsetと書きながらサンプルでOffsetを使ってないや。(^^; Cellsで事は足りますね。 既にある皆さんの回答と殆ど同じですけど、、、 既にセルに入っている値を持ってくる部分を付加してみました。  1)該当シート(ActiveSheet)は 1行目がタイトル行  2)A列には必ずデータがある  2)UserForm に CommandButton1 と TextBox1~8 と ComboBox1 がある という想定です。 なお、実行中に行列が削除される等は想定してません。 '--ここから---------------------------------------------------------- Dim ws As Worksheet Private Sub UserForm_Initialize()  Set ws = ActiveSheet  For Each r In ws.Range("A2", ws.Range("A65536").End(xlUp))    Me.ComboBox1.AddItem r.Text  Next r  Me.ComboBox1.Style = fmStyleDropDownList  Me.CommandButton1.Caption = "転記" End Sub Private Sub CommandButton1_Click() Dim i As Integer  If ComboBox1.ListIndex < 0 Then Exit Sub  For i = 1 To 8    ws.Cells(ComboBox1.ListIndex + 2, i + 1).Value = _           Me.Controls("TextBox" & i).Value  Next i End Sub Private Sub ComboBox1_Change() Dim i As Integer  If ComboBox1.ListIndex < 0 Then Exit Sub  For i = 1 To 8    Me.Controls("TextBox" & i).Value = _    ws.Cells(ComboBox1.ListIndex + 2, i + 1).Value  Next i End Sub '--ここまで----------------------------------------------------------

froma_a
質問者

お礼

すごい!! なるほど~こういう形で出来るんですね。 勉強になりました◎ ありがとうございました!

froma_a
質問者

補足

お礼を書いてしまった後なんですが・・・ 例えばこの方法で、UserFormにOptionButtonが3つあり、切り替えることで入力される行を変更させることは出来ますか? (例) ・OptionButton1を選択し、TextBox1~8にデータを入力するとB列~I列にデータが入力されます。 ・OptionButton2を選択し、TextBox1~8にデータを入力するとK列~R列にデータが入力されます。 ・OptionButton3を選択し、TextBox1~8にデータを入力するとT列~AA列にデータが入力されます。 スミマセン。質問ばかりで。。。 宜しくお願い致します。

  • onlyrom
  • ベストアンサー率59% (228/384)
回答No.3

こんにちは。 ComboboxにはA列の日付がセットされていて、TextBoxは項目順になっているとした場合 TextBoxの値をシートへもっていくためには、トリガーになるイベントが必要ですので 例えばUserForm上にCommandButtonをひとつ用意してそのクリックイベントで移動するようにします 項目が8項目程度であれば --------------------------------------- Private Sub CommandButton1_Click()  With ComboBox1   Cells(.ListIndex + 2, "B") = TextBox1.Value   Cells(.ListIndex + 2, "C") = TextBox2.Value   Cells(.ListIndex + 2, "D") = TextBox3.Value   Cells(.ListIndex + 2, "E") = TextBox4.Value   Cells(.ListIndex + 2, "F") = TextBox5.Value   Cells(.ListIndex + 2, "G") = TextBox6.Value   Cells(.ListIndex + 2, "H") = TextBox7.Value   Cells(.ListIndex + 2, "I") = TextBox8.Value  End With End Sub --------------------------------------------- 上記のコードは何をしているか一目で分かりますが、項目数が多い場合にはその項目数だけコードが長くなります。 で、項目数多くてもコードの長さを一定に保つには --------------------------------------------- Private Sub CommandButton1_Click()  Dim C As Integer  With ComboBox1   For C = 1 To 8    Cells(.ListIndex + 2, C + 1) = Me.Controls("TextBox" & C).Value   Next C  End With End Sub ------------------------------------------------ 尚、日付を選択してない時のエラー処理等はしてありません。

froma_a
質問者

お礼

出来ました!! 私の質問の意図をお解り頂いて本当にうれしいです。 ありがとうございました。

  • jindon
  • ベストアンサー率43% (50/116)
回答No.2

ComboBoxを2つ (ComboBox1, ComboBox2) TextBoxを1つ (TextBox1) CommandButtonを1つ (CommandButton1) をフォームに配置してください。 該当シートをSheet1にしてあります。 Private Sub UserForm_Initialize() Dim ws As Worksheet, r As Range Set ws = Sheets("sheet1") For Each r In ws.Range("a2", ws.Cells(Rows.Count, 1).End(xlUp)) If Not IsEmpty(r) Then Me.ComboBox1.AddItem r.Text Next With Me.ComboBox2 .Column = ws.Range("b1", ws.Cells(1, Columns.Count).End(xlToLeft)).Value End With Set ws = Nothing End Sub Private Sub CommandButton1_Click() Dim ctrl As Control, tst1 As String, txt2 As String Dim ws As Worksheet, r As Long, c As Long Set ws = Sheets("sheet1") For Each ctrl In Me.Controls Select Case ctrl.Name Case "ComboBox1", "ComboBox2", "TextBox1" If Me.Controls(ctrl.Name).Value = "" Then txt1 = txt1 & ctrl.Name & vbLf Else txt2 = txt2 & Me.Controls(ctrl.Name).Value & vbLf End If End Select Next If Len(txt1) > 0 Then MsgBox "以下の値を入力してください" & vbLf & txt1, vbExclamation Exit Sub Else ret = MsgBox("以下の値を入力します" & vbLf & txt2, vbOKCancel) If ret <> vbOK Then Exit Sub r = ws.Columns(1).Find(Me.ComboBox1.Value, , xlValues).Row c = ws.Rows(1).Find(Me.ComboBox2.Value).Column ws.Cells(r, c) = Me.TextBox1.Text End If Set ws = Nothing End Sub

froma_a
質問者

お礼

こういうやり方もあるんですねー。 勉強になります。 ありがとうございました◎

  • papayuka
  • ベストアンサー率45% (1388/3066)
回答No.1

ComboBox の ListIndex を使って行を割出して、Offsetで列を指定すれば良いのではないでしょうか? Dim myRow As Long myRow = Me.ComboBox1.ListIndex + 2 ActiveSheet.Cells(myRow, 2).Value = Me.TextBox1.Value

froma_a
質問者

補足

ありがとうございます。 ListIndexで行を指定するところまではわかりましたが、その後のOffsetの使い方がわかりません。 もしよろしければ、例を出しておしえていただけますか??? 宜しくお願いします。