PDA

Vollständige Version anzeigen : Datenprüfung Liste


trekking1
20.09.2016, 13:54
Hallo Miteinander,

hätte da mal ein interessantes Phänomen und wollte mal wissen ob es da Abhilfe gibt.

Zelle als Standard (oder Text, macht keinen Unterschied) formatiert.
Datenprüfung mit Liste. In die Liste wurden die Werte G;M;SR;R eingetragen. Diese bilden die Grundlage für eine spätere IF Bedingung in VBA.
Wählt der Nutzer nun einen Wert aus, gibt mir Excel in VBA die Value z.B. "M" zurück. Alles Fein.
Trägt der Nutzer nun den Wert selbst ein und macht ein Leerzeichen davor oder dahinter erhalte ich in VBA die Value " M " (oder "M " oder " M"). Meine If Bedingung geht also zum Teufel da ja nicht mit "M" sondern mit " M " verglichen wird.
Da ich aus der Access Welt komme bin ich nun etwas vom Glauben abgefallen, dass dies in Excel geht. Entspricht " M " ja nicht meinem in der Liste definiertem "M".
Gibt es da Abhilfe für das verhalten?

(Wie ich es mit VBA lösen könnte, nämlich mit Leerzeichen entfernen, wüsste ich, kann aber fast nicht glauben, dass ich das machen muss)

Vielen Dank für eure Unterstützung.

trekking

Pit987
20.09.2016, 14:06
Hallo trekking1!
Das geht in Excel.
In der Datenprüfung wählst Du Daten - Datenüberprüfung - Liste - Formel und dann alles außer Leerzeichen.

Viel Erfolg
Pit

trekking1
20.09.2016, 14:19
Hallo Pit987,

danke für Deine Antwort. Leider verstehe ich das nicht so richtig. Wenn ich Liste auswähle, dann kann ich keine Daten Auswählen. Das Feld ist dann ausgegraut.

Wo würde ich welche Formel hinschreiben?

Sorry fürs blöde anstellen.

LG
trekking

Pit987
20.09.2016, 14:24
Hallo trecking1!
Das ist nicht Deine Schuld. Ich habe zwei Dinge durcheinander gebracht.
LISTE fiel mir ein, wenn Du Deine vier Varianten einfach vorgibst. Dann kann jeder nur die vorgegebenen Werte verwenden.
Das mit der Formel findest Du unter Benutzerdefiniert.

Viel Erfolg
Pit

xlph
20.09.2016, 14:27
Trägt der Nutzer nun den Wert selbst ein und macht ein Leerzeichen davor oder dahinter

Und die Liste ist so eingestellt dass das möglich ist?

trekking1
20.09.2016, 14:31
@PIT987
Dann bin ich ja beruhigt, hatte schon an meinem Verstand gezweifelt:)
Das mit dem Vorwählen stimmt leider nur bedingt. Ich kann eben Leerzeichen eingeben und er meckert trotzdem nicht.

@xlph
Habe leider keine Einstellung gefunden, die mir das verhindert. Wenn du eine kennst, dann bitte her damit. Das ist nämlich das was ich Suche.

LG
trekking

xlph
20.09.2016, 14:34
Inder Tat ist das möglich wenn als Quelle feste Werte eingegeben werden.
Wird statt der festen Werte ein Zellbezug angegeben, indem diese Werte stehen, so ist das nicht mehr möglich.

Ist vielleicht ein Bug?!

trekking1
20.09.2016, 14:43
@XLPH
Ja, mit festem Bezug geht es. Wollte das aber vermeiden.

Wir sind uns aber einig, dass das Mist ist und in meinen Augen ein BUG. ergibt keinen Sinn.

Hat jemand noch eine Lösung ohne Bezug?

VG
trekking

Pit987
20.09.2016, 14:44
Hallo trecking1!
Wie machst Du das in ACCESS?

Ganz einfach:
auf der Seite, auf der Deine Tabelle ist, suchst Du Dir einen Bereich, in dem Du die zulässigen Werte einträgst.
Nun wählst Du in der Gültigkeit auf Liste und gibst den Bereich mit Dollarzeichen an, in dem die zulässigen Werte stehen. Fertig.
Nun kann auch kein Leerzeichen eingegeben werden. In jedem Feld mit dieser Gültigkeit ist rechts ein DropDown, wo die Einträge ausgewählt werden können.

Soll die Liste nicht auf Deiner Tabelle liegen, sondern in enem anderen Sheet, dann muss die Liste einen Bereichsnamen haben.

