Microsoft Excel

Herbers Excel/VBA-Archiv

For-Schleife hängt sich auf

Betrifft: For-Schleife hängt sich auf von: Jan A
Geschrieben am: 09.09.2020 12:09:00

Hallo zusammen,


in einer Tabelle viele Datensätze der Zeile nach stehen. Falls sich ein Wert in einer Spalte wiederholt, wird diese mit einem Anführungszeichen (") bezeichnet. Das Ziel meiner Funktion ist es nun die Anführungszeichen durch "echte" Werte, d.h. den jeweiligen Wert darüber zu ersetzen. D.h.

4 -> 4

" -> 4

" -> 4

" -> 4.


Dafür verwende ich dieses Sub:

Sub wiederholungszeichen_entfernen(clmn As String) 
 'Erwartet die Spalte, in der gesucht werden soll als String

Dim x As Integer
x = 2

Sheets(tabellenblatt).Range(clmn & x).Select

Call find_last_row 
 'Funktion, die die letzte Zeile der Tabelle liefert (Variable ist "letztezeile")

Dim i As Integer

  For i = letztezeile To 1 Step  -1

      If ActiveSheet.Range(clmn & x).Value = """" Then

      ' """" steht als String für das Suchwort (")
      'clmn ist die erwartete Spalte, x die aktuelle Zeile

             ActiveCell.Value = ActiveSheet.Range(clmn & x - 1).Value

      End If

      x = x + 1  'wird benutzt, um eine Spalte weiter runter zu gehen

      ActiveSheet.Range(clmn & x).Select

  Next
End Sub

Allein ausgeführt, macht dieses Sub, was es soll. Ruft man es aber extern über ein anderes Sub oder eine UserForm auf, hängt sich das Programm auf, sodass nur das Drücken von Esc das Sub beendet (dann ist es aber bereits fertig). Daher denke ich, dass Performance-Gründe das Abstürzen verursachen. Hat da jemand einen Tipp, wie ich es ans Laufen bekomme? Ich bin Euch sehr dankbar!

Betrifft: AW: For-Schleife hängt sich auf
von: MatthiasG
Geschrieben am: 09.09.2020 12:29:47

Hallo Jan,

da du "ActiveSheet" und "ActiceCell" verwendest, gibt es da wahrscheinlich Probleme, wenn andere Blätter aktiv sind.
Referenziere die lieber:
Dim sh As Worksheet
Set sh = Worksheets("meinBlatt")
Und: Vermeide Activate und Select. Sehr guter Artikel hierzu:
https://www.herber.de/vbabasics/0009.html

Betrifft: AW: For-Schleife hängt sich auf
von: Daniel
Geschrieben am: 09.09.2020 12:32:24

Hi

ich würde die Aufgabe ganz anders lösen.
vielleicht tritt dann dein Problem nicht auf:
With Sheets(tabellenblatt).Range(clmn & "1").entirecolumn
    .Replace """", True, xlwhole
    .SpecialCells(xlcelltypeconstants, 4).FormulaR1C1 = "=R[-1]C"
    .Copy
    .PasteSpecial xlpastevalues
end with
das Prinzip ist, dass man die Anfz. durch einen Wahrheitswert ersetzt.
die Zellen mit dem Wahrheitswert kann man dann gezielt selektieren und sich die Werte der darüberliegenden Zellen über eine einfache Formel holen.

Gruß Daniel

Betrifft: AW: For-Schleife hängt sich auf
von: peterk
Geschrieben am: 09.09.2020 12:34:07

Hallo

ActiveSheet, ActiveCell sollte vermieden werden, da Du nie sicher bist was gerade aktiv ist. Eine Funktion sollte einen Rückgabewert habe und nicht in eine Public Variable schreiben. Weiss Deine Funktion von welchem Tabellenblatt es die letzte Zeile ermitteln soll?

Peter

Betrifft: AW: For-Schleife hängt sich auf
von: Jan A
Geschrieben am: 11.09.2020 11:38:44

Hallo Peter,
ja das weiß sie, weil diese auch die Variable "tabellenblatt" für das Sheet erwartet.

Betrifft: AW: For-Schleife hängt sich auf
von: Jan A
Geschrieben am: 11.09.2020 11:42:13

Hallo Peter,
ja das weiß sie, weil diese auch die Variable "tabellenblatt" für das Sheet erwartet.

Betrifft: AW: For-Schleife hängt sich auf
von: peterk
Geschrieben am: 11.09.2020 12:15:06

Hallo

Ich würde die Schleife so programmieren

Sub wiederholungszeichen_entfernen(clmn As String)
    'Erwartet die Spalte, in der gesucht werden soll als String
  
    Dim x As Integer
    Dim myWS As Worksheet
  
    Set myWS = Worksheets(tabellenblatt)
  
    Call find_last_row
    'Funktion, die die letzte Zeile der Tabelle liefert (Variable ist "letztezeile")
  
    For x = 2 To letztezeile
  
        If myWS.Range(clmn & x).Value = """" Then
  
            ' """" steht als String für das Suchwort (")
            'clmn ist die erwartete Spalte, x die aktuelle Zeile
  
           myWS.Range(clmn & x).Value = myWS.Range(clmn & (x - 1)).Value
  
        End If
        
    Next
