VBA Zahlenkombination in Formularfeld suchen

Hallo,

ich schreibe gerade ein VBA-Makro für ein Word-Formular und suche dringend eine Lösung für folgendes Problem:

Im Formularfeld [Abteilung] können die Abteilungen ihren Abteilungsnamen eintragen. Da wir sehr viele Abteilungen haben, kommt ein Dropdown-Menü nicht in Frage. Zudem gibt es noch Untergruppen der Abteilungen und besondere Arbeitsgruppen. Deswegen kann man schlecht zu genaue Vorgaben machen.

In allen Fällen taucht aber ein dreistelliger Gruppenschlüssel auf: also z.B. „Gruppe 441“. Der Gruppenschlüssel beinhaltet auch immer gleichzeitig die Abteilung (in diesem Fall wäre es Abteilung 44 und Gruppe 441). Viele Anwender füllen die Felder aber sehr unterschiedlich aus: „Gr. 441“ oder „G 441“ oder „Abteilung 44 - Gruppe 441“ oder „A 44 G 441 - Sondergruppe XYZ“.

Ich bräuchte jetzt eine Lösung, wie man aus dem Text immer die dreistellige Zahl ausliest und als Variable festlegt.

Also:
Variable Gruppe = 3-stelliger Zahlencode
Variable Abteilung = die ersten zwei Ziffern des Zahlencodes

Der restliche Text kann wegfallen, benötigt wird nur der Code.

Wäre toll, wenn ihr eine Antwort auf dei Frage habt.

MfG

Stefan

Hi Stefan,

zu Deinem Problem mit der Verarbeitung der Benutzereingabe:

Um Eingaben zu verarbeiten gibt es grundsätzlich immer 2 Möglichkeiten: entweder Du reglementierst die Eingabenmöglichkeiten, dann ist nachher Dein Programmieraufwand geringer, oder Du läßt dem Benutzer völlig freie Hand, dann hast Du höheren Programmieraufwand.

Nachdem Du den 2. Weg gewählt hast würde ich folgende Lösung vorschlagen:
Du legst auf einem Tabellenblatt sämtliche Abteilungs- und Gruppenbezeichnungen ab, z.B.:


441
442
451
471
472

Dann läßt Du den Eingabestring des Benutzers mittels einer FOR-NEXT-Schleife erst auf alle kompletten Bezeichnungen suchen (z.B. 441).
Wird nix gefunden, dann nach den Gruppen (z.B. 44) suchen lassen. Wird in der Eingabe ein ‚44‘ gefunden, dann muß das Prg. noch die möglichen Gruppen, hier 1 oder 2, checken.

Findet das Prg. garnix, dann hat ein Benutzer evtl. eine Variante verwendet, die Du nicht vorhergesehen hast. Also nicht doch den 1. Weg? ;o)

Viele Grüße
Martin

Hi Stefan,

Im Formularfeld [Abteilung] können die Abteilungen ihren
Abteilungsnamen eintragen. Da wir sehr viele Abteilungen
haben, kommt ein Dropdown-Menü nicht in Frage. Zudem gibt es
noch Untergruppen der Abteilungen und besondere
Arbeitsgruppen. Deswegen kann man schlecht zu genaue Vorgaben
machen.

Nur mal so angedacht, es wird doch wohl eine Liste geben wo jeder
Nname einer Abteilung zugeordnet ist, darauf kann man doch zugreifen
über Username und hat damit die Abteilung, egal was da jetzt
eingegeben wird.
Oder wird da oft je nach Projekt die Abteilung gewechselt?
Naja, nur so’ne Idee.

Ich bräuchte jetzt eine Lösung, wie man aus dem Text immer die
dreistellige Zahl ausliest und als Variable festlegt.

Die 2 ersten Stellen auszulesen ist easy mit left(drei(„blabla“),2).
Nachfolgend der Code, zumindest in Excel-Vba läuft er problemlos.
Gruß
Reinhard

Sub test()
MsgBox drei("gr 441")
MsgBox drei("gr 41 441")
MsgBox drei("gr 41 ")
End Sub

Function drei(ByVal Eingabe As String) As String
Dim Pos As Byte
drei = "keine 3stellige Zahl vorhanden"
If Len(Eingabe) 

Hallo Stefan,

ich bin zwar kein Freak in Sachen VBA. Aber in VB würde ich es wiefolgt lösen :smile: Sollte auch unter VBA funktionieren.

Sagen wir die Eingabe liegt in text1

Dim x as Variant
dim i as byte 
x=Split(text1.text," ") 'Voraussetzung das zwischen den eingaben ein Leerzeichen ist!
if isarray(x) then
 for i=lbound(x) to ubound(x)
 if len(x(i))=3 and isnumeric(x(i))then
 'Eintrag wurde gefunden ...+
 'zugreifen auf die Daten mit cstr(x(i)) 
 'Dein Code
 end if
 next i
