Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1908to1912
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
Inhaltsverzeichnis

VBA - Texte nicht berücksichtigen

VBA - Texte nicht berücksichtigen
29.11.2022 08:28:17
Christian
Hallo,
ich wäre euch sehr dankbar, wenn ihr mir helft, das Makro in der folgenden Datei abzuändern, welches den Filmtitel und die in dem Film genannten Schauspieler auflistet:
https://www.herber.de/bbs/user/156445.xlsm
Bevor ich hier viele Worte verliere, wie das Makro funktioniert und diese nur in die Irre führen, kopiert einfach den Inhalt der Spalte R in die Spalte B, dann startet das Makro automatisch und ihr seht das Ergebnis.
Aber jetzt zu meiner Bitte, ist es möglich dass das Makro die Texte die ich mit roter Farbe versehen habe überspringt, mit der Begründung, dass jeweils der Text 2 Zeilen drunter (gelbe Farbe) das Wort Double enthält?
Das andere was das Makro macht wie die zusätzliche Zeile einfügen oder die Möglichkeit bietet, dass ich den Text überall in Spalte B einfügen kann soll so bleiben.
Danke für eure Hilfe
Christian

10
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: VBA - Texte nicht berücksichtigen
29.11.2022 15:04:43
ChrisL
Hi Christian
Das Fehlerhandling gefällt mir, der Rest nicht so :)
Den Index-Zähler während einer laufenden For-Next Schleife zu ändern, sollte wenn möglich vermieden werden. Es macht die Angelegenheit unübersichtlich und schwer nachzuvollziehen. Andererseits: "never change a running system". Ich habe den Code im Grundsatz beibehalten.
Beachte die Zeilen:

If InStr(Target.Cells(i).Offset(2), "double") = 0 Then
End If

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Fehler
Const APPNAME = "Worksheet_Change"
Dim RNG As Range, TMP As String, MMAx As Integer
Dim Z0 As Integer, Z1 As Integer, Sp As Integer, i As Long
'Nur Spalte B berücksichtigen
Set RNG = Intersect(Columns(2), Target)
Z0 = 3 'Erster Durchlauf aus 3. Wert
Z1 = 2 'StartZeile im Bereich
MMAx = 132
If Target.Column = 2 And Target.Columns.Count = 1 And Target.Rows.Count > 1 Then
If WorksheetFunction.CountBlank(RNG) = RNG.Count Then Exit Sub ' falls nur Leerzellen
Application.ScreenUpdating = False
Application.EnableEvents = False
For i = Z0 To RNG.Count Step 4
TMP = Target.Cells(i) 'der aktuelle Text
If InStr(Target.Cells(i).Offset(2), "double") = 0 Then
If i = Z0 Then i = Z0 - 5 ' von 2 auf 3 ändern
'Zählen, ob Text schon im Zielbereich vorhanden idt
If WorksheetFunction.CountIf(Target.Cells(1).Resize(1, Sp + 1), TMP) = 0 Then
'wenn neu, dann anfügen
Target.Cells(1).Offset(0, Sp) = TMP
Sp = Sp + 1
End If
End If
Next
'Einfügebereich löschen, außer erste Zelle
RNG.Offset(1, 0).Resize(RNG.Count - 1).ClearContents
'Leerzeile
If RNG.Count > MMAx Then
Rows(Target.Row + 1).Insert
End If
Application.EnableEvents = True
End If
'*** Fehlerbehandlung
Err.Clear
Fehler:
Application.EnableEvents = True
If Err.Number  0 Then MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf _
& "Fehlernummer: " & Err.Number & vbLf & Err.Description: Err.Clear
End Sub
cu
Chris
Anzeige
AW: VBA - Texte nicht berücksichtigen
29.11.2022 15:43:25
Chris
Hallo Chris,
erst mal vielen Dank, funktioniert.
Jetzt hast du natürlich das Interesse in mir geweckt, wie man das ganze optimaler lösen könnte, wenn du schon sagst, dass die Änderung in der Schleife vermieden werden soll. Wenn du die Zeit hast, würde es mich freuen wenn wir das zusammen mal versuchen könnten zu ändern.
Wir haben ja nichts zu verlieren, wir haben ja ein funktionierendes Makro.
Gruß
Christian
AW: VBA - Texte nicht berücksichtigen
29.11.2022 15:58:50
ChrisL
Hi
Ja jetzt habe ich mich aus dem Fenster gelehnt :)
Irgendwie komme ich gar nicht richtig hinter das Geheimnis der Index-Korrektur.

