Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1920to1924
Aktuelles Verzeichnis
Verzeichnis Index
Übersicht Verzeichnisse
Vorheriger Thread
Rückwärts Blättern
Nächster Thread
Vorwärts blättern
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
VBA wenn bestimmter Text dann Wert schre
14.02.2023 13:15:10
Thomas
Hallo,
ich habe bereits einen VBA Code im Tabellenblatt und benötige jetzt noch Folgendes:
Wenn in Q28:Q301 "Rücklagen!" steht, soll in die gleiche Zeile in Spalte I28:I301 "vollständig erhalten im" geschrieben werden, ansonsten soll nichts geschehen.
Kann mir damit bitte jemand helfen?
Meine ganzen Versuche sind wirr zusammenkopiert aus dem Netz und leider völlig ergebnislos.
Bisher ist dort bereits vorhanden, hat aber nichts damit zu tun:
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("I28:I301")) Is Nothing Then
        Range("B28:BA301").Sort _
            Key1:=Range("B28"), Order1:=xlAscending, _
            Key2:=Range("AR28"), Order2:=xlAscending, _
            Key3:=Range("F28"), Order2:=xlAscending, _
            Header:=xlGuess, _
            OrderCustom:=1, MatchCase:=False, _
            Orientation:=xlTopToBottom _
    End If
End Sub

Vielen Dank!
Thomas

15
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA wenn bestimmter Text dann Wert schre
14.02.2023 14:21:16
Yal
Hallo Thomas,
ich verstehe nicht ganz genau: es gibt einen festen Bereich Q28:Q301, wenn in eine der Zelle dieses Bereiches ein bestimmte Wert (oder ein bestimmte Text?) steht, soll in eine andere Spalte (selbe Zeile) ein Wert fest reingeschrieben werden (also kein Formel). Richtig?
Zweite Frage, aber nebensächlich: was hast das mit Sortierung zu tun?
Der Algo lautet
Für jede Zelle Z in Q18:A301
    Wenn Wert von Z = ... Dann
        in Zelle(Zeile von Z, Spalte "I"), Wert ... schreiben
    Ende Wenn
Nächste Z
In VBA sieht es sehr ähnlich aus, muss aber bestimmte reservierte Wörter verwenden:
Sub reinschreiben()
Dim Z As Range
    For Each Z In Range("Q18:Q301")
        If Z.Value = "Rücklagen!" Then
            Cells(Z.Row, "I") = "vollständig erhalten im"
        End If
    Next Z
End Sub
VG
Yal
Anzeige
AW: VBA wenn bestimmter Text dann Wert schre
14.02.2023 14:37:38
Thomas
Hallo Yal,
danke, dass Du Dir die Zeit genommen hast!
Die Sortierung hatte ich nur erwähnt, weil keine Beispieldatei dabei war, falls es wichtig sein würde.
Eine Formel ging nicht, weil in das Feld bereits belegt war mit einer anderen Formel. Du hattest also alles richtig verstanden!
Dein Code funktioniert fantastisch - vielen Dank! Ich habe anderthalb Tage rumprobiert, über viele Stunden.
Deshalb danke auch für Deine Erklärung, ich habe sie mir mit in den Code geschrieben, falls ich mal wieder auf dem Schlauch stehe.
VBA ist im Alltag etwas schwer zu greifen für mich ;)
Hab einen schönen Tag!
Thomas
Anzeige
Vielen Dank für die Rückmeldung
14.02.2023 15:04:41
Yal
Hallo Thomas,
VBA ist nicht schwierig, wenn man kleine Schritte macht. Wenn man versucht, über den Berg zu springen, dann ja, es ist "schwierig".
Und Du siehst: VBA ist kaum anderes als was, was man auf Deutsch sagen würde. Meistens gibt dir der Makrorekorder den notwendigen "Vokabular".
Das Objektmodell, also das eine "Zelle" entweder ein Range oder Teil eines Ranges, ein Range nur als Unterobjekt von einem Blatt ("Worksheet") exisitiert, die wiederum nur Unterobjekt von Workbook, kommt nach und nach.
VG
Yal
AW: Vielen Dank für die Rückmeldung
14.02.2023 17:00:54
Thomas
Entschuldige bitte, also jetzt habe ich doch noch eine Frage, weil es doch nicht ganz so klappt wie gewünscht :/
Ich muss die Abfrage offenbar immer im Code Fenster erst anstossen.
Ich würde es natürlich bei jeder Änderung in Q28:Q301 von "irgendeinem anderen Wert" zu "Rücklagen" automatisch ausgelöst haben wollen.
Sobald ich auf "Userform / Sub ausführen" klicke, macht er es, ansonsten aber nicht.
Und irgendwie rechnet er auch sehr lange dafür - hat das doch mit der Sortierung zu tun?
Hier nochmal mein kompletter Code, wie er jetzt drin steht.
Ich hoffe, es gelingt noch ohne Beispieldatei, das würde mich halb irre machen, die zum posten zusammenzustauchen oO
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
 'Rows(Target.Row).Select
 ActiveCell.EntireRow.Select
 End Sub
 
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Application.Intersect(Target, Range("I28:I301")) Is Nothing Then
        Range("B28:BB301").Sort _
            Key1:=Range("B28"), Order1:=xlAscending, _
            Key2:=Range("AS28"), Order2:=xlAscending, _
            Key3:=Range("F28"), Order2:=xlAscending, _
            Header:=xlGuess, _
            OrderCustom:=1, MatchCase:=False, _
            Orientation:=xlTopToBottom _
    End If
