2016-03-20 4 views
1

Meine Firma hat eine ziemlich große Importvorlage, für die ich ein Add-In erstellt habe, mit ein paar nützlichen Shortcut-Tools und Prozeduren, die wir häufig verwenden .Wie kann ich Textvorschläge über VBA bereitstellen, wenn Benutzer Zelle in Excel-Arbeitsblatt auswählt

Was würde ich tun: Ich mag eine Intellisense-ähnliche Funktion hinzuzufügen, wenn Benutzer ausgewählte Zellen in vier bestimmten Spalten nur funktionieren würde (BF, BG, CS und CT) während der Arbeit in das Arbeitsblatt (nicht vbe).

Ich möchte so etwas imitieren:
Intellisense

insbesondere folgende Aufgaben: Wenn eine Zelle in jeder der vier Spalten ausgewählt Ich mag würde Vorschläge in einer Dropdown-Liste auf Basis von Daten, die im Arbeitsblatt in anderen Spalten eingegeben werden.

Wenn ein Benutzer klickt in eine leere Zelle:

  1. Sie eine Liste von Werten gegeben sind zur Auswahl
  2. Sobald sie diesen Wert wählen, um es in die Zelle gegeben wird und ein Doppelpunkt geheftet wird auf Das Ende davon
  3. Noch in der gleichen Zelle möchte ich die Dropdown-Liste entsprechend dem, was der Benutzer zuerst wählte und die neuen Werte präsentieren. (Die Liste wäre kleiner als die erste Liste, seit ihr erster Wert sich verengt die Auswahlmöglichkeiten)
  4. Sobald der Benutzer den zweiten Wert wählt e würde es zusammen mit einem anderen Doppelpunkt an das Ende des Wertes in der Zelle angeheftet werden.
  5. Schließlich würde die Dropdown-Liste erneut entsprechend dem, was der Benutzer ausgewählt hat, erneut auffüllen und sie mit der letzten Menge von Werten präsentieren (die Liste wäre kleiner als die erste und zweite Liste, da diese Werte die Auswahl einschränken), die sie wählen und dann beendet die Zelle ausfüllen

Ein Beispiel: In Spalten V, W und X sind die Werte
Impressum Option | Einzel Option 1 | Premium-kundenspezifische Farben gegen Aufpreis erhältlich. Angebot anfordern. respektive.

  1. Wenn der Benutzer eine Zelle in der Spalte BF klickt sie zunächst mit einem Drop-Down-Liste dargestellt sind, die in Spalte V.
  2. Wählten sie „Impressum Option“ gefunden „Impressum Option“ zusammen mit anderen Optionen umfassen würde dann wird "Imprint Option:" in die aktuelle Zelle eingetragen und die Liste wird mit Werten in Spalte W rechts von "Imprint Option" neu gefüllt (dh in diesem Fall würde nur "Single Option 1" aufgelistet)
  3. Wenn die Benutzer wählt "Einzeloption 1" Der Zellenwert ist jetzt "Imprint Option: Single Option 1:" und die Liste zeigt jetzt nur noch den Wert "Premium Custom Colors Available zu Zusatzkosten. Call for Quote."
  4. Wenn der Benutzer diesen Wert wählt der Zellenwert abgeschlossen ist, zeigt „Impressum Option: Einzel Option 1:.. Premium-kundenspezifische Farben gegen Aufpreis erhältlich Angebotsanfrage“ und keine Liste ist

Dieses gezeigt ist nur ein sehr einfaches Beispiel, weil es offensichtlich mehr als einen Wert in der Liste gibt, nachdem er beide Zeiten wieder auffüllt.

Meine Idee/Gedanken:
Mein Gedanke war, vielleicht ist dies möglich, indem eine Combo Box ohne den Dropdown-Pfeil unter Verwendung zeigt die Dropdown-Liste zu erstellen, aber ich bin nicht sicher, wie oder ob diese Methode mit arbeiten konnte Das liegt daran, dass die Werte neu gefüllt werden müssen und es in der Zelle nach der ersten Wertungsrunde einen Wert gibt, und ich dachte mir, dass das überschrieben würde. Die einzige Einschränkung, die ich habe, ist, dass ich dies on-the-fly erstellen muss. Ich kann die Steuerelemente nicht vorher auf das Arbeitsblatt ziehen und um weitere Leistungseinschränkungen zu vermeiden, möchte ich nur eine Zelle nach der anderen auswählen, wenn sie ausgewählt werden.

