1231276215 お気持ちのみですが、合計で700ポイント程度の質問とさせて頂きます。


エクセルVBAのユーザーフォームを使ってコメント欄に示すインターフェースを実現して下さい。個人の特定の日時における行為を記録するツールです。

お力添えをよろしくお願い致します。

回答の条件
  • 1人2回まで
  • 登録:2009/01/07 06:10:15
  • 終了:2009/01/09 22:39:14

ベストアンサー

id:SALINGER No.1

SALINGER回答回数3454ベストアンサー獲得回数9692009/01/07 21:30:28

ポイント700pt

わからない部分もあったのでこれでいいのかわかりませんが、ご指摘くだされば随時変更していきます。

コントロールの名称はたぶんそのままだと思います。

勝手に変更した部分は、複数選択するリストボックスだとクリックイベントを取得できないのでダブルクリックにしました。

それと、クリアボタンの処理はテキストボックスをクリアにしました。複数選択の場合、リストボックスをクリックしたほうが好きな項目を消せるので必要ないかなと。

5の処理はよくわからないので未実装です。

'クリアボタンの処理
Private Sub CommandButton1_Click()
    Dim i As Integer
    TextBox1.Value = ""
    For i = 0 To ListBox1.ListCount - 1
        ListBox1.Selected(i) = False
    Next i
End Sub

Private Sub CommandButton2_Click()
    Dim i As Integer
    TextBox2.Value = ""
    For i = 0 To ListBox2.ListCount - 1
        ListBox2.Selected(i) = False
    Next i
    For i = 0 To ListBox5.ListCount - 1
        ListBox5.Selected(i) = False
    Next i
    For i = 0 To ListBox7.ListCount - 1
        ListBox7.Selected(i) = False
    Next i
End Sub

Private Sub CommandButton3_Click()
    Dim i As Integer
    TextBox3.Value = ""
    For i = 0 To ListBox3.ListCount - 1
        ListBox3.Selected(i) = False
    Next i
End Sub

'リストボックスをダブルクリック
Private Sub ListBox1_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim i As Integer
    Dim s As String
    For i = 0 To ListBox1.ListCount - 1
        If ListBox1.Selected(i) Then
            s = s & "," & ListBox1.List(i)
        End If
    Next i
    TextBox1.Value = Mid(s, 2)
    Sheet1.Range("D4").Value = TextBox1.Value
End Sub

Private Sub ListBox2_Click()
    Call MakeDate
End Sub

Private Sub ListBox3_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    Dim i As Integer
    Dim s As String
    For i = 0 To ListBox3.ListCount - 1
        If ListBox3.Selected(i) Then
            s = s & "," & ListBox3.List(i)
        End If
    Next i
    TextBox3.Value = Mid(s, 2)
    Sheet1.Range("H4").Value = TextBox3.Value
End Sub

Private Sub ListBox5_Click()
    Call MakeDate
End Sub

Private Sub ListBox7_Click()
    Call MakeDate
End Sub

'日付はまとめて一つ関数で処理
Private Sub MakeDate()
    If ListBox2.ListIndex = -1 Then Exit Sub
    If ListBox5.ListIndex = -1 Then Exit Sub
    If ListBox7.ListIndex = -1 Then Exit Sub
    TextBox2.Value = ListBox7.Value & "/" & ListBox5.Value & "/" & ListBox2.Value
    
    If Not IsDate(TextBox2.Value) Then Exit Sub
    Dim myDate As Date
    myDate = DateValue(TextBox2.Value)
    Sheet1.Range("E4").Value = Year(myDate)
    Sheet1.Range("F4").Value = Month(myDate)
    Sheet1.Range("G4").Value = Day(myDate)
End Sub

'Enterを押したときの処理
Private Sub TextBox2_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode <> vbKeyReturn Then Exit Sub
    If Not IsDate(TextBox2.Value) Then Exit Sub
    Dim myDate As Date
    myDate = DateValue(TextBox2.Value)
    Sheet1.Range("E4").Value = Year(myDate)
    Sheet1.Range("F4").Value = Month(myDate)
    Sheet1.Range("G4").Value = Day(myDate)
End Sub

Private Sub TextBox3_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode <> vbKeyReturn Then Exit Sub
    Sheet1.Range("H4").Value = TextBox3.Value
End Sub

