アプリ版:「スタンプのみでお礼する」機能のリリースについて

教えて下さい!

今シートにはA列に日付(2003/1/1~2010/12/31)、B列からI列の1行目には項目名が入っています。
これから行いたいことは、別マクロで表示させたフォームのコンボボックスから日付を選択し、同じフォーム上にある項目名に沿った8つのテキストボックスにデータを入力することにより、そのデータがシートに反映されるというものを作成したいのです。

データが入力される部分は選択された日付の行の、各項目名と交わる部分となります。
(例)
       |あああ|いいい|ううう・・・
2003/1/1 |    |    |
2003/1/2 |    |    |
2003/1/3 |    |    |
※上の表だとコンボボックスから2003/1/2を選択し、テキストボックス「いいい」部分にデータを入力するとC3セルにデータが入力されます。

コンボボックスにデータを表示させることは出来るのですが、そこから先(この日付を選んでテキストに入力して・・・)が出来ません。
よろしければ、記述を教えて頂きたいと思います。

宜しくお願い致します。

A 回答 (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

'--ここまで----------------------------------------------------------
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/18 10:15

#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列にデータが入力されます。

スミマセン。質問ばかりで。。。
宜しくお願い致します。

補足日時:2005/11/17 19:35
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/17 19:02

こんにちは。



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

------------------------------------------------

尚、日付を選択してない時のエラー処理等はしてありません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/17 19:00

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
    • good
    • 0
この回答へのお礼

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

お礼日時:2005/11/17 19:03

ComboBox の ListIndex を使って行を割出して、Offsetで列を指定すれば良いのではないでしょうか?



Dim myRow As Long
myRow = Me.ComboBox1.ListIndex + 2
ActiveSheet.Cells(myRow, 2).Value = Me.TextBox1.Value

この回答への補足

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

補足日時:2005/11/17 08:24
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!