So, endlich meine Fragen:

  1. Ist das möglich nachzubilden?
    • Wenn ja, wie soll ich vorgehen? (Auch wenn die Methode kompliziert ist, bin ich offen für das Hören.)
  2. Wenn das nicht möglich ist, könnten Sie mir vorschlagen, etwas Ähnliches zu tun?

Antwort

1

Es gibt tatsächlich viele Möglichkeiten, dies zu erreichen und wahrscheinlich einige Automatisierungen, die nahe an dem sind, was Sie wollen. Wenn du die Straße hinunter gehen willst, um deine eigene zu bauen, dann würde ich eine UserForm verwenden, die nur eine ListBox enthielt.

Es gibt APIs, um das UserForm neben der Zelle anzuzeigen, die Sie ausgewählt haben, und den Rand von Ihrem UserForm zu entfernen, damit es mehr wie Intellisense aussieht. Sie möchten wahrscheinlich auch einige automatische Größenanpassung der ListBox behandeln. Ich werde all das Ihnen überlassen, sondern eine rudimentäre Version würde wie folgt aussehen:

enter image description here

Die grundlegende Idee wäre, dass Sie eine Datenbank von Elementen an ihren entsprechenden Ebenen erstellen und dann wieder bevölkern die ListBox mit dem entsprechenden Array, wenn sich ein Ebenenindex geändert hat.Ich würde meine Datenbank in XML machen, aber Sie könnten es tun, wie Sie es wollten.

Der folgende Code ist etwas Sie beginnen aber Sie würden wollen, um es erweitern mit allen möglichen Benutzeraktivitäten beschäftigen, wie wollen ihre Meinung zu beenden, ändern, löschen usw.

Schritt 1: Erstellen Sie eine UserForm, die nur eine ListBox darauf hat und stellen Sie sicher, dass die MultiSelect -Eigenschaft auf Single festgelegt ist. Im folgenden Beispiel habe ich die UserFormIntelliSense und die ListBoxlboxOptions genannt.

Schritt 2: Das ist das Skelett Code hinter der Userform

Option Explicit 
Private mItems() As String 
Private mSubItems1() As String 
Private mSubItems2() As String 
Private mSubItems3() As String 
Private mSubItems4() As String 
Private mIndex As Integer 
Private mCell As Range 

Private Property Let Index(val As Integer) 
    mIndex = val 
    Select Case val 
     Case 0: lboxOptions.List = mItems 
     Case 1: lboxOptions.List = mSubItems1 
     Case 2: lboxOptions.List = mSubItems2 
     Case 3: lboxOptions.List = mSubItems3 
     Case 4: lboxOptions.List = mSubItems4 
    End Select 
End Property 

Private Sub HandleItemSelected() 
    Dim i As Integer 

    'Identify the selected item 
    For i = 0 To lboxOptions.ListCount - 1 
     If lboxOptions.Selected(i) Then 
      If mIndex = 0 Then 
       'Write to the cell and add a full stop 
       mCell.Value = lboxOptions.List(i) & "." 
       'Trigger the next level of dropdown 
       Index = i + 1 
      Else 
       'Write to the cell and close the window 
       mCell.Value = mCell.Value & lboxOptions.List(i) 
       Me.Hide 
      End If 
     End If 
    Next 

End Sub 

Private Sub lboxOptions_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger) 
    'Trap the return key event as if 'selected' 
    If KeyAscii = vbKeyReturn Then 
     HandleItemSelected 
    End If 
End Sub 

Private Sub lboxOptions_MouseUp(ByVal Button As Integer, ByVal Shift As Integer, ByVal X As Single, ByVal Y As Single) 
    'Trap the click event as if 'selected' 
    HandleItemSelected 
End Sub 

Private Sub UserForm_Activate() 
    'Reset the list and store the target cell 
    Set mCell = Selection 
    Index = 0 
