2017-04-13 8 views
2

Ich habe folgenden Code erstellt. Das Makro sollte einfach die Zellen A2: G3000 mit 1 multiplizieren, damit sich das Format von einem Text zu einer Zahl ändert. Das Makro, das ich geschrieben habe, tut dies, aber nur für das aktive Arbeitsblatt. Ich habe die For Each/Next-Schleife verwendet, wie ich sie gelernt habe.For Each/Next Loop durchläuft nicht alle Arbeitsblätter

Könnte jemand mir helfen, meinen Fehler im Code zu finden?

Sub Format_Change() 

Dim sht As Worksheet 

For Each sht In Worksheets 
    Range("M2").Select 
    ActiveCell.FormulaR1C1 = "=RC[-12]*1" 
    Range("M2").Select 
    Selection.AutoFill Destination:=Range("M2:W2"), Type:=xlFillDefault 
    Range("M2:W2").Select 
    Selection.AutoFill Destination:=Range("M2:W3000"), Type:=xlFillDefault 
    Range("M2:W3000").Select 
    Selection.Copy 
    Range("A2").Select 
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
    :=False, Transpose:=False 
    Range("M2").Select 
    Range(Selection, Selection.End(xlDown)).Select 
    Range(Selection, Selection.End(xlToRight)).Select 
    Application.CutCopyMode = False 
    Selection.ClearContents 
Next sht 

End Sub 

Antwort

5

den Code unten Versuchen Sie, wie @Vityata erwähnt, gibt es wirklich keine Notwendigkeit, so viele Select und Selection zu verwenden, ist es den Code unten eine Menge verlangsamt.

die Code-Version Versuchen Sie unter:

Option Explicit 

Sub Format_Change() 

Dim sht As Worksheet 

For Each sht In Worksheets 
    With sht 
     .Range("M2").FormulaR1C1 = "=RC[-12]*1" 
     .Range("M2").AutoFill Destination:=.Range("M2:W2"), Type:=xlFillDefault 
     .Range("M2:W2").AutoFill Destination:=.Range("M2:W3000"), Type:=xlFillDefault 
     .Range("M2:W3000").Copy 
     .Range("A2").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
      :=False, Transpose:=False 
     Application.CutCopyMode = False 
     .Range(.Range("M2"), .Range("M2").CurrentRegion).ClearContents 
    End With 
Next sht 

End Sub 
+1

+1, aber was ist, wenn das OP sehen wollte, dass sich die Seiten ändern und der Job erledigt wird? Es gibt ein schönes Gefühl, eine Excel-Datei "arbeiten" zu lassen ... Ohne das 'select' siehst du nicht die' action' :) – Vityata

+0

@Vityata Das ist ein gutes;) –

+2

@Vityata Yeah, du sitzt vorne von Ihrer Frontlader-Waschmaschine und Mikrowelle, nur um sie zu beenden? –

2

Im Allgemeinen ist der Code nicht gut, weil es zu viel Auswahl und usw. verwendet, lesen Sie hier How to avoid using Select in Excel VBA macros. Wenn Sie es jedoch zu einem laufenden machen möchten, fügen Sie einfach sht.Select nach der for-each-Schleife hinzu.

Option Explicit 


Sub Format_Change() 

    Dim sht As Worksheet 

    For Each sht In Worksheets 
     sht.Select 
     Range("M2").Select 
     ActiveCell.FormulaR1C1 = "=RC[-12]*1" 
     Range("M2").Select 
     Selection.AutoFill Destination:=Range("M2:W2"), Type:=xlFillDefault 
     Range("M2:W2").Select 
     Selection.AutoFill Destination:=Range("M2:W3000"), Type:=xlFillDefault 
     Range("M2:W3000").Select 
     Selection.Copy 
     Range("A2").Select 
     Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
      :=False, Transpose:=False 
     Range("M2").Select 
     Range(Selection, Selection.End(xlDown)).Select 
     Range(Selection, Selection.End(xlToRight)).Select 
     Application.CutCopyMode = False 
     Selection.ClearContents 
    Next sht 
End Sub 
+3

Nein, Nein, Nein, komm, du bist besser als das;) –

+1

@ShaiRado - Nicht heute + es funktioniert! – Vityata

+1

OK, +1, aber mein OCD ließ mich keine Antwort geben, ohne das 'Select' zu verwenden, hoffe, du verzeihst mir;) –