2017-08-08 4 views
0

Ich möchte eine Datenüberprüfungsliste aus Text nur in einem Bereich von Zellen erstellen.Text aus dem Bereich abrufen - VBA (Excel)

Ich suchte nach Formel, aber ich fand nichts, also entschied ich mich, meine eigene Funktion zu machen, aber es funktioniert nicht.

habe ich versucht, diese Codes:

Code 1:

Function ListFromRange(rng As Range) As Range 

    Dim cl As Range 
    Dim entry As Range 

    For Each cl In rng 
     If Not IsNumeric(cl.Value) Or cl.Value = "" Then 
      If entry Is Nothing Then 
       Set entry = cl 
      Else 
       Set entry = Union(entry, cl) 
      End If 
     End If 
    Next 

    Set ListFromRange = entry 
End Function 

Code 2:

Function ListFromRange2(rng As Range) As Variant 

    Dim cl As Range 
    Dim i As Integer 
    Dim entry() As String 
    ReDim entry(rng.Count) 

    For Each cl In rng 
     If Not IsNumeric(cl.Value) Or cl.Value = "" Then 
      entry(i) = cl.Value 
      i = i + 1 
     End If 
    Next 

    ListFromRange2 = entry 
End Function 

Der zweite Code funktioniert, aber wenn ich mit einem festgelegten Namen und Verwendung verwenden, die definiert Name für die Datenüberprüfungsliste Es sagt mir, dass es einen Fehler in der Validierungslistenquelle gibt, aber wenn ich diese Funktion mit dem Index verwende, wird das gewünschte Ergebnis zurückgegeben.

Auch einige Bilder mehr erklären:

Source Range

ich eine Liste von Zellen machen wollen, die einen Text enthält, und wenden Sie es hier:

Target List

Aber ohne die Zahl Werte.

+0

Ich denke, Sie wollen, dass Sie 'If' Anweisung tatsächlich sein 'If Not IsNumeric (cl.Value) Und nicht cl.Value =" "Then'. Das "Not" gilt für jede Anweisung einzeln, wenn Sie Ihre Logik nicht begrenzen. Geben Sie in der ersten Zeile auch eine 'Range' und keine' Variant' zurück. Schließlich, * was versuchst du ** zu machen? Du hast es nicht wirklich gesagt. Momentan gibt Ihre Funktion einen Bereich von Zellen zurück, die nicht-numerische Werte enthalten ... warum ist das falsch/was soll es sonst tun? – Wolfie

+0

Die Validierungsliste funktioniert nicht für meine UDF, was Sie im Bild sehen, ist eine Validierung für die gesamte Zeile, so dass Zahlenwerte enthalten sind. – Tima

+0

Okay, hast du deine Logik aktualisiert, wie ich oben vorgeschlagen habe? Dann sind Sie sicher, dass Sie die Werte im Drop-down löschen und aktualisieren?Es gibt keine Möglichkeit, dass "IsNumeric (" 12.300 ")" false "zurückgibt, also ist Ihre Logik in Ordnung, es muss anderer Code sein, den Sie nicht anzeigen, der fehlschlägt. – Wolfie

Antwort

1

Das Problem ist, dass der resultierende Bereich mehrere Spalten ist und nicht als Quelle für eine Datenüberprüfungsliste verwendet werden kann. Wenn Sie das Design der Tabelle der Optionen nicht so ändern können, dass es nur eine Spalte ist, müssen Sie eine andere Möglichkeit finden, die Validierungsliste einzurichten.

Hier ist eine Lösung mit VBA. Ich lege das in ein Sub, das bei Bedarf als Makro ausgeführt werden kann, aber Sie können es in ein Worksheet-Ereignis einfügen, das ausgelöst wird, wenn sich Daten auf dem Blatt ändern oder ein anderes Ereignis.

Dies erstellt nur die Validierungsliste so weit unten, wie es Daten in Spalte A gibt. Sie werden es wahrscheinlich weiter nach unten tragen oder, wie erwähnt, in ein Arbeitsblatt-Ereignis einfügen, damit es aktualisiert wird Validierungsliste, wenn neue Zeilen hinzugefügt werden.

Ich richte meine Blätter wie folgt ein, aber Sie können auch mein Beispiel here herunterladen.

Basic Price

Example

Option Explicit 

Sub Create_Validation_List() 
    Dim rngList As Range, cl As Range 
    Dim rngValidationList As Range 
    Dim strList As String 

    Set rngList = Worksheets("BasicPrice").Range("A2:F3") 
    strList = "" 
    For Each cl In rngList 
     If Not IsNumeric(cl.Value) And Not cl.Value = "" Then strList = strList & "," & cl.Value 'Add to our Validation List 
    Next cl 
    strList = Mid(strList, 2) 'Chop off leading comma 

    'Apply Data Validation to this Range (starting at cell C2 and ending at the last row with data in column A) 
    Set rngValidationList = Range("C2:C" & Cells(Rows.Count, "A").End(xlUp).Row) 

    Application.EnableEvents = False 
    With rngValidationList.Validation 
     .Delete 
     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
     xlBetween, Formula1:=strList     'Pass in Validation List created above 
     .IgnoreBlank = True 
     .InCellDropdown = True 
     .InputTitle = "" 
     .ErrorTitle = "" 
     .InputMessage = "" 
     .ErrorMessage = "" 
     .ShowInput = True 
     .ShowError = True 
    End With 
    Application.EnableEvents = True 
End Sub 

Lassen Sie mich wissen, wenn Sie Fragen haben.

+0

Dies ist interessant, aber ich kann nicht den 'Basic Price-Brand' Bereich in einem anderen Blatt in der Tat diesen Bereich neben der Tabelle, die ich versuche, um die Daten zu machen Validierungsliste zu und ihre Anzahl von Zeilen sind identisch, außerdem hat jede Zeile in der Tabelle eine Datenüberprüfungsliste für Marken in der gleichen Reihe im 'Basispreis-Marke'-Bereich nicht die gesamten Reihenzeilen, jedenfalls habe ich Ihren Punkt in der Code und wird ein paar Anpassungen vornehmen, um es meinen Bedürfnissen anzupassen. Thanks – Tima

+1

Absolut, können Sie die Basic Price Brand-Bereich irgendwo benötigt, nur um den Bereich an dieser Stelle im Code umleiten. Lass es mich wissen, wenn du Hilfe brauchst. –

Verwandte Themen