MS-Office-Forum

Zurück   MS-Office-Forum > Microsoft Office > Microsoft Excel
Registrieren Forum Hilfe Alle Foren als gelesen markieren

Banner und Co.

Antworten
Ads
Themen-Optionen Ansicht
Alt 14.04.2019, 16:53   #1
Econ
MOF User
MOF User
Standard VBA - Laufvariable hat eine Riesenmacke

Hallo, allerseits!

Ich poste unten einen Code, der so noch nicht funktioniert wie er sollte. Ich bin auf der Suche nach dem Fehler. Mir ist etwas extrem ungewöhnliches aufgefallen, was ich beim besten Willen nicht nachvollziehen kann. Möglicherweise verursacht diese Unregelmäßigkeit aber alle weiteren Fehler.

Derzeit befindet sich der Prozess in einem unendlichen Loop. Daher habe ich eine Msgbox eingebaut, um dem Fehler auf den Grund zu gehen. Jetzt wird es interessant.

Ausschnitt
Code:

MsgBox i & " " & Aufgabe.ListCount & " " & Aufgabe.List(i)
Dieser Ausschnitt führt nach einigen Durchläufen immer zu dem Ergebnis:
i=1, Aufgabe.ListCount = 2 Aufgabe.List(i) ="irgendein gleichbleibender Name"

wenn ich den hinteren Teil des Ausschnitts auskommentieren

Ausschnitt Variante zwei:
Code:

MsgBox i & " " & Aufgabe.ListCount '& " " & Aufgabe.List(i)
entstehen nach einigen Durchläufen andere Ergebnisse:
i= 1 oder 2 (abwechselnd), Aufgabe.ListCount = 2


Das kann doch unmöglich sein? Da der letzte auskommentierte Teil nicht den Wert von i beeinflusst.

Bitte habt Verständnis dafür, dass ich nicht meine Mappe hochladen werde.


Wissenswertes zur Funktionsweise:
Der Code hat bereits eine Liste erstellt für eine Combobox. Die Daten dafür stammen aus dem Sheet "Monate planen". (nicht in diesem Code enthalten)
Nun werden Daten im Sheet "Wochen planen" abgeglichen und unter bestimmten Voraussetzungen (siehe Kontingent) aus der Liste der Combobox wieder entfernt. (ist in diesem Code enthalten)


gesamter Code:
Code:

Sub KontingentErreicht(aufg As Byte)
'Wenn das Monatskontingent erreicht ist, kann keine weitere Aufgabe dieser Art hinzugefügt werden
Dim aufg_Woche As Byte
Dim kontingent As Integer
Dim zeile3 As Integer
Dim i As Byte


With Worksheets("Woche planen")
    zeile3 = .Cells(.Rows.Count, 1).End(xlUp).Row
End With

'gesamte Liste durchgehen
For i = 0 To WorksheetFunction.Max(Aufgabe.ListCount - 1, 0)
'falls Listenitem = überprüfter Tabelleneintrag
    kontingent = 0
    MsgBox i & " " & Aufgabe.ListCount & " " & Aufgabe.List(i)
    For aufg_Woche = 3 To zeile3
    If Worksheets("Woche planen").Cells(aufg_Woche, 5) = Aufgabe.List(i) Then   'Übereinstimmung
    kontingent = Worksheets("Woche planen").Cells(aufg_Woche, 4) + kontingent

        'Finde den Eintrag in monatsarr / Monatstabelle
        For aufg = 3 To zeile2
        If monatsarr(aufg - 2, 1) = Aufgabe.List(i) Then    'Übereinstimmung
'        kontingentarr(aufg - 2) = monatsarr(aufg - 2, 6) - Worksheets("Woche planen").Cells(aufg_Woche, 4)
            
                        If kontingent >= monatsarr(aufg - 2, 6) Then    'Kontingent überschritten
            '            MsgBox Aufgabe.List(i) & " " & monatsarr(aufg - 2, 6)
                        On Error Resume Next
                        Aufgabe.RemoveItem i
                        i = 0
                        End If
            
        Exit For
        End If
        Next
        
'    Exit For 'falls Tabelle = Listeneintrag => exit for
    End If
'    kontingentarr(aufg - 2) = monatsarr(aufg - 2, 6) - kontingent
    Next
kontingentarr(aufg - 2) = monatsarr(aufg - 2, 6) - Worksheets("Woche planen").Cells(aufg_Woche, 4)
Next
End Sub

Geändert von Econ (14.04.2019 um 16:59 Uhr).
Econ ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.04.2019, 16:55   #2
Hajo_Zi
MOF Guru
MOF Guru
Standard

ich würde doch mal vermuten das liegt an der Datei.
Die meisten bauen Deine Datei nicht nach. Die Zeit hat schon jemand investiert.