Soll es eine Formel sein, dann trage =WECHSELN(WECHSELN(WECHSELN(WECHSELN(B1;"M";"");"S";"");"SR";"");"G";"")
ein. Dann von B1 runterkopieren, soweit, wie Du es brauchst.
Schreibe eine Erläuterung unter Fehlermeldung für die Kollegen und das war´s.

Viel Erfolg
Pit

Pit987
20.09.2016, 15:07
Hallo trekking1!
Ich habe das gerade in meiner Beispieldatei überprüft. Man kann bei der Lösung LISTE kein Leerzeichen eingeben.
Da hast Du einen Fehler.
Lade mal bitte eine Beispieldatei mit diesem Fehler hoch.

Pit

Pit987
20.09.2016, 15:16
Hallo trekking1!
Das mit dem festen Bezug bei xlph habe ich nicht verstanden.
Die Beispieldatei habe ich mit einem Bereichsnamen erweitert.

Pit

trekking1
20.09.2016, 15:22
@Pit987
In Access meckert er beim eingeben von Leerzeichen in ein Kombifeld, das mit "nur Listeneinträgen" formatiert ist.

Danke für Deine Erklärung. Muss das wohl so lösen.

Habe den Fehler nochmal nachgestellt in einem neuen Sheet und bei meinem Kollegen, der 365 hat. Gleiches Ergebnis.

Du kannst das nachvollziehen indem du ein Feld mit Datenüberprüfung und einer Liste mit M;S;L einstellst. In das Feld dann manuell 3 Leerzeichen eingibst und dann ein M. Und siehe da, er motzt nicht (wie erwartet) sondern akzeptiert die Eingabe. Benutze ich den Wert dann in VBA, ist es eben nicht der Wert sondern " M". Das gleich spiel mit Leerzeichen hinter dem Buchstaben. Diese siehst du allerdings nicht. Über VBA kannst du aber die Länge abfragen und stellst dann fest, dass es nicht 1 sondern eben entsprechen ist.

*Edit
Danke für das Beispiel
*Edit Ende
VG
trekking

Pit987
20.09.2016, 15:28
Hallo trekking1!
In meiner Datei kann ich nicht die vorgegebene Auswahl verändern.
Auch nicht mit drei vorangestellten Leerzeichen.
Schaffst Du das in meiner Datei?
Das würde doch die ganze Gültigkeitsprüfung überflüssig machen.

Pit

xlph
20.09.2016, 15:31
@Pit987

siehe Datei, dann geht ein Lichtlein auf...:)

Pit987
20.09.2016, 15:46
Hallo xlph!
Danke für die Datei. Solch eine Eingabe habe ich bisher in keinem meiner Excelbücher gefunden.

Einen schönen Tag noch
Pit

trekking1
20.09.2016, 16:44
Hallo Miteinander,

habe es jetzt dann mit VBA gelöst indem ich den Wert im Ereignis worksheet Change abfrage und eine Fehlermeldung ausgebe wenn ein Leerzeichen drin ist.

Da das Excel etwas komplex ist und auch Worksheets kopiert etc. werden, war dies der einfachste Weg, gegenüber dem ganzen in ein anderes worksheet zu schreiben und zu verlinken. (Habe das Problem mit einigen Feldern)

Codeschnipsel dazu: (My.Tools ist eine Klasse und für meinen Code spezifisch. ZeichenZaehlen kann auch in ein Modul kopiert werden mit entsprechendem Aufruf oder als private function im Tabellenblatt verwendet werden.)

'Überprüfen ob ein Leerzeichen in den Auswahlfeldern Art und Typ angelegt wurde. Wenn ja, dann den Wert nicht akzeptieren
If Not Intersect(Target, Range("C36:D47")) Is Nothing And Target.Value <> "" Then
Application.EnableEvents = False
If My.Tools.ZeichenZaehlen(Target.Value, " ") <> 0 Then
Target.Select
Target.ClearContents
Call MsgBox("Sie haben ein oder mehrere Leerzeichen eingegeben." _
& vbCrLf & "Bitte benutzen sie nur die in der Auswahl angegebenen " _
& vbCrLf & "Buchstaben." _
& vbCrLf & "Der Inhalt des Feldes wird gelöscht, " _
& vbCrLf & "bitte machen Sie erneut Ihren Eintrag." _
, vbCritical, "Leerzeichen gefunden!")
Application.EnableEvents = True
GoTo Ex
End If
End If

Public Function ZeichenZaehlen(strText As String, Zeichen As String) As Integer
Dim I As Integer
Dim Anzahl As Integer
ZeichenZaehlen = 0
I = 1
Do While I <= Len(strText)
Anzahl = InStr(I, strText, Zeichen)
If Anzahl > 0 Then
I = Anzahl + 1
ZeichenZaehlen = ZeichenZaehlen + 1
Else
Exit Do
End If
Loop
End Function



Danke nochmal an alle fürs Helfen und Tipps geben.

LG
trekking

xlph
20.09.2016, 16:56
Ändere den Bereich C36:C37 auf einmal:
1. C36:C37 markieren
2. z.B. 'M' eintragen
3. mit Strg+Enter abschließen

...und was passiert?

trekking1
20.09.2016, 17:01
@XLPH

Wie schon gesagt, es gibt hier nicht nur einen Eintrag, sondern mehrere verschiedene und ich hätte dann zig verwaiste Einträge, auf die ich verweisen muss. Des Weiteren wird das Tabellenblatt dann noch kopiert etc.

Ist so mit VBA einfacher und für mich in ca. 1 Minute erledigt gewesen :)

Oder habe ich nicht verstanden was du meintest?!

VG
trekking

xlph
20.09.2016, 17:06
Führ einfach Post #17 aus und berichte was passiert.:rolleyes:


...ist kürzer, Schleife nicht nötig!
Public Function ZeichenZaehlen_xlph(ByVal strText As String, ByVal strZeichen As String, _
Optional ByVal lngVergleichsModus As VbCompareMethod = vbBinaryCompare) As Integer
ZeichenZaehlen_xlph = Len(strText) - Len(Replace(strText, strZeichen, "", Compare:=lngVergleichsModus))
End Function

trekking1
20.09.2016, 17:55
@xlph
OK ich berichte Dir was passiert:
Wenn das z.B. M nicht da ist, dann gibt er die Fehlermeldung aus, (im ersten markierten Feld), dass es fehlt und eingetragen werden muss (Excel Datenprüfung)
Wenn ich Leerzeichen eingebe, dann gibt er die Fehlermeldung aus, die du im Code nachlesen kannst.
Er macht also alles so wie ich es will.
Wenn Du mir mitteilst, auf was du hinauswillst, dann kann ich Dir eventuell die Info liefern.

Zu Deinem Code. Der Sieht gut aus, macht aber nicht das was er soll
Gebe mal folgendes in beide Codes ein

(" M ","M ")
Ergibt bei deinem Code = 2

Bei meinem Code = 1 was Richtig ist.

Mit meinem Code kann man auch Zeichenfolgen zählen.

Bei ("Test mich Test mich","Test") ist es soger 8 : 2

Werde also den Code verständlicherweise nicht ersetzen :)

Vielen Dank für Deine Hilfe

LG
trekking

xlph
20.09.2016, 18:23
Ok trekking1,

ich sehe du bist nicht in der Lage Post #17 abzuarbeiten.

Der rote Teil läuft in einen Fehler sobald ein Zellbereich, nicht nur eine Zelle, eine Änderung erfährt.

If Not Intersect(Target, Range("C36:D47")) Is Nothing And Target.Value <> "" Then

Zur Funktion: Trim() eliminiert führende und nachfolgende Spaces.
...nur so als Tip.

Werde also den Code verständlicherweise nicht ersetzen.
Der Glaube verschafft einem Zuversicht und Sicherheit, leider ist selten die Wahrheit.;)

Denke was du willst. Arbeite wie du denkst. Glaube wie du arbeitest.

Glaube weicht der Kenntnis.

In diesem Sinne, viel Glück, denn Erfolg kann ich dir nicht wünschen, das impliziert Erfahrung und Kenntnis.

...ich bin dann mal raus und weg.:mrcool:

trekking1
11.10.2017, 00:01
Hatte hier vergessen zu Antworten.

Post #17 hat hier keine Auswirkung, weil der Fehler der auftreten könnte vorher schon dahingehend abgefangen wird, dass Mehrfachauswahl einen Abbruch des Codes bedingt. Hatte am Anfang geschrieben, dass es nur ein Codeschnipsel ist. Also über dem geposteten noch anderer Code steht.
Das Ganze läuft nun seit langer Zeit äußerst stabil und ohne Fehler (>1 Jahr) :)


In diesem Sinne, viel Glück, denn Erfolg kann ich dir nicht wünschen, das impliziert Erfahrung und Kenntnis.
Warum manche Leute immer so schnell beleidigend werden ohne die Person mit der Sie solche Dinge austauschen richtig zu kennen, habe ich nie verstanden. Friede sei mit Dir xlph. Ich kann damit gut leben.

Viele Grüße trekking