Neuigkeiten:

Wenn ihr euch für eine gute Antwort bedanken möchtet, im entsprechenden Posting einfach den Knopf "sag Danke" drücken!

Mobiles Hauptmenü

Barcode in Variale speichern, zerlegen und an Textfeld übergeben

Begonnen von omron2003, Dezember 01, 2016, 11:58:17

⏪ vorheriges - nächstes ⏩

Lachtaube

#30
Das lässt sich Alles gestalten, wenn nur die exakten Regeln bekannt sind. Der Unterstrich wird ja bereits abgedeckt. Zusätzlich mit Bindestrich käme dieses Muster zur Anwendung:
91(\w{8})10([\w-]{8,10})3100(\w{6})
Grüße von der (⌒▽⌒)

Josef P.

Hallo!

Ich nehme an, das {GS} das FNC1-Zeichen symbolisiert.
Gib bitte einmal alle Zeichen des Barcodes als ASC-Wert aus.

Prinzip:
dim BC as String
dim i as long

BC = me.DeinTextfeldInDasDerBarcodeEingelesenWurde.Value
debug.print "Länge:", Len(BC)
Debug.Print "ASC-Werte:",
for i = 1 to len(BC)
   Debug.print Asc(mid(BC, i, 1)),
next
debug.print

Vielleicht siehst du dann den zu suchenden ASC-Wert des FNC1-Zeichens.

mfg
Josef

omron2003

Hallo Josef P.,

anbei das Debug-Ergebnis deines Codes:
Länge:         30
ASC-Wert:      57            49            82            88            48            52            50            49            53            49            49            48            76            76            54            45            48            56            86            66            51            49            48            48            48            48            48            48            50            53           


mfg
Omron2003

daolix

hallo
wie es ausschaut steht in deinem Textfeld der Barcode ohne FNC1/GS-Zeichen, wurde wahrscheinlich von deiner scannersoftware automatisch entfernt.

omron2003

@Lachtaube
es funktioniert bestens mit dem regulären Ausdruck,
ist es hier auch Möglich bei einem Ereignis (Textfeld Vor Aktualisieren) mehrere Regeln einzubinden?

91(\w{8})10([\w-]{8,10})3100(\w{6}) 
91(\w{8})10([\w-]{10})


Besten Dank im Voraus
Omron2003


Lachtaube

Das geht auch - es gibt dann natürlich nur 2 SubMatches.   If .Test(DerText) Then
      '...
   Else
      .Pattern = ZweitesMuster
      If .Test(DerText) Then
         'zweites Muster passt
         'weiter wie zuvor
Grüße von der (⌒▽⌒)

omron2003

irgendwie mache ich was falsch!
Bekomme die Meldung Fehler beim Kompilieren:
Else ohne If

ZitatConst CLSID_RegExp = "{3F4DACA4-160D-11D2-A8E9-00104B365C9F}"
   Const MUSTER$ = "91(\w{8})10(\w{10})3100(\w{6})"
   Const MUSTER1$ = "91(\w{8})10(\w{7})"

   With CreateObject("new:" & CLSID_RegExp)
      .Pattern = MUSTER
      If .Test(Me.Barcode) Then
         With .Execute(Me.Barcode)(0)
            If .Submatches.Count = 3 Then
               Me.Material = .Submatches(0)
               Me.Charge = .Submatches(1)
               Me.Menge = .Submatches(2)
            End If
   Else
      .Pattern = MUSTER1
      If .Test(Me.Barcode) Then
         With .Execute(Me.Barcode)(0)
            If .Submatches.Count = 3 Then
               Me.Material = .Submatches(0)
               Me.Charge = .Submatches(1)
            End If
         End With
      Else
         MsgBox "Keineübereinstimmung"
      End If
   End With
End Sub

Beaker s.a.

#37
gelöscht
Alles, was geschieht, geschieht. - Alles, was während seines Geschehens etwas anderes geschehen lässt, lässt etwas anderes geschehen. - Alles, was sich selbst im Zuge seines Geschehens erneut geschehen lässt, geschieht erneut. - Allerdings tut es das nicht unbedingt in chronologischer Reihenfolge.
(Douglas Adams, Mostly Harmless)