End Sub 

Private Sub UserForm_Initialize() 
    'Define the arrays of selections. 
    'I'd probably create an XML for this and read it into some arrays here. 
    Const items As String = "Cake|IceCream|Pasta|Chips" 
    Const subs1 As String = "Eggs|Flour|Butter|Sugar|Bake" 
    Const subs2 As String = "Milk|Eggs|Sugar|Freeze" 
    Const subs3 As String = "Eggs|Flour|Boil" 
    Const subs4 As String = "Potatoes|Oil|Fry" 

    mItems = Split(items, "|") 
    mSubItems1 = Split(subs1, "|") 
    mSubItems2 = Split(subs2, "|") 
    mSubItems3 = Split(subs3, "|") 
    mSubItems4 = Split(subs4, "|") 
End Sub 

Schritt 3: diesen Code in Ihrem

Worksheet_SelectionChange Ereignisse eingeben
Private Sub Worksheet_SelectionChange(ByVal Target As Range) 
    Const DESIRED_ADDRESS As String = "A:A, C:C, E:E" 
    Dim desired As Range 

    IntelliSense.Hide 

    'Check if just one cell has been selected 
    If Target.Cells.Count = 1 Then 
     'Check if target cell is one that we want 
     Set desired = Me.Range(DESIRED_ADDRESS) 
     If Not Intersect(Target, desired) Is Nothing Then 
      'Check that target cell is blank 
      If Len(Target.Value) = 0 Then 
       'All criteria met so show 'IntelliSense' 
       IntelliSense.Show False 
      End If 
     End If 
    End If 

End Sub 
+0

Dies ist sehr beeindruckend, kreativ und nützlich! Es scheint genau das zu sein, was ich brauche. Nur ein paar Fragen zuerst. Warum sollte ich dasselbe für das UserForm- und das 'Worksheet_SelectionChange'-Ereignis einfügen? Könnten Sie mithelfen, zu erklären, warum beide Codes gleich sein müssen? Hat es etwas mit der Weitergabe der Werte zu tun? War da auch ein Schritt zwischen 2 und 4 gemeint oder war das nur ein Tippfehler? – CaffeinatedCoder

+1

Es ist, weil ich ein Muppet bin und den falschen Code eingegeben habe - hängen Sie an und ich werde es ändern. – Ambie

+0

Haha ok danke – CaffeinatedCoder

1

Excel hat einige integrierte Funktionen, die Sie in der Lage sein können, anzupassen:

  1. einfügen ein Comment - ausgelöst durch einfach Mouse-Over
  2. legen Sie eine Data Validation Nachricht - ausgelöst durch in der Klick Zelle
  3. legen Sie eine Data Validation Pull-Down - eine Auswahl aus einer bekannten Liste ein Benutzerformular
  4. um ein Arbeitsblatt Ereignis Makro
  5. zu lenken verwenden anzuzeigen

Von Ihrer detaillierten Anforderungen Beschreibung würde ich Option

+0

Eine Userform in nicht funktionieren würde Meine Situation leider, es sei denn, es gab eine Möglichkeit, eine sehr kleine zu machen, die neben jeder Zelle erschien, wenn die Zelle angeklickt wurde. Wäre es möglich, mehrere Datenvalidierungsregeln mit einem Pulldown auszuführen? Wäre es in der Lage, wieder zu bevölkern? – CaffeinatedCoder

0

Was Ihre auswählen kann beschreiben, unter Verwendung von Datenvalidierung durchgeführt werden. Hier ist ein Artikel, der den Prozess umreißt: https://support.microsoft.com/en-us/kb/211485. Dies ist möglicherweise nicht genau das, nach dem Sie suchen, da Sie mit mehreren Zellen mit den verschiedenen verfügbaren Optionen enden würden, die vom Benutzer ausgewählt werden. Sie können dann eine Verkettungsformel verwenden, um alle Selektionen in einer Zelle zusammenzufassen. Ein anderer könnte dies in VBA besser machen, aber das war mein erster Gedanke, als ich deinen Beitrag gelesen habe. Ich hoffe, das ist Hilfe.

Verwandte Themen