Live-Forum - Die aktuellen Beiträge
Anzeige
Archiv - Navigation
1832to1836
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

Problem Userform

Problem Userform
31.05.2021 15:49:33
Omni
Hallo zusammen,
ich habe ein kleines Problem mit einer meiner Userforms und hoffe, Ihr könnt mir bei der Lösung behilflich sein.
Beschreibung:
In meiner Userform7 befindet sich ein CommandButton2, dessen Bestätigung einige Tätigkeiten vornimmt und anschließend eine weitere Userform (Userform8) öffnet. Userform8 enthält einen Ladebalken + Fortschrittsanzeige und wird nach der Ausführung beendet. Anschließend öffnet sich die Userform9, die das Ergebnis des Ladevorgangs anzeigt.
Problembeschreibung:
Über den CommandButton in Userform7 werden einige Angaben angepasst und das Modul9 (Angaben zurücksetzen) geladen. Allerdings hindert das Aufrufen des Modul9 die Userform8 an der korrekten Ausführung. Sie öffnet sich zwar, aber unterbricht dann abrupt, sodass die Fortschrittsanzeige ausbleibt und Userform8 nicht geschlossen wird und Userform9 nicht geladen wird. Wenn ich das Modul9 im Code (siehe unten Nr. 1) ausblende läuft alles reibungslos durch. Ich habe eigentlich alles mögliche versucht um den Fehler zu beheben, komme aber nicht weiter und hoffe, dass mir da jemand weiterhelfen kann.
Codes:
1. Code: Userform7 - Commandbutton

Private Sub CommandButton2_Click()
'Code-Beschreibung: Userform7 auf "Bearbeitungsstand zurücksetzen" geklickt.
Dim Cancel As Boolean
If ((UserForm7.CheckBox11.Value = True And UserForm7.CheckBox9.Value = False) And _
(UserForm7.CheckBox5.Value = True And UserForm7.CheckBox6.Value = False And UserForm7.CheckBox7.Value = False And UserForm7.CheckBox8.Value = False) And _
(Worksheets("Tabelle1").Range("C34") = "Q4" Or Worksheets("Tabelle1").Range("C40") = "Q3" Or Worksheets("Tabelle1").Range("C37") = "Q1")) Then
Worksheets("Tabelle1").Range("C34").Copy
Worksheets("Tabelle1").Range("C55").PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
Worksheets("Tabelle1").Range("C37").ClearContents
        'Nr. 1: Datenbereinigung (Verweis auf Modul 9).
Bearbeitungsstand_Zurücksetzten_1
'Nr. 2: Rückführung auf Reiter "Übersicht".
Worksheets("Übersicht").Activate
'Nr. 3: Dokumentation des Bearbeitungsstatus.
UserForm7.CheckBox3.Value = False
UserForm7.CheckBox3.Enabled = False
UserForm7.CheckBox4.Value = True
UserForm7.CheckBox4.Enabled = True
'Nr. 4: Userform7 initialisieren und beenden.
Userform_Initialize
Unload Me
'Nr. 5: Userform7 initialisieren und Userform8 laden.
UserForm8.Show
End If
2. Code: Userfom8 - Ladebalken und Fortschrittsanzeige

Private Sub UserForm_Activate()
Call MWFortschrittsanzeige
End Sub
Private Sub MWFortschrittsanzeige()
Dim i As Long
Dim MWProgressBar_dStepValue As Double
Dim MWProgressBar_dProgress As Double
Dim MWProgressBar_lStep As Double
Dim MWProgressBar_MaxSteps As Double
Const lSTEPS As Long = 7500
Const dMAXLABELWIDTH As Double = 354
MWProgressBar_MaxSteps = lSTEPS
MWProgressBar_dStepValue = CDbl(dMAXLABELWIDTH / CDbl(lSTEPS))
MWProgressBar_dProgress = 0
Frame1.Visible = True
Label1.Visible = True
Label1.Width = 1
For i = 1 To lSTEPS
MWProgressBar_dProgress = MWProgressBar_dProgress + MWProgressBar_dStepValue
Label1.Width = MWProgressBar_dProgress
DoEvents
Next i
Frame1.Visible = False
Label1.Visible = False
Unload Me
UserForm9.Show
End Sub
3. Code: Userform9: Anzeige Ergebnis Ladebalken

Private Sub CommandButton1_Click()
Unload Me
End Sub
Private Sub UserForm_Activate()
Frame2.Visible = True
Label2.Visible = True
Label3.Visible = True
CommandButton1.Visible = True
End Sub