End Sub
'  Für jede Zelle Z in Q28:Q301
'    Wenn Wert von Z = ... Dann
'        in Zelle(Zeile von Z, Spalte "I"), Wert ... schreiben
'    Ende Wenn
'  Nächste Z
Sub Provision_vollständig()
Dim Z As Range
    For Each Z In Range("Q28:Q301")
        If Z.Value = "Rücklagen noch überweisen!" Then
            Cells(Z.Row, "I") = "Provision vollständig erhalten im"
        End If
    Next Z
End Sub
Die Formel die in Q28.Q301 steht (und weshalb ich dort keine weitere Formel unterbringen kann und es per VBA lösen muss) lautet:
=WENN(N28="eintragen!";"";WENN(P28="";"";WENN(UND(O28-P28=0;I28>"Abgaben / Rücklagen umbgebucht"); HYPERLINK("#AY"&ZEILE();"Rücklagen noch überweisen!");O28-P28))) 
Am Hyperlink scheint es nicht zu liegen, ich habe "Rücklagen noch überweisen" bereits händisch eingegeben, wollte es aber nur ergänzend sagen.
Danke nochmal für Deine Zeit und Deine Geduld!
Thomas
Anzeige
AW: Vielen Dank für die Rückmeldung
14.02.2023 18:29:46
Yal
Hallo Thomas,
Du musst das Ereignis _Change erweitern, und zwar vor der Sortierung:
Const cDatenBereich = "Q28:Q301"
Sub Provision_vollständig()
Dim Z As Range
    For Each Z In Range(cDatenBereich)
        If Z.Value = "Rücklagen noch überweisen!" Then Cells(Z.Row, "I") = "Provision vollständig erhalten im"
    Next Z
End Sub
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    ActiveCell.EntireRow.Select
End Sub
 
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Z As Range
    
    If Not Intersect(Target, Range(cDatenBereich)) Is Nothing Then
        For Each Z In Intersect(Target, Range(cDatenBereich))
            If Z.Value = "Rücklagen noch überweisen!" Then Cells(Z.Row, "I") = "Provision vollständig erhalten im"
        Next
        Range("B28:BB301").Sort _
            Key1:=Range("B28"), Order1:=xlAscending, _
            Key2:=Range("AS28"), Order2:=xlAscending, _
            Key3:=Range("F28"), Order2:=xlAscending, _
            Header:=xlGuess, OrderCustom:=1, _
            MatchCase:=False, Orientation:=xlTopToBottom
    End If