'ユーザーフォームを表示するときにリストを読み込む
Private Sub UserForm_Initialize()
    Dim i As Long
    Dim rastRow As Long
    rastRow = Sheet1.Cells(Rows.Count, 4).End(xlUp).Row
    For i = 7 To rastRow
        ListBox1.AddItem Sheet1.Cells(i, 4).Value
    Next i
    rastRow = Sheet1.Cells(Rows.Count, 7).End(xlUp).Row
    For i = 7 To rastRow
        ListBox2.AddItem Sheet1.Cells(i, 7).Value
    Next i
    rastRow = Sheet1.Cells(Rows.Count, 8).End(xlUp).Row
    For i = 7 To rastRow
        ListBox3.AddItem Sheet1.Cells(i, 8).Value
    Next i
    rastRow = Sheet1.Cells(Rows.Count, 3).End(xlUp).Row
    For i = 7 To rastRow
        ListBox4.AddItem Sheet1.Cells(i, 3).Value
    Next i
    rastRow = Sheet1.Cells(Rows.Count, 6).End(xlUp).Row
    For i = 7 To rastRow
        ListBox5.AddItem Sheet1.Cells(i, 6).Value
    Next i
    rastRow = Sheet1.Cells(Rows.Count, 2).End(xlUp).Row
    For i = 7 To rastRow
        ListBox6.AddItem Sheet1.Cells(i, 2).Value
    Next i
    rastRow = Sheet1.Cells(Rows.Count, 5).End(xlUp).Row
    For i = 7 To rastRow
        ListBox7.AddItem Sheet1.Cells(i, 5).Value
    Next i
    
    'テキストボックス1をロック、マルチラインの設定
    TextBox1.Locked = True
    ListBox1.MultiSelect = fmMultiSelectMulti
    ListBox3.MultiSelect = fmMultiSelectMulti
End Sub
id:ReoReo7

!いつもありがとうございます。

早速実装してみます。

2009/01/08 14:22:02
  • id:ReoReo7
    インターフェース設計図を画像にして添付しました。
    動作要件です。足りなければ追加質問お願いします。

    A:データの対応について
    1:設計図下に見えているリストボックスは、各々対応するエクセル列の8行目から下の値を反映しています。
    2:エクセルの「入力内容」行は、対応するテキストボックスの変化で値が自動で変更されます。対応するテキストボックスが無い場合は、対応するリストボックスのクリックで入力がなされます。詳しくは後述。
    3:「入力内容」行が変化すると、「選択肢」も変化します。これはエクセルの別の関数(仮にAutoReload()とします)でサポートされています。
    4:エクセルの7行目から下は、AutoReload()でしか変更されません。

    B:インタフェースの動作
    1:リストボックス上には、エクセル上の対応する選択肢が並んでいる。表示オーバーはスクロールで対応可能。
    2:リストボックス上のセルをクリックなどの簡単な動作で上に位置するテキストボックスに入力可能。但し、TextBox1はListBox1上の選択肢の選択のみに対応します。
    3:テキストボックスへは、対応するリストボックスのクリックからだけではなく、手入力も可能です。その場合、リストボックス上の選択肢をクリックの代わりに、Enterキーを打つと内容がエクセルの「入力内容」行に反映されます(そしてAutoReload()が行われます)。
    4:複数選択が可能なものは、複数入力に対して、エクセル「入力内容」行の対応するセルに”,”で区切って挿入されます(もちろん、対応するテキストボックスにも即座に反映)。複数選択が不可なものは、新しい選択に置き換わります。「クリア」押下で一つ削除。
    5:各々のリストボックス上の選択肢のうち、直近にクリックされたセルは、色が反転します。但し、AutoReload()により選択肢が変更されたリストボックス(エクセル上「前回AutoReloadによる変更フラグ」行の対応する値が1のリストボックス)は、反転が消えます。(この処理は少し難しいかもしれないので、実現は後回しになっても構いません)
    6:エクセルの「入力内容」行は、リストボックスのクリックで入力がなされます。それをテキストボックスへ反映するというアルゴリズムとします(変更して下さっても構いません)。
    7:フォーム上の「送信」クリックで、シート2上に、シート1上にある「入力内容」行のデータが送信されますが、この機能は作らなくて結構です。

    ※ 部品のサイズは適宜調整してください。ボックスは小さいのがテキストボックス、長いのがリストボックスです。
    ※ 左から、上から順にTextBox1,TextBox2,TextBox3,Botton1,Botton2,Botton3,Botton4,
    ListBox1~ListBox7とでもして下さい。名前は適当で良く、かつユーザーフォームを作っていただく必要はありません。必要なのはコードです。
    ※ 部品の種類も適宜変えて下さって結構です。その場合ListBoxはComboBoxに変更、などとおっしゃって下されば結構です。

  • id:SALINGER
    所属企業と所属グループをクリックしたときの処理
    >>
    Private Sub ListBox4_Click()
    Sheet1.Range("C4").Value = ListBox4.Value
    End Sub

    Private Sub ListBox6_Click()
    Sheet1.Range("B4").Value = ListBox6.Value
    End Sub
    <<
    が抜けていました。
  • id:ReoReo7
    ありがとうございます。了解しました。
  • id:ReoReo7
    ひとまず所望の動作を得られました。
    また何か追加でありましたら新しく質問致します。

    今回は勉強になりました。
    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません