Endlosschleife in VBA Excel

Maddinuser

Lt. Junior Grade
Registriert
Apr. 2007
Beiträge
284
Hallo an alle !

Ich arbeite momentan an einer Lösung um folgendes zu tun.
Ich habe in Excel 2 Sheets.

In einem stehen Kontonummern und ein paar Spalten weiter Beschreibungen dazu. "S1"
In dem anderen das Gleiche, nur MEHR Kontonummern und dazugehörige Beschreibungen (wichtig). "S2"

Mein "Programm" soll nun die Kontonummer aus S1 mit der Kontonummer S2 vergleichen. Sind sie gleich, soll der dazugehörige Text aus S2 in die Beschreibungen von S1 geschrieben werden.

Sind die K.Nummern verschieden, soll in S2 solange gesucht werde, bis das Ende erreicht ist (oder von mir aus auch nur 50 Zeilen weiter, weil dann wird die Nummer normalerweise auftauchen). Wenn dann das Ende erreicht ist, steht die Nr. eben nicht drin und ich springe in S1 (also was gesucht wird) einen weiter (x wird einfach inkrementiert)

An der Stelle wo in S2 eine Nummer steht, aber in S1 nicht, springt er auch weiter und sieht dann AHA es ist die nächste Nummer also Text rein.

Dann kommt allerdings eine Nr. die in S1 steht aber nicht in S2 und dann hängt sich Excel auf !

Ich habe jetzt schon so viele Varianten ausprobiert aber jedes mal das selbe.
Ich bin kein Programmier Ass und habe noch wenig mit VBA gemacht, aber ich glaube ich habe Tomaten auf den Augen oder meine Kenntnisse reichen nicht aus.

Hier der Code:

Code:
Option Explicit

Sub Vergleichen()
'
' Vergleichen Makro
' Vergleicht Texte mit anderer Datei
'

Dim i As Integer
Dim x As Integer
Dim z As Integer



i = 5           'Kontonummern kommen ab Zeile 5
x = 5           'Kontonummern kommen ab Zeile 5




Do While x < 3000                             'Weil S1 nur ca 3000 Zeilen lang
    
        If Sheets("GC00_SKA1_SP1080_28032012").Cells(x%, "c").Value <> Sheets("GC00_SKA1_PRT_28032012").Cells(i%, "c").Value And i <= z + 50 Then       'i soll nicht länger als 50 Zellen weit suchen
            i = i + 1
            MsgBox (i%)
        End If
        
        If i > 4141 Then            '4141 Zeilen sind maximal zu durchsuchen
        x = x + 1                   'Wenn am Ende der Mappe, dann neue Nummer
        End If



    If Sheets("GC00_SKA1_SP1080_28032012").Cells(x%, "c").Value = Sheets("GC00_SKA1_PRT_28032012").Cells(i%, "c").Value Then

    Sheets("GC00_SKA1_SP1080_28032012").Cells(x%, "p").Value = Sheets("GC00_SKA1_PRT_28032012").Cells(i%, "n").Value
    Sheets("GC00_SKA1_SP1080_28032012").Cells(x%, "q").Value = Sheets("GC00_SKA1_PRT_28032012").Cells(i%, "o").Value

    i = i + 1
    x = x + 1
    z = i               'stelle von letztem erfolgreichem Vergleich speichern

End If
Loop

    
    
    

End Sub

Vielen Dank für die Hilfe !
 
Ich glaube der inkrementiert nicht richtig das i+... Und somit werden die 3000 vom x nie erreicht

If Sheets("GC00_SKA1_SP1080_28032012").Cells(x%, "c").Value <> Sheets("GC00_SKA1_PRT_28032012").Cells(i%, "c").Value And i <= z + 50 Then 'i soll nicht länger als 50 Zellen weit suchen

was machst du den wenn in 50 Zellen kein wert drin ist, dann wird i doch nicht größer?!
 
Zuletzt bearbeitet:
Stimmt, wenn 50 erreicht ist würde keine ifBedingung mehr zutreffen.
Auch nicht die mit i>4141, weil i nicht mehr größer wird.

Komischerweise wird i (msgbox) aber größer als 50. Naja mal sehen ...

Das war ein guter Denkanstoß, ich werde in Kürze berichten.
 
Sieht so aus als wäre das Problem behoben !
Gestern dahcte ich schon ich bin kurz davor, und jetzt hat es geklappt :)

Vielen Dank für den Denkanstoß, das habe ich einfach nicht gemerkt.

Außerdem machte das mit 50 keinen Sinn, wiel er dann auf einmal als Zeile 50 kam viel übersprungen hat, also ist die Prüfung nun auf 4141.
Das i im zweiten if durfte auch nicht +1 gemacht werden sondern ist jetzt einfach = z.

Ein tolles Erlebnis wenn man die ganzen Daten runterrattern sieht und sich so viel Arbeit gespart hat :D

Beim SVerweis hat gab es auch Probleme, den hätte man bestimmt in 2 verschachteln müssen.
Sowas wie VBA liegt mir einfach mehr, SVerweis etc finde ich nicht wirklich "greifbar". Kann das nicht erklären.

Also, vielen Dank !
 
kurze frage: müssen lediglich die daten aus blatt 1 mit den daten aus blatt 2 ergänzt werden?

du würdest dir einiges an text ersparen und auch (tipp)fehler vermeiden wenn du die worksheets als objekte definierst statt diese immer anzugeben:
Code:
Dim ws1 As Worksheet
Dim ws2 As Worksheet

Set ws1 = Sheets("GC00_SKA1_SP1080_28032012")
Set ws2 = Sheets("GC00_SKA1_PRT_28032012")

und bei vielen daten kann es schonmal ne weile dauern mit dem ständigen aktualisieren des bildschirms, wenn du die bildschirmaktualisierung ausschaltest dürfte es um einiges schneller gehen:
Code:
Application.ScreenUpdating = False
Application.ScreenUpdating = True

auch finde ich die fixen längen der schleifen sehr unflexibel, was machst du wenn sich die anzahl der datensätze ändert? jedesmal das programm anpassen?
 
diablobase schrieb:
kurze frage: müssen lediglich die daten aus blatt 1 mit den daten aus blatt 2 ergänzt werden?

du würdest dir einiges an text ersparen und auch (tipp)fehler vermeiden wenn du die worksheets als objekte definierst statt diese immer anzugeben:
Code:
Dim ws1 As Worksheet
Dim ws2 As Worksheet

Set ws1 = Sheets("GC00_SKA1_SP1080_28032012")
Set ws2 = Sheets("GC00_SKA1_PRT_28032012")
Ja nur das. Super Tip !! Danke

und bei vielen daten kann es schonmal ne weile dauern mit dem ständigen aktualisieren des bildschirms, wenn du die bildschirmaktualisierung ausschaltest dürfte es um einiges schneller gehen:
Code:
Application.ScreenUpdating = False
Application.ScreenUpdating = True
Auch nützlich !

auch finde ich die fixen längen der schleifen sehr unflexibel, was machst du wenn sich die anzahl der datensätze ändert? jedesmal das programm anpassen?

Da es erstmal nur eine einmalige Aufgabe war, habe ich daran nicht gedacht.
Aber das sollte man sicherlich mal überdenken. Mache ich auch, dann habe ich noch was zu tun bis zum Feierabend :p

Wahrscheinlich muss man hier irgendwie ermitteln wie lang das Sheet ist...

Danke für die Tipps !
 
Zuletzt bearbeitet:
da gibt es zwei möglichkeiten, entweder du schaust zuerst wieviele datenzeilen in deinem blatt sind oder du läufst blind durch bis nichts mehr zum verarbeiten da ist.

beim blind durchlaufen muss aber gewährleistet sein das es keine lücken in deiner liste gibt, also keine leeren zeilen, das in der ersten spalte (kannst du natürlich ändern) immer etwas drin steht und i muss natürlich deiner aktuellen Zeile entsprechen:
Code:
Do While ws1.Cells(i,1).Value <> ""
...
Loop

ansonsten kannst du mit
Code:
dim rng as Range
set rng = ws1.Cells.SpecialCells(xlCellTypeLastCell)
die letzte beschriebene zelle herausfinden, allerdings musst du aufpassen da diese zelle nicht immer die letzte datenzeile ist, sondern zbsp. durch durchgehende formatierungen etc eine andere sein kann.
 
Ich hab es so gelöst:

MaxRow = ws2.UsedRange.Rows.Count

und dann anstatt größer oder kleiner als 4141, eben die Variable MaxRow genommen.

Funktioniert !:freaky:
 
das geht natürlich auch, aber wie ich bereits bei meinem code geschrieben habe beinhaltet auch diese eigenschaft zellen welche nur durch eine formatierung "gefüllt" sind.

Beispiel:
du hast 10 zeilen reinen text (ohne jegliche formatierung) -> ActiveSheet.UsedRange.Rows.Count = 10
du markierst 20 zeilen (ohne inhalt) und machst diese fett -> ActiveSheet.UsedRange.Rows.Count = 20

@Moderation:
Ab wann darf ich "frei" antworten? ;)
 
Zurück
Oben