Z0 = 3
For i = Z0 To ... Step 4
If i = Z0 Then i = Z0 - 5 ' von 2 auf 3 ändern
Damit wäre immer im ersten Durchgang i = Z0 und wird dann auf -2 (=3 minus 5) korrigiert.
Macht irgendwie keinen Sinn und trotzdem funktioniert es. Evtl. kannst du mir auf die Sprünge helfen.
cu
Chris
Anzeige
AW: VBA - Texte nicht berücksichtigen
29.11.2022 16:31:30
Chris
Hallo Chris,
ich muss da glaub was gestehen, das ursprüngliche Makro hatte genau den umgekehrten Zweck, damals ging es nicht darum einen Titel und die dazugehörigen Schauspieler aufzulisten, sondern den Schauspieler aufzulisten mit den dazugehörigen Filmen (entsprechend waren die Texte dann auch andere). Ich habe einfach solang auf gut Glück mit i und z0 rumgespielt bis es gepasst hat.
Gruß
Christian
AW: VBA - Texte nicht berücksichtigen
30.11.2022 10:11:12
ChrisL
Hi Christian
Herausforderung angenommen ;)
Der ganze Bereich wird in ein Array/Datenfeld ("virtuelle Tabelle") gelesen und ohne Interaktion mit dem Tabellenblatt transformiert. Erst ganz zum Schluss wird das Ausgabe-Array zurück in die Tabelle geschrieben.
Generell sind Array-Lösungen schnell/performant, weil alles im "Speicher" stattfindet. Das mehrfache Lesen und Schreiben von Tabellen erfordert etwas mehr Zeit.
Das Konzept von Array ist nicht ganz leicht zu verstehen. Hierzu müsstest du dich mit entsprechenden Tutorials mal einarbeiten. Letztlich ist ein Array eine Variable, welche mehr als nur ein Wert aufnimmt.

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Fehler
Const APPNAME = "Worksheet_Change"
Dim RNG As Range, i As Integer, j As Integer
Dim arBereich() As Variant
ReDim arAusgabe(0) As Variant
If Target.Column = 2 And Target.Columns.Count = 1 And Target.Rows.Count > 1 Then
Set RNG = Intersect(Columns(2), Target)
If WorksheetFunction.CountBlank(RNG) = RNG.Count Then Exit Sub
' Bereich an Array übergeben
arBereich() = Application.Transpose(RNG.Value)
For i = LBound(arBereich) To UBound(arBereich) Step 4
If InStr(arBereich(i + 3), "double") = 0 Then
' Filmtitel aufnehmen
arAusgabe(0) = arBereich(i + 2)
' Prüfung Duplikate
For j = LBound(arAusgabe) To UBound(arAusgabe)
If arAusgabe(j) = arBereich(i + 1) Then Exit For
Next j
' Person aufnehmen, wenn kein Duplikate
If j > UBound(arAusgabe) Then
ReDim Preserve arAusgabe(UBound(arAusgabe) + 1)
arAusgabe(UBound(arAusgabe)) = arBereich(i + 1)
End If
End If
Next i
' Array zurück in Tabelle schreiben
If UBound(arAusgabe) > 0 Then
Application.EnableEvents = False
RNG.ClearContents
Range("B1").Resize(1, UBound(arAusgabe) + 1) = arAusgabe
Application.EnableEvents = True
End If
End If
Exit Sub
Fehler:
Application.EnableEvents = True
MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf & "Fehlernummer: " & Err.Number & vbLf & Err.Description: Err.Clear
End Sub
cu
Chris
Anzeige
AW: VBA - Texte nicht berücksichtigen
30.11.2022 10:54:20
Christian
Hallo Chris,
danke für deine Mühe, aber ich fürchte du hast 2 Dinge übersehen.
Ich hatte im Eingangspost geschrieben: Das andere was das Makro macht wie die zusätzliche Zeile einfügen oder die Möglichkeit bietet, dass ich den Text überall in Spalte B einfügen kann soll so bleiben.
Zum einen funktioniert dein Makro leider nur wenn ich die Texte in B1 einfüge, wenn ich sie woanders in Spalte B einfüge, bleibt der Bereich wo etwas ausgegeben soll leer.
Das mit der zusätzlichen Zeile, die eingefügt wird sobald ich mehr als 132 Texte eingefügt habe konnte ich jetzt nicht testen, weil ich grad keine passenden Texte dafür zur Verfügung habe, aber soweit ich das Makro zumindest verstehe, sehe ich da nichts von. Sorry falls ich mich da ungetestet irre.
Gruß
Christian
Anzeige
Nachtrag zum besseren Verständnis
30.11.2022 11:00:18
Christian
die Texte sollen in der ersten Zeile des Bereichs eingefügt werden, wo ich sie hinkopiert habe, nicht immer in Zeile 1
und die zusätzliche Zeile soll direkt unterhalb der Ausgabezeile eingefügt werden.
War beides im alten Makro schon so.
AW: Nachtrag zum besseren Verständnis
30.11.2022 13:49:52
ChrisL
Hi
So...

Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Fehler
Const APPNAME As String = "Worksheet_Change"
Const MMax As Integer = 132
Dim RNG As Range, i As Integer, j As Integer
Dim arBereich() As Variant
ReDim arAusgabe(0) As Variant
If Target.Column = 2 And Target.Columns.Count = 1 And Target.Rows.Count > 1 Then
Set RNG = Intersect(Columns(2), Target)
If WorksheetFunction.CountBlank(RNG) = RNG.Count Then Exit Sub
' Bereich an Array übergeben
arBereich() = Application.Transpose(RNG.Value)
For i = LBound(arBereich) To UBound(arBereich) Step 4
If InStr(arBereich(i + 3), "double") = 0 Then
' Filmtitel aufnehmen
arAusgabe(0) = arBereich(i + 2)
' Prüfung Duplikate
For j = LBound(arAusgabe) To UBound(arAusgabe)
If arAusgabe(j) = arBereich(i + 1) Then Exit For
Next j
' Person aufnehmen, wenn kein Duplikate
If j > UBound(arAusgabe) Then
ReDim Preserve arAusgabe(UBound(arAusgabe) + 1)
arAusgabe(UBound(arAusgabe)) = arBereich(i + 1)
End If
End If
Next i
' Array zurück in Tabelle schreiben
If UBound(arAusgabe) > 0 Then
Application.EnableEvents = False
RNG.ClearContents
Cells(Target.Row, 2).Resize(1, UBound(arAusgabe) + 1) = arAusgabe
If RNG.Count > MMax Then Rows(Target.Row + 1).Insert
Application.EnableEvents = True
End If
End If
Exit Sub
Fehler:
Application.EnableEvents = True
MsgBox "Fehler in Sub """ & APPNAME & """" & vbCrLf & "Fehlernummer: " & Err.Number & vbLf & Err.Description: Err.Clear
End Sub
Ich glaube das mit den Zeilen einfügen hat vorher schon nicht richtig funktioniert, aber ich habe die Logik unverändert kopiert.
If RNG.Count > MMax Then Rows(Target.Row + 1).Insert
Anstelle RNG.Count würde m.E. Target.Row eher Sinn ergeben.
cu
Chris
Anzeige
AW: Nachtrag zum besseren Verständnis
30.11.2022 16:15:04
Christian
Hallo Chris,
vielen Dank.
Habe eine gute und eine schlechte Nachricht, habe eine Sache vergessen zu sagen, aufgrund derer dieses Makro nicht funktioniert.
Aber die gute Nachricht, meine VBA Kenntnisse haben gereicht, um es von selber ans Laufen zu bringen.
Nein im Ernst, hatte nachdem ich diesen Beitrag eröffnet hatte noch eine Spalte zugefügt und deshalb hätte das Makro nicht mehr auf Einträge in Spalte B sondern auf Spalte C reagieren müssen und entsprechend auch in C folgende ausgeben.
Aber die Änderung hab ich wie gesagt selbst hinbekommen.
Danke für deine Mühe
Christian
Anzeige
AW: Nachtrag zum besseren Verständnis
30.11.2022 19:07:38
ChrisL
Danke für die Rückmeldung. Super, freut mich.
cu
Chris

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige