Wie kann ich einen Textfeldinhalt nach Überprüfung von drei Bedingungen in die entsprechnende Postition einer Tabelle schreiben?

Hallo zusammen,

ich habe mal wieder eine Frage.

Ich habe eine Userform mit 4 Textfeldern und einer Combobox. In der Combobox werden in einem Dropdown Menue verschiedene Namen angezeigt. In dem erste Textfeld wird das Quartal eingegeben, in das zweite Textfeld wird der Name des Einkaufsmarktes eingegeben und in den beiden letzten Textfelder werden Zahlen eingegeben. Nun möchte ich, dass die Werte der ersten drei Textfelder mit den Werten einer Tabelle vergleichen werden. In Spalte B der Tabelle stehen die Namen und in Zeile 3 stehen spaltenweise die Quartale und die Einkaufsmärkte. Stimmen der Name, das Quartal und der Marktname überein, sollen die Zahleneingaben genau hinter dem Namen, dem Quartal und Einkaufsmarkt in die Tabelle eingetragen werden. Ich habe es schon mit instr versucht, aber leider noch nicht gefunden, wie man mit dem Befehl eine ganze Zeile durchsuchen kann.

Ich hoffe, ich habe mich verständlich ausgedrückt, und es kann mir jemand helfen.

Schon einmal vielen Dank im voraus.

LG Martina

Nee, sorry. Redest du von VBA in Excel? Lad mal eine Beispieldatei mit Testdaten hoch.

Hallo Flowerwoman,

ja, es handelt sich um VBA bei einer Userform. Hier wäre die Testdatei:

https://www.file-upload.net/download-13110419/Beispielmappe.xlsm.html

Leider klappt die Programmierung hinter dem „Werte einfügen“ Button nicht. Ich weiß nicht, wie ich die Zelle anwählen kann, bei der alle Voraussetzungen übereinstimmen, Also das Quartal, der Markt und der Name.

Ich hoffe, du kannst mir helfen.

Danke Dir.

LG Martina

Mal zwei Ideen:

https://msdn.microsoft.com/en-us/vba/excel-vba/articles/range-find-method-excel

Damit kannst du in einem Range nach einem Inhalt suchen.
So wie du schreibst, ist die Kombi Name, Q und Markt eindeutig. (macht ja sonst keinen Sinn)
Füge in einer separaten Spalte die drei Werte als key ein: =A1&B1&B3 (oder so, je nach dem wo die Zellen sind)
Bilde in deinem Code den Key „genauso“ entsprechend der Auswahl.
Suche nach dem Key: Wird er gefunden, hast du die richtige Zeile.

Oder: Filter per VBA auf die Tabelle setzen. Bleibt eine Zeile üer, ist es die gesuchte.

Das mal als Anregungen. Wenn das so nicht reicht, melde dich wieder.

fg

Dirk_P

Hallo @Dirk_Pegasus,

vielen Dank für Deinen Vorschlag. Ich schaue mir das morgen einmal an, ob ich das umsetzen kann. Ansonsten würde ich mich nochmal melden.

LG Martina

Hallo @Dirk_Pegasus,

ich habe mir das Ganze einmal angeschaut. Das mit dem Autofilter läuft ganz gut, aber wie bekomme ich nun den Inhalt des Textfeldes in die vorgesehene Spalte? Ich habe aus den Eingaben der beiden Textfelder eine Variable erstellt. Nun muss ich nur noch die Spaltenüberschriften danach durchsuchen und dann in die gefilterte Zeile die Werte einschreiben. Kannst Du mir da auch noch weiterhelfen. Ich wäre Dir sehr dankbar dafür.

VG Martina

Freut mich, dass es hilft.

Zu deiner Frage. Zunächst würde ich noch prüfen, ob der Filter genau eine Zeile ergeben hat. Möglicherweise gibt es in der Tabelle ja „Fehler“. Schau dir mal den Code an:

Sub test()

Dim c, z As Range
Dim i, j, zielSpalte As Integer

i = 0
j = 0
zielSpalte = 2 'das natürlich anpassen