End Sub



Betrifft: AW: wahrscheinliche Ursache
von: GerdL
Geschrieben am: 09.09.2020 12:46:37

Hallo Jan,

du müsstest die Selection (Blatt u. Zelle) trennen.

Sheets(tabellenblatt).Activate
Range(clmn & x).Select

In der Regel ist die Selection nur beim Testen hilfreich.
Wie man ein Objekt direkt referenziert, haben andere schon gezeigt.

Gruß Gerd

Betrifft: AW: For-Schleife hängt sich auf
von: onur
Geschrieben am: 09.09.2020 17:55:15

Abgesehen davon, worauf dich die Anderen bereits hingewiesen haben, ist ein Gänsefüsschen die denkbar schlechteste Wahl für einen Stringwert. Warum nimmst du nicht stattdessen z.B. "dito" oder ein "*"?

Betrifft: AW: For-Schleife hängt sich auf
von: Jan A
Geschrieben am: 10.09.2020 10:54:11

Hallo Onur,
Ja, die Gänsefüßchen sind problematisch, hierbei handelt es sich allerdings um maschinell erstellte Listen, die wiederum aus .txt-Dateien importiert werden, habe daher keinen Einfluss darauf.

Betrifft: AW: For-Schleife hängt sich auf
von: Jan A
Geschrieben am: 12.09.2020 19:19:13

Ich danke Euch für die Antworten!
Leider hat noch keine der Lösungen zum Erfolg geführt und es hängt immer noch.
Ist es theoretisch möglich, dass der Rest des Projekts zu umfangreich geworden ist? Kann man mit der Methode "Application.wait(...)" auch noch was reißen? Ich habe es sowohl mit Vorschlag 1 als auch mit Vorschlag 2 (getrennt voneinander) versucht:
'Vorschlag 1
Set myWS=Worksheets(tabellenblatt)
With myWS.Range(clmn & "1").EntireColumn
    .Replace """", True, xlWhole
    .SpecialCells(xlCellTypeConstants, 4).FormulaR1C1 = "=R[-1]C"
    .Copy
    .PasteSpecial xlPasteValues
End With

'Vorschlag 2
Dim x As Integer
x = 2

Set myWS = Worksheets(tabellenblatt)

Call find_last_row

Application.ScreenUpdating = False

  For x = 2 To letztezeile

If myWS.Range(clmn & x).Value = """" Then
Range(clmn & x).Value = Range(clmn & (x - 1)).Value
End If

Next
Gruß Jan

Betrifft: AW: For-Schleife hängt sich auf
von: Daniel
Geschrieben am: 12.09.2020 19:38:59

Hi
Der Rest des Projekts sollte damit nicht zu tun haben, es sei denn du hast komplexe Formeln die sich auf diese Zellen beziehen und neu berechnet werden.
Application.Wait hilft nicht, weil in der Wartezeit nichts passiert.
Du solltest mal.die Datei hochladen, damit man sich das anschauen kann.

Gruß Daniel