End Sub
VG
Yal
Anzeige
Nun doch mit Datei
14.02.2023 19:41:17
Thomas
Also liebe(r) Yal,
jetzt geht leider zusätzlich die Sortierung nicht mehr :)
Ich habe nun die Datei zusammengeschreddert und mit angehangen, weil es für Dich ja so viel leichter ist, danke, dass Du es so aus der Luft versucht hattest.
Ich habe so gut es geht selber getestet, dass noch alles wichtige funktioniert.
Wenn Du in U 30 mal einen Monat eingibst, wird in Q 30 Rücklagen noch überwiesen eingeblendet (als Hyperlink).
Entsprechend sollte in I 30 Provision vollständig erhalten erscheinen und dann sortiert werden (ebenfalls nach Auswahl in I)
Im Moment ist der vorherige Code drin, weil da die Sortierung noch ging, das macht es vielleicht einfacher.
Es wäre schön, wenn Du Dir das nochmal angucken würdest!
Vielen, vielen Dank
Thomas
https://www.herber.de/bbs/user/157835.xlsm
Anzeige
AW: Nun doch mit Datei
15.02.2023 09:29:13
Yal
Hallo Thomas,
die Sortierung funktioniert schon, sortiert aber nur auf Basis der Spalte B, AS und F. Eine Änderung in der Spalte Q, die dann zu einer Änderung in der Spalte I führt, hat keine Auswirkung auf die Spalten B, AS und F. Somit wird nichts umsortiert. Es ist keine VBA-Problem, sondern reine Analyse der Situation.
Die automatische Sortierung war schon vorher auf Änderung in Spalte I eingerichtet. Ich habe es in dieser Version geändert.
Vielleicht wäre eine Trennung von "Ereignis abfangen" und "Aktion durchführen" gut.
Const cDatenBereich = "Q28:Q301"
'-----------------------------------------------
' für den User sichtbare und abrufbare Prozeduren
Public Sub Provision_vollständig()
    Bereich_sortieren
End Sub
'-----------------------------------------------
' Ereignis-Prozeduren
Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    ActiveCell.EntireRow.Select
End Sub
 
Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range(cDatenBereich)) Is Nothing Then SpalteI_behandeln
    Bereich_sortieren
End Sub
'-----------------------------------------------
' für den User nicht sichtbare Aktionen
Private Sub SpalteI_behandeln()
Dim Z As Range
    Application.EnableEvents = False
    For Each Z In Range(cDatenBereich)
        If Z.Value = "Rücklagen noch überweisen!" Then Cells(Z.Row, "I") = "Provision vollständig erhalten im"
    Next Z
    Application.EnableEvents = True
End Sub
Private Sub Bereich_sortieren()
    Application.EnableEvents = False
    Range("B28:BB301").Sort _
        Key1:=Range("B28"), Order1:=xlAscending, _
        Key2:=Range("AS28"), Order2:=xlAscending, _
        Key3:=Range("F28"), Order2:=xlAscending, _
        Header:=xlGuess, OrderCustom:=1, _
        MatchCase:=False, Orientation:=xlTopToBottom
    Application.EnableEvents = True
End Sub
VG
Yal
Anzeige
AW: Nun doch mit Datei
15.02.2023 12:49:43
Thomas
Hallo Yal,
danke, dass Du weiter hilfst!
Also in meiner Datei schreibt er ja in Q "Rücklagen noch überweisen!", wenn O=P ist rein.
Zum testen kan man da jeweils einfach je eine 1 reinschreiben. Dann springt Q auf "Rücklagen noch überweisen!" - aber Spalte I wird nicht verändert in "Provisionseingang vollständig erhalten".
Stellt man in I manuell auf "Provisionseingang vollständig erhalten" um, sortiert er auch, habe ich festgestellt.
Es hackelt also irgendwie mit der Erkennung, wenn in Q "Rücklagen noch überweisen!" durch die Formel aufgetaucht ist. Manchmal, wenn ich das dort manuell eintrage, springt es aber plötzlich auch in I auf den gewünschten Wert oO
Hat es vielleicht etwas mit der Formel in Q zu tun?
Thomas
Anzeige
AW: Nun doch mit Datei
15.02.2023 15:10:48
Yal
Hallo Thomas,
es nutzt nicht viel, wenn ich für jede Komma, die nicht passt, einspringen muss.
Wenn Du nicht verstehst, was im folgendem passiert,
Const cDatenBereich = "Q28:Q301"
    For Each Z In Range(cDatenBereich)
        If Z.Value = "Rücklagen noch überweisen!" Then Cells(Z.Row, "I") = "Provision vollständig erhalten im"
    Next Z
dann ist es kaum möglich, dich allein mit VBA werkeln zu lassen.
Es liegt an dich, sich damit ausseinander zu setzen und zu schauen, wie Du am schnellsten ein solides Basiswissen eineignen kannst.
Viel Erfolg
VG
Yal
Anzeige
AW: Nun doch mit Datei
15.02.2023 15:32:25
Thomas
Hallo Yal,
Nun da steht, dass im festgelegten Bereich Q28:Q301 für jede Zeile, in der "Rücklagen noch überweisen!" steht in Spalte I dieser Zeile "Provision vollständig erhalten im" eingetragen werden soll.
Dieser Vorgang wird aber aus meiner -entschuldige- laienhaften Sicht nicht ausgeführt.
Warum verstehe ich tatsächlich nicht, denn es klingt logisch und so, dass es klappen sollte. Deshalb frage ich Dich ja. Denn auch aus Deinen vorherigen Antworten kann ich leider nicht schließen woran es liegt. Denn selbst wenn ich das Sortieren aus den Code rauslösche geht es nicht.
Und leider, nein, weiß ich nicht woran es liegt. Wie gesagt, deshalb bitte ich ja um Hilfe.
Nach Rechtschreibfehlern habe ich selbst alles abgesucht, ich habe versucht den Hyperlink einzusetzen, ob es an ihm liegt. Aber meine Mittel sind nun mal übersichtlich.
Könntest D bitte nochmal formulieren, wo er Fehler womöglich liegt? Er sortiert ja erst nach dem Einsetzen in die Zelle, was aber gar nicht erst geschieht.
VG
Thomas
Anzeige
AW: Nun doch mit Datei
15.02.2023 16:21:40
Yal
Hallo Thomas,
in dem von Dir gelieferte Beispieldatei funktioniert es. Aber eine solche Aussage hilft dir genauso viel, wie deine "funktioniert nicht" mir hilft. Siehst Du es auch so?
Es kann an der Rechtschreibung, Gross-/Kleinschreibung beachten, an doppelte Leerzeichen oder Leerzeichen am Ende, an dem Ausrufezeichen liegen.
Da in deiner geposteten Datei nicht die letzte (davor) gelieferte Version des Codings vorlag, könnte an andere Stellen das Problem sein.
Am besten benutzst Du folgende Code
Sub Provision_vollständig()
Dim Z As Range
    Application.EnableEvents = False
    For Each Z In Range("Q28:Q301")
        If Z.Value > "" Then Debug.Print Z.Address, Z.Value = "Rücklagen noch überweisen!", Z.Value
    Next Z
    Application.EnableEvents = True
