2013-06-10 10 views
6

Ich habe einige Kombinationsfelder, die ich beim Öffnen der Arbeitsmappe ausfüllen - die Quelle der Daten stammt aus einer Datenbank.Excel gefunden unlesbaren Inhalt - Datenüberprüfung

ich bevölkern meine Kombinationsfelder Datenvalidierung mit dem folgenden Code: -

With Selection.Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=list 
    .IgnoreBlank = False 
    .InCellDropdown = True 
    .ShowInput = True 
    .ShowError = True 
    End With 

wo Liste eine durch Komma getrennte Zeichenfolge, die ich aus der Datenbank-Cord aufgebaut.

Das alles funktioniert gut. Das Problem tritt auf, wenn ich die Arbeitsmappe später erneut öffne. Ich erhalte eine Fehler

„Excel nicht lesbaren Inhalt gefunden. Haben Sie den Inhalt dieser Datei wiederherstellen wollen“

Sie sagen Ja und Excel dann gibt Ihnen

„Excel konnte die Datei reparieren, indem Entfernen von Features“

und die Datenvalidierung von einigen der Combo-Boxen ist

ich von einem Internet-Suche vermuten gegangen, dass die Zeichenfolge ich für meine Datenvalidierung bin mit zu lang ist?

Es ist keine Option für mich, die Re-Cord-Set-Werte zu einem ausgeblendeten Blatt hinzuzufügen und die Datenüberprüfungsquelle auf einen Bereich auf dem ausgeblendeten Blatt festzulegen, wie die Kombinationsfelder dynamisch sind und abhacken und je nach Benutzerauswahl ändern. Ich muss nur in der Lage sein, die Datenüberprüfung auf meine Zeichenfolge zu setzen, die ich an verschiedenen Punkten in der Benutzerinteraktion aufgebaut habe.

Wenn die Zeichenfolge zu lang ist, ist es möglich, an Data Validation anzufügen, oder gibt es einen anderen Trick, den ich verwenden kann, um dieses Problem zu umgehen?

+2

die Zeichenfolge ist auf 255 Zeichen begrenzt. keine Ausnahmen oder Tricks - wenn du länger brauchst, _habe_ einen Bereich zu benutzen – JosieP

+1

Danke Josie. Interessant, dass es zum Zeitpunkt der Einstellung der Valiation keinen Fehler gibt. Nur wenn du es das nächste Mal öffnest. Bizarres Verhalten – David

+0

@JosieP ist die richtige Antwort dafür, danke –

Antwort

1

Es scheint, dass Sie mit der Zeichenfolge Länge von Validation formula1 parameter richtig sind. Mein Vorschlag für Sie ist wie folgt (weitere Informationen wie Kommentare in den Code platziert sind):

'Split your list into array, or if data are Array before you _ 
create List variable you could combine some of earlier steps _ 
of your code 

    List = Split(List, ",") 
'paste your list into hidden sheet as of A1 direction bottom, _ 
we need to transpose our Array to do so 
    Sheets("hidden").Range("a1").Resize(UBound(List) + 1, 1) = Application.Transpose(List) 

With Selection.Validation 
    .Delete 
    'here we need to change definition of formula 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, _ 
    Formula1:="=Hidden!A1:A" & UBound(List) + 1 
    .IgnoreBlank = False 
    .InCellDropdown = True 
    .ShowInput = True 
    .ShowError = True 
    End With 
+0

Danke für Ihren Vorschlag. Ich mag die Verwendung der Dynamikbereichszuweisung. Allerdings habe ich Combos, die eine Teilmenge aller möglichen Werte basierend auf vorherigen Combo-Optionen anzeigen. Dies bedeutet, dass ich Bereiche für jede Teilmenge von Daten basierend auf der übergeordneten Kombination definieren müsste. Möglicherweise muss ich Active X Combos als Alternative betrachten – David

5

Ich habe schon in einigen meiner Excel-Projekte Validierungslisten manipuliert. Wenn Sie die Überprüfung auf "Zulassen: Liste" festlegen, können Sie Ihre Datenquelle als benannten Bereich auf Arbeitsmappenebene festlegen. In diesem Beispiel habe ich einen benannten Bereich „Listrange“ definiert:

With Selection.Validation 
    .Delete 
    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _ 
     xlBetween, Formula1:="=listrange" 
    .IgnoreBlank = True 
    .InCellDropdown = True 
    .ShowInput = True 
    .ShowError = True 
End With 

Sie werden nie einen Fehler für den Formel-String zu lang erhalten.

Ich lege alle meine Validierungs-referenzierten benannten Bereiche in ein Arbeitsblatt und mache es ausgeblendet. Dann manipuliert mein Code diese benannten Bereiche, die wiederum die Werte aktualisieren, die in den Dropdown-Menüs für die Validierung verfügbar sind.

Es kann schwierig sein, die Größe der genannten Bereiche dynamisch zu aktualisieren, während sie aktualisiert werden, aber es ist nicht schwer mit VBA, insbesondere nicht, wenn Sie Sätze aus einer Datenbank zurückgeben, wo Sie eine Datensatzanzahl erhalten können . Die Alternative ist die ActiveX-Steuerroute, aber ich mag das saubere, native Aussehen der Datenvalidierungsdrop-downs.

1

Gerade in dieses Problem (Begrenzung der Länge der Datenvalidierungsformel beim Öffnen der Arbeitsmappe), und wie das OP würde nicht mit Hilfsbereichen gehen wollen.

Meine Problemumgehung besteht darin, die Validierungen im Handler Workbook_BeforeSave zu löschen.

Mein Anwendungsfall ist immer die Daten von externen Quellen zu aktualisieren, so ist es eine praktikable Option, alle importierten Daten und Validierungen vor dem Speichern der Arbeitsmappe immer zu löschen.

0

Es gibt einen Weg herum, speichern Sie die Zeichenfolgen, die Sie für Ihre bedingte Formatierung irgendwo in der Arbeitsmappe verwenden, bevor Sie es verwenden. Wenn Sie sie verwenden, verweisen Sie sie auf den Bereich, in dem Sie sie gespeichert haben, und nicht auf die Strings. Denken Sie daran, longs Zeichenfolge in der bedingten Formatierung ist das, was bewirkt, dass es eine Funktion tun, dass, wenn Sie die Arbeitsmappe schließen aus wischt sich den problematischen Zustand Formatierung und eine andere Funktion, dass beim Öffnen sie auf

legt zurück

Problem gelöst und es funktioniert ein Genuss :)

2

Ich habe dieses Problem gelöst, indem ich meine Validierung im WorkbookBeforeSave-Ereignis gelöscht habe. Allerdings verwende ich C#

Verwandte Themen