end if

Sollte die Situation nicht gegeben sein, so könnte folgende Routine ihren Dienst erweisen. Musst natuerlich noch deinen beduerfnissen anpassen :smile:

Dim i As Byte
Dim Count As Byte
If Len(Text1.Text) = 0 Then Exit Sub
Count = 0
For i = 1 To Len(Text1.Text)
 If IsNumeric(Mid(Text1.Text, i, 1)) Then
 Count = Count + 1
 Else
 Count = 0
 End If
 If Count = 3 Then
 VariableGruppeString = Mid(Text1.Text, i - 2, 3) ' Als String
 VariableAbteilungString = Mid(Text1.Text, i - 2, 2) 'Als String
 VariableGruppeLong = CLng(Mid(Text1.Text, i - 2, 3)) ' Als Long
 VariableAbteilungLong = CLng(Mid(Text1.Text, i - 2, 2)) 'Als long
 Exit Sub
 End If
Next i
MsgBox "Keine 3 stellige Zahl gefunden"

Wie gesagt. Das ist nun auf VB bezogen und muesste eigentlich auch unter VBA laufen :smile:
MfG Alex

Hallo ihr,

danke erst einmal für die vielen & schnellen Antworten. Mein Bruder hatte mir aber schon vorher die richtige Lösung gezeigt…

a = ActiveDocument.FormFields(„Dienststelle“).Result

For i = 1 To Len(a)
If IsNumeric(Mid(a, i, 1)) And IsNumeric(Mid(a, i + 1, 1)) And IsNumeric(Mid(a, i + 2, 1)) Then Gruppe = Mid(a, i, 3)
Next i

Abteilung = Left(Gruppe, 2)

Ist relativ kurz und funktioniert wunderprächtig. Also zuerst wird aus dem Feld „Dienststelle“ der Wert genommen und in den String a übernommen. Dann läßt er in a so lange suchen, bis er auf drei Zahlen stößt. Ist dies der Fall, so befüllt er den String Gruppe mit den Zahlen. Anschließend nimmt er die ersten zwei Zahlen der Gruppe und bildet daraus die Abteilung.

Grüße aus München

Stefaktiv

a = ActiveDocument.FormFields(„Dienststelle“).Result
For i = 1 To Len(a)
If IsNumeric(Mid(a, i, 1)) And IsNumeric(Mid(a, i + 1, 1)) And
IsNumeric(Mid(a, i + 2, 1)) Then Gruppe = Mid(a, i, 3)
Next i

Hi Stefan,
ich würde so nicht programmieren, ihr habt da schwer Glück das Mid nicht wie andere Vba-Funktionen sofort einen Fehler bringt.
Wenn der String nur 5 Zeichen lang ist greift ihr auf die nicht vorhandenen Zeichen 6 und 7 zu, was andere Funktionen überhaupt nicht mögen.
Besser wäre es zu prüfen ob der String überhaupt min. 3 Zeichen lang ist und dann die For Schleife so zu schreiben:
For i = 1 To Len(a)-2

Schon Cint mag keine nicht vorhandenen Zeichen:

Sub tt()
A = „5“
i = Len(A)
MsgBox CInt(Mid(A, i+1, 1))
End Sub

Gruß
Reinhard

Hallo,

da ist ein schwerliegender Fehler drinnen!
Nehmen wir mal an die zeichenfolge hat 8 zeichen. Eine 3#er Kombination an zahlen gibt es nicht! Falsche eingabe. Gehen wir weiter davon aus das das letzte Zeichen eine Zahl ist.
Was dann passiert, sollte dir bewusst sein!
Wenn du weiter auf der Variante pochen möchtest, so andere wenigstens die Schleife auf

For i=1 to len(a)-2 ab und setze darueber if len(a)

Hallo,

danke für die Antwort und die Mühe. Ich habe den vorgeschlagenen Zusatz noch mit dazu geschrieben. Nachdem ich mit der Funktion einen String befülle und diesen noch mit isnumeric und auf die Länge hin prüfe, sollte jetzt nichts mehr passieren können.

MfG

Stefan

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]

Hallo,

also an sich gibt es natürlich eine Liste mit allen Abteilungen und Dienststellen. Das sind aber ziemlich viele. Und ich wollte vermeiden meterlange Suchabfragen eintippen zu müssen. Die Lösung mit der Suche nach den drei Zahlen ist mir da schon lieber. Ein bißchen problematisch wäre nur, wenn sich einmal jemand vertippt und mehr als eine 3-stellige Zahl im Feld stehen. Aber dann würde mir die direkte Suche nach einer Liste auch nichts bringen. An sich kann das Formular nur aus einer ganz bestimmten Gruppe kommen - zwei Gruppen sind im Feld eigentlich ausgeschlossen.

MfG

Stefan

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]