- ベストアンサー
【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セルにデータが入力されます。 コンボボックスにデータを表示させることは出来るのですが、そこから先(この日付を選んでテキストに入力して・・・)が出来ません。 よろしければ、記述を教えて頂きたいと思います。 宜しくお願い致します。
- みんなの回答 (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 '--ここまで----------------------------------------------------------
その他の回答 (4)
- papayuka
- ベストアンサー率45% (1388/3066)
#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 '--ここまで----------------------------------------------------------
お礼
すごい!! なるほど~こういう形で出来るんですね。 勉強になりました◎ ありがとうございました!
補足
お礼を書いてしまった後なんですが・・・ 例えばこの方法で、UserFormにOptionButtonが3つあり、切り替えることで入力される行を変更させることは出来ますか? (例) ・OptionButton1を選択し、TextBox1~8にデータを入力するとB列~I列にデータが入力されます。 ・OptionButton2を選択し、TextBox1~8にデータを入力するとK列~R列にデータが入力されます。 ・OptionButton3を選択し、TextBox1~8にデータを入力するとT列~AA列にデータが入力されます。 スミマセン。質問ばかりで。。。 宜しくお願い致します。
- onlyrom
- ベストアンサー率59% (228/384)
こんにちは。 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 ------------------------------------------------ 尚、日付を選択してない時のエラー処理等はしてありません。
お礼
出来ました!! 私の質問の意図をお解り頂いて本当にうれしいです。 ありがとうございました。
- jindon
- ベストアンサー率43% (50/116)
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
お礼
こういうやり方もあるんですねー。 勉強になります。 ありがとうございました◎
- papayuka
- ベストアンサー率45% (1388/3066)
ComboBox の ListIndex を使って行を割出して、Offsetで列を指定すれば良いのではないでしょうか? Dim myRow As Long myRow = Me.ComboBox1.ListIndex + 2 ActiveSheet.Cells(myRow, 2).Value = Me.TextBox1.Value
補足
ありがとうございます。 ListIndexで行を指定するところまではわかりましたが、その後のOffsetの使い方がわかりません。 もしよろしければ、例を出しておしえていただけますか??? 宜しくお願いします。
お礼
あぁ~、なるほど!! わかりました◎ また一つ勉強させて頂きました。 何かと本当にありがとうございました。