'der Range beginnt unter dem Header. B500 "großzügig" anpassen, wenn unter der tabelle alles leer ist
Set c = ActiveSheet.Range("B2:B500").SpecialCells(xlCellTypeVisible)

For Each z In c
    If z.Value <> "" Then
        i = i + 1
        If j = 0 Then j = z.Row
    End If
Next z

If i > 1 Or i = 0 Then
    MsgBox "Anzahl Fundstellen ist unzulässig: " & i
    GoTo abbruch
Else
    ActiveSheet.Cells(j, zielSpalte) = 11
End If

abbruch:

End Sub

ggfs. noch mal nachfragen.

fg

Dirk_P

Hallo @Dirk_Pegasus,

vielen Dank für die Antwort. Sorry, dass ich mich jetzt erst melde, aber ich hatte die letzten Tage keine Zeit.
Ich schaue mir das Ganze heute ausführlich an, und würde mich ggf. noch einmal melden.

Vielen Dank nochmal.

VG Martina

Hallo @Dirk_Pegasus,

ich habe mir Dein Makro angeschaut, kann es aber leider nicht so recht auf meine Anforderung umsetzten. Ich habe ja zwei Textfelder, deren Inhalt ich in eine Variable ablege. Nun muss ich die Tabelle nach dem Wert aus dem einen Textfeld, mache ich mit dem Autofilter, und nach dem Inhalt der Variablen durchsuchen und wenn in Spalte B der Wert aus dem ersten Textfeld, also mit Autofilter schon gefiltert, und in Zeile 3 der Inhalt der Variablen steht, dann soll der Wert aus dem 4. Textfeld in die Zeile darunter geschrieben. Ich hoffe, ich habe mich verständlich ausgedrückt und Du kannst mir helfen. Hatte ja auch schon eine Beispieldatei hochgeladen.

VG Martina

Ich habe da mal was geändert und großzügig kommentiert. Schau mal ob das hilft.

Sub test(ws As Worksheet, textZumEintragen As String, zielSpalte as integer)
'bekommt jetzt als Parameter das Worksheet, in dem gefiltert wurde und wo zu schreiben ist
'den Text der geschrieben werden soll
'Die Spalte, in der dann der Wert eingetragen werden soll

Dim c, z As Range
Dim i, j As Integer

i = 0
j = 0

Set c = ws.Range(„B2:B500“).SpecialCells(xlCellTypeVisible)
'B2:B500 ist ein Bereich, in dem nach sichtbaren Zeilen gesucht werden soll
'B ist eine Spalte der gefilterten Liste die einen Wert hat, wenn dort geschrieben werden darf
'Stell die vor, auf WS wurde gefiltert dann enthält c alle Zellen der Spalte B die sichtbar sind
'(quasi eine Liste)

For Each z In c
'schaue in jede Zelle die es in c gibt, also die sichtbaren Zellen nach dem Filter

If z.Value <> "" Then
    'Hat die Zelle einen Wert (Spalte B auf die gefiltert wurde sollte immer gefüllt sein!)

    i = i + 1
    'Zählen, wie viele gefüllte Zeilen es gibt

    If j = 0 Then j = z.Row
    'Zeile Merken, in der zuerst Wert gefunden wurde

End If

Next z

If i > 1 Or i = 0 Then
'prüfen ob genau eine Zeile gefunden wurde

MsgBox "Anzahl Fundstellen ist unzulässig: " & i
GoTo abbruch

Else
ActiveSheet.Cells(j, zielSpalte) = textZumEintragen
'Wert in der Zelle eintragen

End If

abbruch:
'Sprungmarke, falls um Sub zu beenden falls nicht genau eine Zeile gefunden wurde

End Sub

Und sein mir nicht böse. Ich öffnen keine Dateien die VBA enthalten können. Und das geschützt zu öffnen, zu prüfen und dann zu entscheiden ist mir zu anstrengend.

Falls weitere Fragen da sind, helfe ich aber gerne weiter!

fg

Dirk

Hallo @Dirk_Pegasus,