9
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Problem Userform
31.05.2021 19:50:07
ralf_b
Wow, 3,5 std und keine Antwort auf deine Problemstellung.
Könnte daran liegen das deine Problembeschreibung zwar ahnen läßt woran es liegt, aber mangels ausreichend Information zu den beteiligten Codes wird das Ratespiel Niemand machen wollen.
AW: Problem Userform
01.06.2021 14:24:56
Omni
Nun, mit Ausnahme des Modul9 sind die beteiligten Codes ja beigefügt. Bei der Userform7 handelt es sich um eine Maske, die einen CommandButton (CommandButton2) enthält. Sofern dieser geklickt wird, soll - wie oben unter 1.Code beschrieben - einige Aktionen durchgeführt werden:
- Prüfung Kriterien
- Copy/Paste
- ClearContents
- Verweis auf das Modul9 (innerhalb dessen werden die Angaben zurückgesetzt)
- Rückführung auf Reiter "Übersicht"
- Anpassung der Checkboxen zur Doku des Bearbeitungsstands
- Initialisierung und Beendigung der Userform7
- Userform8 laden.
Die ebenfalls beigefügten Codes 2 und 3 zur Fortschrittsanzeige und Userform9 sind ebenfalls beigefügt. Von diesen dürfte aber kein Problem ausgehen, da sie isoliert betrachtet laden. Wenn ich also die Userform8 auswähle und aktiviere, öffnet sie sich, zeigt den Ladebalken und dessen Fortschritt an und schließt sich. Das Ergebnis ("Ladevorgang abgeschlossen") zeigt sich dann in Userform9.
Das Problem ist, dass die Ausführung des Modul9 dies zu behindern scheint. Ohne das Modul9 funktioniert es, wie gewünscht. Mit Modul9 jedoch nicht. Ich weiß leider nicht, woran das liegt und wie ich das beheben kann.
Anzeige
AW: Problem Userform
01.06.2021 18:20:06
ralf_b
wie gesagt ohne den ganzen beteiligten Code. usw....
da hilft es auch nicht wenn du das bekannte Gedöns nochmal wiederholst.
Wozu muss man UF 7 denn initialisieren vorm unload?
Hast du den fraglichen Code mal schrittweise durchlaufen?
Vielleicht setzt dein Zurücksetzcode auch irgend eine Zählvariable des Fortschrittbalkens zurück oder so ähnlich. Ups, bin schon beim Ratespiel .
AW: Problem Userform
02.06.2021 14:56:38
Omni
Das Problem ist, dass der ganze Code etwas zu umfangreich ist.
Habe aber die Fehlerquelle gefunden, die das Laden der UserForm8 zwar gestattet, aber die Fortführung der weiteren Prozeduren (siehe Punkt: 2. Code: Userfom8 - Ladebalken und Fortschrittsanzeige) unterbindet. Allerdings weiß ich nicht warum.
Problemcode:

Dim intRow As Integer
Dim wks As Worksheet
For Each wks In Worksheets
wks.Activate
If wks.Name = "AB 1" Or wks.Name = "AB 2" Or wks.Name = "AB 3" Then
intRow = 12 'Startzeile hier ab AB R1
Do While Left(Cells(intRow, 1), 2) = "AB R1"
Cells(intRow, 8).Copy
Cells(intRow, 7).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 11).Copy
Cells(intRow, 10).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 20).Copy
Cells(intRow, 19).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 23).Copy
Cells(intRow, 22).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 5).ClearContents
Cells(intRow, 6) = "X"
Cells(intRow, 8).ClearContents
Cells(intRow, 9).ClearContents
Cells(intRow, 11) = "Keine Angaben"
Cells(intRow, 16).ClearContents
Cells(intRow, 17).ClearContents
Cells(intRow, 18).ClearContents
Cells(intRow, 20).ClearContents
Cells(intRow, 21).ClearContents
Cells(intRow, 23) = "Keine Angaben"
intRow = intRow + 1
Loop
intRow = 18 'Startzeile hier ab AB R2
Do While Left(Cells(intRow, 1), 2) = "AB R2"
Cells(intRow, 8).Copy
Cells(intRow, 7).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 11).Copy
Cells(intRow, 10).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 20).Copy
Cells(intRow, 19).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 23).Copy
Cells(intRow, 22).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 5).ClearContents
Cells(intRow, 6) = "X"
Cells(intRow, 8).ClearContents
Cells(intRow, 9).ClearContents
Cells(intRow, 11) = "Keine Angaben"
Cells(intRow, 16).ClearContents
Cells(intRow, 17).ClearContents
Cells(intRow, 18).ClearContents
Cells(intRow, 20).ClearContents
Cells(intRow, 21).ClearContents
Cells(intRow, 23) = "Keine Angaben"
intRow = intRow + 1
Loop
intRow = 18 'Startzeile hier ab AB R3
'1. Prüfprozedur: Vorhandensein prüfen.
If Left(Cells(intRow, 1), 2) = "AB R3" Or Left(Cells(intRow, 1), 3) = "Beginn" Then
Do While Left(Cells(intRow, 1), 2) = "AB R3" Or Left(Cells(intRow, 1), 3) = "Beginn"
intRow = intRow + 1
Loop
End If
'2. Hauptprozedur: Bereinigung.
Do While Left(Cells(intRow, 1), 2) = "AB R3"
Cells(intRow, 8).Copy
Cells(intRow, 7).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 11).Copy
Cells(intRow, 10).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 20).Copy
Cells(intRow, 19).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 23).Copy
Cells(intRow, 22).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 2).ClearContents
Cells(intRow, 3).ClearContents
Cells(intRow, 4).ClearContents
Cells(intRow, 8).ClearContents
Cells(intRow, 9).ClearContents
Cells(intRow, 11) = "Keine Angaben"
Cells(intRow, 16).ClearContents
Cells(intRow, 17).ClearContents
Cells(intRow, 18).ClearContents
Cells(intRow, 20).ClearContents
Cells(intRow, 21).ClearContents
Cells(intRow, 23) = "Keine Angaben"
intRow = intRow + 1
Loop
End If
Next wks

Anzeige
AW: Problem Userform
02.06.2021 19:08:39
ralf_b
Probiers mal damit. seltsame Geschichte ,die du da programmiert hast.
ich würde mal sagen das deine do while Bedingungen überhaupt nicht funktionieren.
Left(Cells(intRow, 1), 2) = "AB R3" d.h. zwei Zeichen von Links sollen gleich einem Text mit 5 Zeichen sein. Nee ,oder?
Du hast 3 Do while Schleifen. die nacheinander die Zeilen jedes Blattes durcharbeiten würden. Und er einzige Unterschied ist die Startzeile.
Stellt sich die Frage ob in einem Blatt Namens "AB 1" auch eine Zelle dem Wert "AB R2" oder "AB R3" haben kann.
wenn nicht reicht Do While Left(.Cells(intRow, 1), 2) = "AB"

Dim intRow As Integer
Dim wks    As Worksheet
For Each wks In Worksheets
'  wks.Activate
With wks
If .Name = "AB 1" Or .Name = "AB 2" Or .Name = "AB 3" Then
Select Case .Name
Case "AB 1": intRow = 12
Case "AB 2", "AB 3": intRow = 18
End Select
Do While Mid(.Cells(intRow, 1), 4, 2) = "R1" Or _
Mid(.Cells(intRow, 1), 4, 2) = "R2" Or _
Mid(.Cells(intRow, 1), 4, 2) = "R3"
.Cells(intRow, 6) = "X"
.Cells(intRow, 7).Value = .Cells(intRow, 8)
.Cells(intRow, 10) = .Cells(intRow, 11)
.Cells(intRow, 11) = "Keine Angaben"
.Cells(intRow, 19) = .Cells(intRow, 20)
.Cells(intRow, 22) = .Cells(intRow, 23)
.Cells(intRow, 23) = "Keine Angaben"
Union(.Cells(intRow, 5), _
.Cells(intRow, 8).Resize(, 2), _
.Cells(intRow, 16).Resize(, 3), _
.Cells(intRow, 20), Resize(, 2)).ClearContents
If Mid( .Cells(intRow, 1), 4, 2) = "R3" Then
.Cells(intRow, 2).Resize(, 3).ClearContents
End If
intRow = intRow + 1
Loop
'1. Prüfprozedur: Vorhandensein prüfen.
' was soll das denn prüfen?
'        If Left(Cells(intRow, 1), 2) = "AB R3" Or Left(Cells(intRow, 1), 3) = "Beginn" Then
'            Do While Left(Cells(intRow, 1), 2) = "AB R3" Or Left(Cells(intRow, 1), 3) = "Beginn"
'                intRow = intRow + 1
'            Loop
'       End If
End If
End With
Next wks

Anzeige
AW: Problem Userform
04.06.2021 14:19:02
Omni
Hallo ralf_b,
vielen Dank erstmal für deine Hilfe. Also tatsächlich habe ich mich da bei der Übernahme des Makros vertan. Der Code ist so gelegt, dass er funktioniert. Hatte die Begriffe geändert und vergessen, es auf 5 anzupassen. Isoliert betrachtet funktioniert der Code inkl. der Do While Schleifen aber.
Aus irgendeinen Grund hindert er aber die Userform8 am Laden. Sie öffnet sich zwar, bricht dann aber ab.
Viele Grüße
AW: Problem Userform
02.06.2021 20:03:42
Daniel
Hi
das Hauptproblem ist, dass ein Code generell nicht zeitoptimiert programmiert ist.
vernünftig programmiert, brauchst du wahrscheinlich gar keinen Ladebalken, weil das ganze schneller ausgeführt ist, als du brauchst um den Button loszulassen.
das Grundprinzip für schnelles Arbeiten in Excel ist, dass man Zellen möglichst nicht einzeln bearbeitet, sondern immer dort wo es möglich ist, möglichst große Zellblöcke in einem Arbeitsschritt verändert.
du löschst ja auch nicht die Zellen A1, A2 und A3 einzeln nacheinander, sondern du markierst alle zu löschenden Zellen und löschst dann den Inhalt auf einmal.
wenn du zum Bäcker gehst, kaufst und bezahlst du ja auch nicht jedes Brötchen einzeln, sondern immer alle zusammen.
so sollte man in Excel auch denken und arbeiten.
kleines Beispiel:

intRow = 12 'Startzeile hier ab AB R1
Do While Left(Cells(intRow, 1), 2) = "AB R1"
Cells(intRow, 8).Copy
Cells(intRow, 7).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 11).Copy
Cells(intRow, 10).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 20).Copy
Cells(intRow, 19).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 23).Copy
Cells(intRow, 22).PasteSpecial Paste:=xlPasteValues, Operation:= _
xlNone, SkipBlanks:=False, Transpose:=False
Cells(intRow, 5).ClearContents
Cells(intRow, 6) = "X"
Cells(intRow, 8).ClearContents
Cells(intRow, 9).ClearContents
Cells(intRow, 11) = "Keine Angaben"
Cells(intRow, 16).ClearContents
Cells(intRow, 17).ClearContents
Cells(intRow, 18).ClearContents
Cells(intRow, 20).ClearContents
Cells(intRow, 21).ClearContents
Cells(intRow, 23) = "Keine Angaben"
intRow = intRow + 1
Loop
hier bearbeitest du ja alle Zeilenn, in denen in Spalte A am Anfang "AB R1" steht.
das machst du Zeile für Zeile, immer auf die gleiche weise
Da die Liste sortiert sein dürfte, muss man das nicht machen sondern man auch die erste und letzte Zeile ermitteln, in denen "AB R1 steht" und dann alle Zeilen dazwischen im Block bearbeiten.
das machst den Code nicht nur kürzer, sondern auch viel schneller:

Dim intRow1 As Long
Dim intRow2 As Long
intRow1 = Columns(1).Find(what:="AB R1*", lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlNext).Row
intRow2 = Columns(1).Find(what:="AB R1*", lookat:=xlWhole, LookIn:=xlValues, searchdirection:=xlPrevious).Row
With Range(intRow1 & ":" & intRow2)
.Columns(7).Value = .Columns(8).Value
.Columns(10).Value = .Columns(11).Value
.Columns(19).Value = .Columns(20).Value
.Columns(22).Value = .Columns(23).Value
.Columns(6).Value = "X"
.Columns(11).Value = "keine Angabe"
.Columns(23).Value = "keine Angabe"
Union(.Columns(5), .Column(8).Resize(, 2), .Columns(16).Resize(, 3), .Columns(20).Resize(, 2), .Columns(23)).ClearContents
End With
wenn du das mal konsequent in deinem Code umsetzt (das andere ist ja ähnlich, aber für eine genauere Optimierung müsste ich den Dateiaufbau kennen)
sollte der Vortschrittsbalken unnötig werden.
Gruß Daniel
Anzeige
AW: Problem Userform
04.06.2021 14:21:19
Omni
Hi Daniel,
besten Dank noch für Deine Antwort und Hilfe.
Ich werde versuchen, das mal so umzusetzen und gebe dann nochmal Bescheid :)
Viele Grüße
AW: Problem Userform
04.06.2021 16:23:16
Omni
Hi Daniel,
hab es eben umgesetzt und durchlaufen lassen. Vielen Dank nochmal für Deine Hilfe. Funktioniert super,
Es läuft schneller durch & hindert die Userform8 nicht mehr am laden :)
Ich wünsche Dir noch ein schönes WE.
Viele Grüße

Links zu Excel-Dialogen

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige