0
Private Sub ComboBox1_DropButtonClick()

    If ComboBox1.ListCount > 0 Then
    ActiveSheet.ComboBox1.Clear
    End If

    For N = 1 To ActiveWorkbook.Sheets.Count - 1
    ComboBox1.AddItem ActiveWorkbook.Sheets(N).Name
    Next N

End Sub

私はVBAを初めて使用するので、ご容赦ください。そもそもこれが最善の方法ではないかもしれません。

コードは、ワークブックの各シートの名前(最後のシートを除く)を取得し、それらをコンボボックスリストに追加しています。最初は、ドロップダウンをクリックするたびに、すべてのシート名が再度追加され、クリックするたびにリストが増え続けていました。私の救済策は、クリックするたびに最初にコンボボックスをクリアして、再入力することでした。

ただし、clearオプションを使用すると、選択時に値が表示されません。clearオプションを使用しない場合は、正常に表示されます。他のすべては引き続き機能しますが、ユーザーが混乱しないように、選択した値を表示するために必要です。

私が必要なことを達成するためのより良い方法はありますか?

編集:重要な場合、これはユーザーフォームではなく、ワークシートに直接配置されたアクティブなxコンボボックスです。

4

3 に答える 3

1

これは非常に奇妙な動作ですが、リスト内の項目を選択すると、DopButtonClick イベントが再びトリガーされます。したがって、割り当てられたばかりの値は、2 回目の実行でクリアされ.Clearます。

このコードはそれを修正します:

Private Sub ComboBox1_DropButtonClick()
    Dim strValue As String
    Dim n As Integer
    strValue = ComboBox1.Value

    If ComboBox1.ListCount > 0 Then
        ActiveSheet.ComboBox1.Clear
    End If

    For n = 1 To ActiveWorkbook.Sheets.Count - 1
        ComboBox1.AddItem ActiveWorkbook.Sheets(n).Name
    Next n
    ComboBox1.Value = strValue

End Sub
于 2013-02-18T20:15:24.167 に答える
1

以下のようなものが機能します。ただし、誰かがクリックするたびにコンボボックスを再作成する理由は疑問です。ワークブックが開いているとき、またはワークシートがアクティブになっているときに実行してみませんか?

Private Sub ComboBox1_DropButtonClick(ComboBox1 As ComboBox)
    Dim strSelected As String
    If ComboBox1.ListIndex > -1 Then
      strSelected = ComboBox1.List(ComboBox1.ListIndex)
    End If
    If ComboBox1.ListCount > 0 Then
      ActiveSheet.ComboBox1.Clear
    End If

    For N = 1 To ActiveWorkbook.Sheets.Count - 1
      ComboBox1.AddItem ActiveWorkbook.Sheets(N).Name
      If strSelected = ActiveWorkbook.Sheets(N).Name Then
        ComboBox1.ListIndex = N - 1
      End If
    Next N
End Sub
于 2013-02-18T20:14:20.703 に答える