2014-04-27 5 views
5

Ich bin ein C# /. NET-Entwickler, aber bin nicht zu vertraut mit Excel-Programmierung oder VBA. Für ein Nebenprojekt habe ich eine Tabelle, die von nicht technischen Benutzern für die Dateneingabe verwendet wird. Später wird diese Tabelle über ein C# -Kommando, das ich geschrieben habe, in ein anderes Format exportiert, damit die Daten in ein anderes System übertragen werden können.Kontrollkästchen für mehrere Werte in einer Zelle in Excel

Ich brauche die Datenwerte genau so eingegeben werden, wie das Befehlszeilenprogramm erwartet, so dass Benutzerfehler aufgrund von Tippfehlern oder leichten Wortwahlunterschieden problematisch wären. Ich brauche den Benutzer, um aus möglichen Werten auszuwählen, anstatt sich darauf zu verlassen, dass der Benutzer den korrekten Wert eingibt.

Für Spalten, die nur einen einzelnen Wert in einer Zelle haben können, konnte ich dies mithilfe eines Dropdown-Menüs erreichen, aus dem der Benutzer auswählen kann. Ich tat dies über die Anweisungen hier:

http://office.microsoft.com/en-us/excel-help/insert-or-delete-a-drop-down-list-HP010072599.aspx

Das Problem ist, ich habe mehrere Spalten, deren Zellen können mehrere Werte enthalten, die durch Kommas getrennt. Zum Beispiel habe ich eine Spalte "Farbe". Der Wert einer Zelle in dieser Spalte kann eine einzelne Farbe (z. B. "Rot") oder eine Liste von Farben sein, die durch Kommata getrennt sind (z. B. "Rot, Grün, Blau"). Idealerweise möchte ich, dass ein Benutzer in der Lage ist, auf die Zelle zu klicken und eine Liste von Kontrollkästchen zu sehen, aus denen Farben ausgewählt werden können, und wenn sie fertig sind, wird die Zelle mit diesen durch Kommata getrennten Farben aktualisiert.

Was ist der beste Weg, dies zu erreichen? Ich habe versucht, googeln und fand diese Methode:

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

..., die mehrere Elemente aus einem Drop-Down-Menü ermöglicht die Auswahl, aber es ist unbequem, weil das Dropdown muss jedes Mal wieder geöffnet wird ein weiteres Element hinzugefügt werden muss . Checkboxen wären bequemer. Ist das möglich und wenn ja, wie?

Antwort

1

Excel bietet Funktionen für Benutzerformulare, die dem WinForms-Projekttyp von .NET ähneln, und sie funktionieren sehr ähnlich. Klicken Sie im Code-Editor von Excel mit der rechten Maustaste auf den Modulordner im Explorer-Fenster und fügen Sie ein Benutzerformular hinzu. Ein Designer wird zeigen, dass der in VS2013 ähnlich (wenn auch nicht so auffällig) ist. Die Formulare laufen auch von einem Ereignistypsystem ab.

Sie können Ihr Benutzerformular von einem beliebigen Sub mit formName.Show aufrufen.

Von dort, implementieren Sie Ihre Eingabe Einschränkungen und concoct die Eingabe in die Zeichenfolge, die Sie für die Zelle benötigen.

Viel Glück!

Hinzugefügt: Wahrscheinlich möchten Sie ein Arbeitsblatt-Ereignis einrichten, wenn bestimmte Zellen zum Öffnen des Formulars aktiviert werden. Auf diese Weise klicken sie einfach auf die Zelle, anstatt etwas ausführen zu müssen.

7

Versuchen Sie folgendes:

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 

In dem obigen Code, ich eine OleObject des MsForm.Listbox Typs verwendet.
Erste Einrichtung Ihre Listbox OleObject, die HERE diskutiert wurde.
Im obigen Code habe ich meinen Listbox als LB_Colors benannt, der durch Zugriff auf seine Eigenschaften geändert werden kann.

Angenommen, Sie Ihre Daten wie folgt einstellen:

enter image description here

Der obige Code wird ausgeführt, wenn eine Auswahl getroffen wird.
Wenn die Auswahl gleich B2 ist, wird das erstellte Objekt ListBox angezeigt.


enter image description here

Wir setzen die ListBox Objektpositionen (links, oben) und Breite gleich B2 so wird es nach unten wie ein Tropfen aussehen.
Der Benutzer kann dann Werte auswählen.

enter image description here

Wenn der Benutzer bereits zufrieden mit der Auswahl ist, nur aus Klicken der ListBox.
Die Auswahl wird in B2 geschrieben und die ListbBox wird wieder unsichtbar sein, wie unten zu sehen ist.

enter image description here

Ist das, was Sie versuchen?

+0

Wow, das ist wirklich eine gute Anleitung. Ich folgte ihm und es scheint gut zu funktionieren. Obwohl ich mich über eine peinliche Sache wunderte. Wenn ich die Zelle anwähle, werden die ursprünglichen Elemente gelöscht (auch wenn ich nichts getan habe). Gibt es dafür eine schnelle und einfache Lösung, damit es nicht durch das Bewegen meiner Cursor reinigt? –

+0

@ThomasCheng Versuchen Sie, die 2. 'For-Schleife' zu ​​entfernen. – L42