Lachtaube

Ungetestet:   Const CLSID_RegExp = "{3F4DACA4-160D-11D2-A8E9-00104B365C9F}"
   Const MUSTER$ = "91(\w{8})10(\w{10})3100(\w{6})"
   Const MUSTER1$ = "91(\w{8})10(\w{7})"

   With CreateObject("new:" & CLSID_RegExp)
      .Pattern = MUSTER
      If .Test(Me.Barcode) Then
         With .Execute(Me.Barcode)(0)
            If .Submatches.Count = 3 Then
               Me.Material = .Submatches(0)
               Me.Charge = .Submatches(1)
               Me.Menge = .Submatches(2)
            End If
         End With
      Else
         .Pattern = MUSTER1
         If .Test(Me.Barcode) Then
            With .Execute(Me.Barcode)(0)
               If .Submatches.Count = 2 Then
                  Me.Material = .Submatches(0)
                  Me.Charge = .Submatches(1)
               End If
            End With
         Else
            MsgBox "Keineübereinstimmung"
         End If
      End If
   End With
Grüße von der (⌒▽⌒)

omron2003

da habe ich im oberen Codeanschnitt ein
ZitatEnd With
vergessen.

Jetzt funktioniert es!
Nochmals besten Dank für die kompetente Hilfe


PS.
Eine Frage hätte ich noch,
wie müsste ich in einen Muster das Leerzeichen deklarieren?
Ein beliebiges Wortzeichen ist ja " \w " und bei einmel Leerzeichen?


Gruß
Omron2003

omron2003

so das mit dem Leerzeichen habe ich nun mit dem Ausdruck \2 hinbekommen,
ZitatConst MUSTER$ =AB.([\w.]{2})([\s\w]{4})]
nur habe ich aber im Ausgabe Textfeld ein Leerzeichen!
Gibt es eine Möglichkeit das diese Leerzeichen nicht mitübernommen wird?

Gruß
Omron2003

omron2003

mit Trim habe ich das unnötige Leerzeichen entfernt bekommen,
ob das die optimale Lösung ist weis ich nicht.
Aber es scheint zu funktionieren.
ZitatConst CLSID_RegExp = "{3F4DACA4-160D-11D2-A8E9-00104B365C9F}"
    Const MUSTER$ = "AB.([\w.]{2})([\s\w]{4})([\s\w]{4})"

   With CreateObject("new:" & CLSID_RegExp)
      .Pattern = MUSTER
      If .Test(Me.ZerlegWert) Then
         With .Execute(Me.ZerlegWert)(0)
            If .Submatches.Count = 3 Then
               Me.Wert1 = .Submatches(0)
               Me.Wert1 = Trim(Me.Wert1)
               Me.Wert2 = .Submatches(1)
               Me.Wert2 = Trim(Me.Wert2)
               Me.Wert3 = .Submatches(2)
               Me.Wert3 = Trim(Me.Wert3)
            End If
         End With
      Else
         MsgBox "Keineübereinstimmung"
      End If

Lachtaube

Ein einzelnes Leerzeichen kann ganz einfach als Literal " " (ohne die Anführungszeichen) verwendet werden. Dahinter kannst Du dann auch einen Quantor setzen. * für keinen bis unendlich viele, + für einen bis unendlich viele, ? kein- bis einmal, {x} exakt x-mal, {x,} mindestens x-mal, {x,y} zwischen x- und y-mal, {0,x} kein- bis x-mal. Du kannst natürlich auch mehr als ein Leerzeichen angeben ohne einen Quantor zu verwenden - dann muss der Text aber exakt für einen Treffer passen. Das Gesagte trifft eigentlich auf alle Zeichen zu. Zeichen, die z. Bsp. für die Deklaration als Quantor verwendet werden, das Escape-Zeichen /, Zeichen für Satz-Anfang ^ oder Ende $, jegliche Klammern, der Punkt müssen durch ein Escape-Zeichen als Literal gekennzeichnet werden. Wenn man die Sache dann in etwa verstanden hat, können die Regexen richtig Spaß machen. Im Internet finden sich auch viele OL-Tools, um seine Ausdrücke testen zu können.
Grüße von der (⌒▽⌒)