私はC#/。NET開発者ですが、ExcelプログラミングやVBAにあまり詳しくありません。サイドプロジェクトとして、技術者以外のユーザーがデータ入力に使用するスプレッドシートがあります。後で、このスプレッドシートは、データを別のシステムにダンプできるように、私が作成したC#コマンドラインプログラムを介して別の形式にエクスポートされます。
コマンドラインプログラムが期待するとおりにデータ値を入力する必要があるため、タイプミスやわずかな表現の違いによるユーザーエラーが問題になります。ユーザーが正しい値を入力するのではなく、可能な値から選択する必要があります。
セルに単一の値しか持てない列の場合、ユーザーが選択できるドロップダウンメニューを使用してこれを実現できました。私はここの指示によってこれをしました:
問題は、セルがコンマで区切られた複数の値を保持できる列がいくつかあることです。たとえば、「色」列があります。この列のセルの値は、単一の色(「赤」など)またはカンマで区切られた色のリスト(「赤、緑、青」など)の場合があります。理想的には、ユーザーがセルをクリックして、色を選択できるチェックボックスのリストを表示できるようにします。チェックが完了すると、セルはコンマで区切られた色で更新されます。
これを達成するための最良の方法は何ですか?私はグーグルを試し、この方法を見つけました:
http://www.contextures.com/Excel-data-validation-multiple.html
...これにより、ドロップダウンメニューから複数のアイテムを選択できますが、別のアイテムを追加する必要があるたびにドロップダウンを再度開く必要があるため、不便です。チェックボックスの方が便利です。これは可能ですか?もしそうなら、どのように?
これを試して:
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 [〜#〜] 。
上記のコードでは、Listbox
にLB_Colors
という名前を付けました。これは、そのプロパティにアクセスすることで変更できます。
以下のようにデータを設定するとします。
上記のコードは、選択が行われると実行されます。
選択がB2
と等しい場合、作成されたListBox
オブジェクトが表示されます。
ListBox
オブジェクトの位置(左、上)と幅をB2
に設定して、ドロップダウンのように見えるようにします。
ユーザーは値を選択できます。
ユーザーがすでに選択に満足している場合は、ListBox
からクリックするだけです。
選択はB2
で書き込まれ、ListbBox
は以下に示すように再び非表示になります。
これはあなたがしようとしていることですか?
Excelには、.NETのWinFormsプロジェクトタイプと同様のユーザーフォーム用の機能があり、それらは実際に同様に機能します。 Excelのコードエディターで、エクスプローラーウィンドウのモジュールフォルダーを右クリックし、ユーザーフォームを追加します。デザイナーは、VS2013のものと似ていることを示します(派手ではありませんが)。フォームは、イベントタイプのシステムからも実行されます。
formName.Show
を使用して、任意のサブからユーザーフォームを呼び出すことができます。
そこから、入力制限を実装し、セルに必要な文字列に入力を作成します。
幸運を!
追加:フォームを開くために特定のセルがアクティブ化されたときのワークシートイベントを設定することをお勧めします。そうすれば、何も実行する代わりに、セルをクリックするだけです。