erstmal vielen Dank für die schnelle Antwort. Ich habe leider mal wieder noch keine Zeit, das Makro zu testen, aber sowie ich vor den PC komme, werde ich Deinen Vorschlag testen und Feedback geben.

Vielen Dank schon einmal für deine Hilfe.

Frohe Pfingsten wünsche ich.

VG Martina

Hallo @Dirk_Pegasus,

so, ich habe mir nun einmal das Makro angeschaut und auf meine Bedingungen zugeschrieben. Es klappt alles soweit super, außer das er mir, wenn er den Text aus dem einen Textfeld in die gefundene Zelle schreiben soll, immer die Fehlermeldung Typenunverträglichkeit gibt. Ich habe schon mit value und auch ohne jeweils bei der gefunden Zelle sowie bei dem Eintrag versucht, aber es klappt nicht. Nun bin ich mit meinem Latein am Ende. Vielleicht kannst Du mir ja noch einmal helfen. Das wäre super.

So sieht das Makro jetzt aus:

Ich danke Dir schon einmal rechtherzlich.

VG Martina

Erstmal meckern: Definiere Variablen „Nie“ als Variant. VBA ist da sehr gutmütig, das bringt aber oft Probleme.

Du schreibst in die Zelle den Inhalt von „Soll“. Ist das Text? Ich vermute das soll eine Zahl werden.

Weiter oben benutzt du cdbl(). Der funktion musst du eine Zahl übergeben. Das solltest du prüfen:
Sub test()
Dim k As Double
Dim s As String

s = "1233,99"
k = CDbl(s)

If IsNumeric(s) Then
    MsgBox (s * 1)
Else
    MsgBox ("Mist")
End If

s = "1233,99kk"
k = CDbl(s)

If IsNumeric(s) Then
    MsgBox (s * 1)
Else
    MsgBox ("Mist")
End If

End Sub

Lass die sub mal laufen. Kannst du eigentlich debuggen? Damit könntest du leicht herausfinden wo das Problem ist.

Und zum Testen: Schreib mal unmittelbar bevor du die Zelle füllst:

Soll = 1

fg

Dirk_P

Hallo @Dirk_Pegasus,

ich habe jetzt die Variable für die Eingabe Werte auf string geändert. Bei den Eingaben handelt es sich immer um Text, da die Werte aus mehreren Textfeldern einer Userform kommen. Also auch der Wert Soll ist ein Text und ich möchte ihn bei der Einschreibung in die Zelle in eine Zahl umwandeln, da ich mit diesem Wert noch weiter rechnen möchte.
Ja, ich kann debuggen, beim Debuggen gibt er mir bei der Zeile:
ws.cells(j,rngzelle).Value = Soll den Laufzeitfehler 13: Typen Unverträglichkeit.
Die Eingabe Soll = 1 ergibt den gleichen Fehler.
Ich weiß nicht, wie ich diesen Fehler wegbekomme, habe schon alles versucht.

VG Martina

Ha, der Fehler ist auf der anderen Seite.

rngzelle vom Typ Range. Erwartet wird eine Spaltennummer, also integer. Hier musst du die Spalte einsetzten, in die das Ergebnis soll. Also so etwas:

dim spalte as integer
spalte=12
ws.cells(j,spalte).Value = Soll

Hoffe das passt dann. Sonst frag weiter oder poste auch mal den Code. Ist im Bild schlecht zu lesen.

fg

Dirk_P

Hallo @Dirk_Pegasus,

vielen Dank für Deine Antwort. Ich habe mein Problem jetzt gelöst. Ich habe einfach die Schleife für die Zeile noch einmal für die Spalte eingebaut. Somit wird jetzt bei der Zeile
ws.cells(j,spalte).Value = Soll eine Spaltennummer übergeben und das Makro funktioniert.

Vielen Dank noch einmal für Deine Hilfe und Deine endlose Geduld.

VG und ein schönes Wochenende
Martina

Herzlichen Glückwunsch!

Übrigens: Ich finde es besser lange zu helfen und der , dem man hilft, ist weiter. In seinem Problem und in seinem Wissen.

Dirk_P