web-dev-qa-db-ja.com

Excelの1つのセルにある複数の値のチェックボックス

私はC#/。NET開発者ですが、ExcelプログラミングやVBAにあまり詳しくありません。サイドプロジェクトとして、技術者以外のユーザーがデータ入力に使用するスプレッドシートがあります。後で、このスプレッドシートは、データを別のシステムにダンプできるように、私が作成したC#コマンドラインプログラムを介して別の形式にエクスポートされます。

コマンドラインプログラムが期待するとおりにデータ値を入力する必要があるため、タイプミスやわずかな表現の違いによるユーザーエラーが問題になります。ユーザーが正しい値を入力するのではなく、可能な値から選択する必要があります。

セルに単一の値しか持てない列の場合、ユーザーが選択できるドロップダウンメニューを使用してこれを実現できました。私はここの指示によってこれをしました:

https://support.office.com/en-ie/article/add-or-remove-items-from-a-drop-down-list-0b26d3d1-3c4d-41f5-adb4-0addb82e8d2c

問題は、セルがコンマで区切られた複数の値を保持できる列がいくつかあることです。たとえば、「色」列があります。この列のセルの値は、単一の色(「赤」など)またはカンマで区切られた色のリスト(「赤、緑、青」など)の場合があります。理想的には、ユーザーがセルをクリックして、色を選択できるチェックボックスのリストを表示できるようにします。チェックが完了すると、セルはコンマで区切られた色で更新されます。

これを達成するための最良の方法は何ですか?私はグーグルを試し、この方法を見つけました:

http://www.contextures.com/Excel-data-validation-multiple.html

...これにより、ドロップダウンメニューから複数のアイテムを選択できますが、別のアイテムを追加する必要があるたびにドロップダウンを再度開く必要があるため、不便です。チェックボックスの方が便利です。これは可能ですか?もしそうなら、どのように?

6
mayabelle

これを試して:

Option Explicit
Dim fillRng As Range
Private Sub Worksheet_SelectionChange(ByVal Target As Range)

Dim LBColors As MSForms.ListBox
Dim LBobj As OLEObject
Dim i As Long

Set LBobj = Me.OLEObjects("LB_Colors")
Set LBColors = LBobj.Object

    If Not Intersect(Target, [B2]) Is Nothing Then
        Set fillRng = Target
        With LBobj
            .Left = fillRng.Left
            .Top = fillRng.Top
            .Width = fillRng.Width
            .Visible = True
        End With
    Else
        LBobj.Visible = False
        If Not fillRng Is Nothing Then
            fillRng.ClearContents
            With LBColors
                If .ListCount <> 0 Then
                    For i = 0 To .ListCount - 1
                        If fillRng.Value = "" Then
                            If .Selected(i) Then fillRng.Value = .List(i)
                        Else
                            If .Selected(i) Then fillRng.Value = _
                                fillRng.Value & "," & .List(i)
                        End If
                    Next
                End If
                For i = 0 To .ListCount - 1
                    .Selected(i) = False
                Next
            End With
            Set fillRng = Nothing
        End If
    End If

End Sub

上記のコードでは、MsForm.ListboxタイプのOleObjectを使用しました。
最初に、議論されたListbox OleObjectを設定します [〜#〜] here [〜#〜]
上記のコードでは、ListboxLB_Colorsという名前を付けました。これは、そのプロパティにアクセスすることで変更できます。

以下のようにデータを設定するとします。

enter image description here

上記のコードは、選択が行われると実行されます。
選択がB2と等しい場合、作成されたListBoxオブジェクトが表示されます。

enter image description here

ListBoxオブジェクトの位置(左、上)と幅をB2に設定して、ドロップダウンのように見えるようにします。
ユーザーは値を選択できます。

enter image description here

ユーザーがすでに選択に満足している場合は、ListBoxからクリックするだけです。
選択はB2で書き込まれ、ListbBoxは以下に示すように再び非表示になります。

enter image description here

これはあなたがしようとしていることですか?

7
L42

Excelには、.NETのWinFormsプロジェクトタイプと同様のユーザーフォーム用の機能があり、それらは実際に同様に機能します。 Excelのコードエディターで、エクスプローラーウィンドウのモジュールフォルダーを右クリックし、ユーザーフォームを追加します。デザイナーは、VS2013のものと似ていることを示します(派手ではありませんが)。フォームは、イベントタイプのシステムからも実行されます。

formName.Showを使用して、任意のサブからユーザーフォームを呼び出すことができます。

そこから、入力制限を実装し、セルに必要な文字列に入力を作成します。

幸運を!

追加:フォームを開くために特定のセルがアクティブ化されたときのワークシートイベントを設定することをお勧めします。そうすれば、何も実行する代わりに、セルをクリックするだけです。

1
Jacob Lambert