Ein Nachbau sieht meist anders aus als das Original. Darum sollte das Original verlinkt werden.
Die meisten möchten es am Original testen um den gleichen Fehler zu erhalten.

Der Name einer hochgeladenen Mappe wird im Beitrag automatisch angezeigt, sodass es bei Verwendung von aussagekräftigen Namen leichter fällt, sie später im Ablageordner wiederzufinden und sie gedanklich einem bestimmten Thema zuzuordnen. Namen wie Muster*, Test*, Mappe*, Beispiel*, Fehler*, Kalender*, UserForm* , Forum* usw. sind so allgemein, dass eine Zuordnung zu einem Thema unmöglich gemacht wird.
Es sollte ein aussagekräftiger Name sein.

Benutze hier im Forum die Funktion zum hochladen. Falls Du die nicht benutzen möchtest beachte, von unsicheren Servern wie z.B. www.file-upload.net lade ich keine Datei runter. (lt. Einschätzung meines Virenprogramms)

GrußformelHomepage

__________________

Signatur in jedem Beitrag
Bitte Version angeben. Bei keiner Angabe gehe ich von meinen Angaben aus.
Betriebssystem: Windows 10 - 64 Bit, Office 2016 - 32 Bit.
Fragen werden im Forum beantwortet, nicht per PN.
Hajo_Zi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.04.2019, 17:22   #3
Econ
Threadstarter Threadstarter
MOF User
MOF User
Standard

Was hat das mit der Datei zu tun? Auch von der hängt der Wert von i nicht ab.
Econ ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.04.2019, 17:28   #4
Hajo_Zi
MOF Guru
MOF Guru
Standard

Gut in meiner Datei komt schon Fehler bei Aufgabe.
Aber das sehe ich wohl faklsch.
Viel Erfolg noch.

Gruß Hajo

__________________

Signatur in jedem Beitrag
Bitte Version angeben. Bei keiner Angabe gehe ich von meinen Angaben aus.
Betriebssystem: Windows 10 - 64 Bit, Office 2016 - 32 Bit.
Fragen werden im Forum beantwortet, nicht per PN.
Hajo_Zi ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.04.2019, 17:40   #5
Econ
Threadstarter Threadstarter
MOF User
MOF User
Standard

Ja? Was ist der Fehler? Aufgabe ist der Name der Combobox. Wie muss der Code aussehen, um den Text des Listenitems aus der Combobox "Aufgabe" zu erhalten?

Ist Aufgabe.List(i) falsch?
Econ ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.04.2019, 18:05   #6
Muller2
MOF User
MOF User
Standard

Hallo,

Zitat:

Bitte habt Verständnis dafür, dass ich nicht meine Mappe hochladen werde.

....nö...

Gruß, Muller2
Muller2 ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.04.2019, 18:45   #7
EarlFred
MOF Guru
MOF Guru
Standard

Zitat:

i = 0

__________________

Datum und Uhrzeit, Makrorekorder-Code entschlacken, {Matrixformeln}
Tutorials zu Pivottabellen: Kurzeinstieg; Dynamischer Datenbereich; Daten und Zeiten gruppieren
Für 7 meiner Beiträge haben sich die Hilfesuchenden mit einer Spende an Wikipedia, die Tafeln oder Hilfe für krebskranke Kinder eV bedankt (das entspricht 0,049% per 19.12.2018) - eine tolle Geste!
EarlFred ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.04.2019, 18:52   #8
MisterBurns
MOF Meister
MOF Meister
Standard

Zitat:

Bitte habt Verständnis dafür, dass ich nicht meine Mappe hochladen werde.

Bitte hab Verständnis dafür, dass ich deinen Code nicht auf Verdacht durchackere. Ich will den Code im Einzelschritt laufen lassen um zu sehen, was wo passiert.

__________________

Schöne Grüße
Berni
MisterBurns ist gerade online  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.04.2019, 19:04   #9
Econ
Threadstarter Threadstarter
MOF User
MOF User
Standard

Zitat: von EarlFred Beitrag anzeigen

Ja, das ist mir bewusst. Eigentlich sollte es damit auch keine Probleme geben, da i nur dann = 0 gesetzt wird, wenn das Kontingent sich auf eine ausreichende Größe aufsummiert. In einem solchen Fall würde das entsprechende Item aus der Liste entfernt und kann müsste somit aus der Bedingung

Code:

If Worksheets("Woche planen").Cells(aufg_Woche, 5) = Aufgabe.List(i) Then
herausfallen. Sobald es aus dieser Bedingung rausfällt, kann das Kontingent nicht mehr aufsummiert werden und i kann nicht mehr null gesetzt werden.
So sollte der Code eigentlich funktionieren.

Leider verhält er sich anders:Aus irgendeinem Grund ist i nach einigen Durchläufen mal 1 mal 2. Und das obwohl seine Größe auf 1 beschränkt ist.

Code:

For i = 0 To WorksheetFunction.Max(Aufgabe.ListCount - 1, 0)
Tests mit Msgbox (aber auch Überprüfung der Listenitems in der Combobox) ergaben, dass ListCount zum Zeitpunkt des Fehler = 2 ist. Damit läuft die Schleife bis maximal 2-1=1. Dennoch wird i manchmal 2.

Durch On Error Resume next (war nur zum testen drin) kommt es an der Stelle

Code:

If Worksheets("Woche planen").Cells(aufg_Woche, 5) = Aufgabe.List(i)
Zu einem Fehler. Das liegt daran, weil i zu zwei wird, was es nicht dürfte. Durch On Error Resume next, wird die Bedgingung als wahr anerkannt und kontingent wird wieder aufsummiert, was dann i wieder auf null setzt.



Mein Gedanke bei i = 0 war, dass ich durch RemoveItem die Möglichkeit in Betracht ziehe, dass die i nicht mehr an der gewünschten Stelle im Index der Combobox ist und somit Element übersprungen werden. Ich umgehe diesen Bug nun, indem ich eine zweite identische Schleife um die äußerste schalte.


Mich würde dennoch interessieren, wie i abwechselnd 1 oder 2 sein kann, obwohl sein Wert auf 1 limitiert ist.
Econ ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.04.2019, 19:46   #10
MachMalWas
Neuer Benutzer
Neuer Benutzer
Standard

Hallo Econ,

schau mal nach welchen Datentype WorksheetFunction.Max zurückgibt?

Alles klar ?

Gruß Harald
MachMalWas ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.04.2019, 21:24   #11
EarlFred
MOF Guru
MOF Guru
Standard

Zitat:

So sollte der Code eigentlich funktionieren.

Tut er aber nicht. Darum bist du hier.

Mach eine Mustermappe fertig - aus fehlerhaftem Code und deinen Texten wird keiner schlau.

__________________

Datum und Uhrzeit, Makrorekorder-Code entschlacken, {Matrixformeln}
Tutorials zu Pivottabellen: Kurzeinstieg; Dynamischer Datenbereich; Daten und Zeiten gruppieren
Für 7 meiner Beiträge haben sich die Hilfesuchenden mit einer Spende an Wikipedia, die Tafeln oder Hilfe für krebskranke Kinder eV bedankt (das entspricht 0,049% per 19.12.2018) - eine tolle Geste!
EarlFred ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Alt 14.04.2019, 21:31   #12
EarlFred
MOF Guru
MOF Guru
Standard

dir ist klar, dass next die Zählervariable erhöht, auch wenn bereits die Obergrenze erreicht ist?
Man setzt auch nicht die Zählervariable innerhalb der Schleife auf andere Werte.
Wenn Du aus Auflistungen löschen willst, ohne Zählerkauderwelsch zu veranstalten, lässt man die Schleife von hinten nach vorne laufen.

Code, der nur mit On Error Resume Next läuft (von einigen Ausnahmen abgesehen, die hier aber nicht vorliegen), ist mangelhaft.

__________________

Datum und Uhrzeit, Makrorekorder-Code entschlacken, {Matrixformeln}
Tutorials zu Pivottabellen: Kurzeinstieg; Dynamischer Datenbereich; Daten und Zeiten gruppieren
Für 7 meiner Beiträge haben sich die Hilfesuchenden mit einer Spende an Wikipedia, die Tafeln oder Hilfe für krebskranke Kinder eV bedankt (das entspricht 0,049% per 19.12.2018) - eine tolle Geste!
EarlFred ist offline  
verlinken auf Del.icio.us Diese Seite zu Mister Wong hinzufügen
Antworten Auf Beitrag antworten
Ads
Antworten


Aktive Benutzer in diesem Thema: 1 (Registrierte Benutzer: 0, Besucher: 1)
 
Themen-Optionen
Ansicht

Forumregeln
Es ist Ihnen nicht erlaubt, neue Themen zu verfassen.
Es ist Ihnen nicht erlaubt, auf Beiträge zu antworten.
Es ist Ihnen nicht erlaubt, Anhänge anzufügen.
Es ist Ihnen nicht erlaubt, Ihre Beiträge zu bearbeiten.

vB Code ist An.
Smileys sind An.
[IMG] Code ist An.
HTML-Code ist An.
Gehe zu


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:16 Uhr.



Powered by: vBulletin Version 3.6.2 (Deutsch)
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.

Copyright ©2000-2018 MS-Office-Forum. Alle Rechte vorbehalten.
Copyright ©Design: Manuela Kulpa ©Rechte: Günter Kramer
Eine Verwendung der Inhalte in anderen Publikationen, auch auszugsweise,
ist ohne ausdrückliche Zustimmung der Autoren nicht gestattet.