End Sub
und schaust in dem Direktfenster (VB-Editor, Ansicht, Direktfenster), was dabei rauskommt (ausgegeben durch Debug.Print)
Das Thema "Debugging" wird nicht getrennt von dem Lernen zu programmieren, sondern ist vollständiger Bestandteil davon: Du lernst zu programmieren, in dem Du lernst zu prüfen, was aus deinem Programm rauskommt. Um Dir bei der Fehlersuche zu unterstützen, muss ich Dir das Programmieren beibringen. Und genau das sehe ich nicht als meine Aufgabe. Wenn Du noch nicht soweit bist, mit einem Code zurecht zu kommen, dann musst Du dir mit einfacheren Codierung, die Du vollständig beherrschst, begnügen. Es tut mir Leid, ist aber Erfahrungswert. Das Problem liegt nicht an einer mangelnden Hilfsbereitschaft meinerseits.
VG
Yal
AW: Nun doch mit Datei
15.02.2023 17:03:06
Thomas
Hallo Yal,
ehrlich gesagt nein, auch in meiner Beispieldatei funktioniert es nicht.
Nur als ich neulich mal händisch drin rumgefummelt hatte und die Rücklagen manuell eingefügt hatte klappte es plötzlich irgendwie für einen Moment.
Danke erstmal für die Sache mit dem Direktfenster.
Es zeigt korrekt in beiden Dateien, Beispiel und echt, alle eingetragenen Rücklagen an in den Zellen an und ergänzt diese auch, wenn eine dazukommt.
Als Beispiel:
$Q$28         Wahr          Rücklagen noch überweisen!
$Q$29         Wahr          Rücklagen noch überweisen!
$Q$30         Wahr          Rücklagen noch überweisen!
$Q$31         Falsch         0,02 
$Q$32         Falsch         0,02 
$Q$33         Falsch         0,02 
Du kannst davon ausgehen, dass ich mich stets um Verständnis und dazu lernen bemühe. Ich bin sicherlich nicht der, der nur nach Lösungen fragt.
Ich wende mich auch erst hierher, wenn ich tagelang kein Ergebnis produzieren konnte.
Aber leider, selbst Dein erster Code in der Beispieldatei funktioniert nicht, auch der letzte und vorletzte nicht, er schreibt einfach nichts in I rein.
Ein Schreiben des Provisionseiganges bleibt bei allen, in der Beispieldatei, wie auch in der echten.
Es kommt also quasi nie zum Schreiben in Spalte I.
Da es bei Dir offenbar klappt:
- kann es an Einstellungen bei mir liegen? Andere VBA Scripts funktionieren ja aber.
- Ist der Code vielleicht nicht für Excel 2019 geeignet?
Tut mir leid, dass es so hackelig ist.
VG
Thomas
AW: Nun doch mit Datei
15.02.2023 17:37:04
peterk
Hallo
Application.EnableEvents ist ein mächtiger Befehl. Wenn die Events ausgeschaltet werden bleibt dies solange bis EXCEL neu gestartet wird (nur die Datei schliessen und wieder öffnen bringt nichts, wenn noch ein andere Excel Datei offen ist). Wenn, wie Du schreibst, nichts passiert deutet das sehr stark darauf hin, dass die Events nicht behandelt werden.
Peter
AW: Nun doch mit Datei
15.02.2023 17:52:49
Yal
Hallo Peter,
jein. Wenn Du einen Wert in einer Zelle fest reinschreibt, dann kommt diese Wert in dieser Zelle auf alle Fälle rein.
Was EnableEvents = False blockiert, ist dass ein andere Ereignis, wie z.B. Worksheet_Change ausgelöst wird. In dem Fall ist es notwendig, weil bei jeder Zeile, wo die besagte Zeichenkette in Q gefunden wird, wird in I geschrieben und daruch eine Sortierung angestossen. Das kostet nicht nur immense Rechenzeit, im schlimmste Fall, eine endlose Schleife.
@Thomas: Aber gerade fehlt mir ein: ich habe vorher nur eine kurze Analyse der Anwendung gemacht, aber wenn tatsächlich die Änderung, die in Spalte I reinkommen eine Auswirkung auf eine Zelle in eine der Sortierungsschlüssel (B, AS, BB) hat, dann ist es sinnlos zu befehlen: mache von Zeile 28 bis 301, weil bei Änderung in Zeile 40 sind möglicherweise jetzt 12 Zeilen zwischen 28 und 40, die vorher nach 40 waren, und nciht behandelt werden (übertrieben, aber es geht um die idee).
Also achte drauf, dass die Änderung in Spalte I genau zwischen
Application.EnableEvents = False
Und
Application.EnableEvents = True
Und dass keine Sortierung dazwischen gemacht wird.
VG
Yal
AW: Nun doch mit Datei
15.02.2023 17:41:59
Yal
Ach Thomas *Ohren langziehen*,
Gerade schaue ich zum erste mal ein bischen mehr als nur die Frage, die Du gestellt hast und schaue, wie deine Datei sich verhält, wenn etwas geändert wird.
In der Zeile I gibt es eine Datenüberprüfung mit einer festgegebenen Liste an Einträge. Wenn man ein von diesen Einträge ändert, dann ändert sich die Spalte Q. Somit hat man ein Zirkelbezug (zumindest an einer Stelle). Es wird von Excel nicht beanstandet, weil ein Teil davon über Formel und Teil über VBA gesetzt wird.
Aus alle Fälle, wenn in Spalte I ein "Provision vollständig erhalten im" reinkommt, dann verschwindet den "Rücklagen noch überweisen!" in Spalte Q.
Die gesamte Anwendung ist eine zusammengebasteltes, wo nicht mal derjenige, der es gebaut hat (Du, nehme ich an), noch den Durchblick hat.
Ich glaube nicht, dass aus der Bruchbude eine neue Farbanstrich ein Luxuspalast machen wird. Du musst zuerst kräfig ausmisten, vielleicht sogar alles neu aufbauen. Googel nach Zustandsautomat und nach Bewegungsdaten (Model View Controller wäre auch gut: Datenerfassung und Datenauswertung auf alle Fälle voneinander trennen).
Es wird Zeit, deine Anwendung auf stabilere Basis zu bringen. Erst dann kann das Gebilde VBA vertragen.
Ich bin raus.
VG
Yal

347 Forumthreads zu ähnlichen Themen

Anzeige
Anzeige
Anzeige

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige