797 Aufrufe
Gefragt in Tabellenkalkulation von Mitglied (926 Punkte)
Hallo Makro-Spezialisten
das folgende Makro habe ich mit Hilfe verschiedener Beträge, von hier und anderswo, zusammen gebastelt und teste es gerade unter Excel 2000.
Wenn ich es aus dem VBA-Fenster heraus, im Einzelschrittmodus per "F8"-Taste ausführe, funktioniert es wie gewüscht. Immer wenn ich eine Aktion ausgewählt habe, wird sie ausgeführt bevor die nächste Abfrage kommt.
So soll es auch dann passieren, wenn ich es aus dem> Menü >Extras > Makro >Makros> "Start" heraus aufrufe.
Tatsächlich wird dann nur die Spaltenbreite auf 5 gesetzt und dann werden alle Abfragen durchlaufen und erst dann werden die Anweisungen ausgeführt. Es verschieben sich aber die Spalten nach jeder (Teil-) Aktion und so lässt sich mit diesem Code nicht sicher arbeiten.
Schon innerhalb des Makros "Sub Start() verstehe ich nicht warum es nicht Schritt für Schritt ausgeführt wird.
Und dann sollte doch immer ein Makro abgearbeitet und beendet werden, um dann das nächste aufzurufen. Was habe ich hier unwissentlich eingebaut, das erst die Abfragen aus 4 Makros (ggf. mehrfach) erfolgen, um dann wieder beim ersten Makro anzufangen um die Anweisungen abzuarbeiten???

Sub Start()
Cells.ColumnWidth = 5

Dim leere_Spalte As Integer
Application.ScreenUpdating = False
For leere_Spalte = 10 To 1 Step -1 'die 10 um den Test abzukürzen
If Application.CountA(Columns(leere_Spalte)) = 0 Then
Columns(leere_Spalte).Delete
End If
Next
Columns("A:A").Insert Shift:=xlToLeft

If MsgBox("sollen Zahlen mit 2 Nachkommastellen formatiert werden?.", vbYesNo + vbQuestion, "Mit oder ohne Nachkommastellen?") = vbYes Then
Cells.NumberFormat = "#,##0.00"
Cells.ColumnWidth = 11

Else
Cells.NumberFormat = "#,##0"
Cells.ColumnWidth = 9
End If
Call Spalte_löschen
End Sub

Sub Spalte_löschen()
Dim varAntwort
varAntwort = Application.InputBox("Spalte löschen", Type:=2)
If Not varAntwort = "" Then
If varAntwort <> False Then
On Error Resume Next
Columns(varAntwort).Delete
End If
Call Spalte_löschen
Else: Call links
End If
End Sub

Sub links()
Dim varAntwort
varAntwort = Application.InputBox("links Spalte einfügen", Type:=2)
If Not varAntwort = "" Then
If varAntwort <> False Then
On Error Resume Next
Columns(varAntwort).Insert Shift:=xlToLeft
End If
Call links
Else: Call prozent
End If
End Sub

Sub prozent()
Dim varAntwort
Dim Zelle As Variant
varAntwort = Application.InputBox("Prozentformat Spalte?", Type:=2)
If Not varAntwort = "" Then
If varAntwort <> False Then
On Error Resume Next
For Each Zelle In Columns(varAntwort).SpecialCells(xlCellTypeConstants, xlNumbers)
If Zelle.IsNumber Then
Zelle.Value = Zelle / 100
Zelle.NumberFormat = "0%"
End If
Next Zelle
Columns(varAntwort).EntireColumn.AutoFit
End If
Call prozent
End If
End Sub

Langer Rede kurzer Sinn:
Was muss ich ändern?

mfg
Wolfgang

2 Antworten

0 Punkte
Beantwortet von
Hi,

Kommentiere im Sub Start einmal folgende Zeile aus:


Application.ScreenUpdating = False


Dieser Befehl wirkt im Einzelschritt beim Debuggen nicht. Daher hast Du im Einzelschritt und im normalen Programmablauf auch ein unterschiedliches Erscheinungsbild. Willst Du dennoch dabei bleiben, um nicht für unnötige Unruhe auf dem Screen zu sorgen, dann würde ich vor jeder Inputbox das Update ein- und danach wieder ausschalten.
Am Beispiel "Spalte löschen" z.B. so:
Sub Spalte_löschen()
Dim varAntwort
Application.ScreenUpdating = True
varAntwort = Application.InputBox("Spalte löschen", Type:=2)
Application.ScreenUpdating = False
If Not varAntwort = "" Then
If varAntwort <> False Then
On Error Resume Next
Columns(varAntwort).Delete
End If
Call Spalte_löschen
Else: Call links
End If
End Sub


bye
malSchauen
0 Punkte
Beantwortet von Mitglied (926 Punkte)
Hallo malSchauen,
Danke für die Hilfe.
Die Befehle "Screenupdating True / False" habe ich jetzt vor und hinter jede InputBox gesetzt und nun läuft das ganze wie gewünscht. Aber warum das verstehe ich nicht.
mfg
Wolfgang
...