Vermeidung von Select
y Activate
ist der Schritt, der Sie zu einem etwas besseren VBA-Entwickler macht. Ganz allgemein, Select
y Activate
werden bei der Aufzeichnung eines Makros verwendet, so dass die Parent
Arbeitsblatt oder Bereich wird immer als das aktive Arbeitsblatt betrachtet.
So können Sie vermeiden Select
y Activate
in den folgenden Fällen:
Hinzufügen eines neuen Arbeitsblatts und Kopieren einer Zelle darin:
Von (mit dem Makro-Recorder erzeugter Code):
Sub Makro2()
Range("B2").Select
Sheets.Add After:=ActiveSheet
Sheets("Tabelle1").Select
Sheets("Tabelle1").Name = "NewName"
ActiveCell.FormulaR1C1 = "12"
Range("B2").Select
Selection.Copy
Range("B3").Select
ActiveSheet.Paste
Application.CutCopyMode = False
End Sub
An:
Sub TestMe()
Dim ws As Worksheet
Set ws = Worksheets.Add
With ws
.Name = "NewName"
.Range("B2") = 12
.Range("B2").Copy Destination:=.Range("B3")
End With
End Sub
Wenn Sie einen Bereich zwischen Arbeitsblättern kopieren möchten:
Von:
Sheets("Source").Select
Columns("A:D").Select
Selection.Copy
Sheets("Target").Select
Columns("A:D").Select
ActiveSheet.Paste
An:
Worksheets("Source").Columns("A:D").Copy Destination:=Worksheets("Target").Range("a1")
Phantasievoll benannte Bereiche verwenden
Sie können auf sie zugreifen mit []
Das ist wirklich schön, verglichen mit dem anderen Weg. Überprüfen Sie sich selbst:
Dim Months As Range
Dim MonthlySales As Range
Set Months = Range("Months")
Set MonthlySales = Range("MonthlySales")
Set Months =[Months]
Set MonthlySales = [MonthlySales]
Das obige Beispiel würde wie folgt aussehen:
Worksheets("Source").Columns("A:D").Copy Destination:=Worksheets("Target").[A1]
Werte nicht kopieren, sondern übernehmen
Normalerweise, wenn Sie bereit sind select
Wenn Sie etwas nicht verstehen, kopieren Sie wahrscheinlich etwas. Wenn Sie nur an den Werten interessiert sind, ist dies eine gute Möglichkeit, die Auswahl zu vermeiden:
Range("B1:B6").Value = Range("A1:A6").Value
Versuchen Sie immer, auch auf das Arbeitsblatt zu verweisen
Dies ist wahrscheinlich der häufigste Fehler bei vba . Wenn Sie Bereiche kopieren, wird das Arbeitsblatt manchmal nicht referenziert, so dass VBA das falsche Blatt als aktives Arbeitsblatt betrachtet.
'This will work only if the 2. Worksheet is selected!
Public Sub TestMe()
Dim rng As Range
Set rng = Worksheets(2).Range(Cells(1, 1), Cells(2, 2)).Copy
End Sub
'This works always!
Public Sub TestMe2()
Dim rng As Range
With Worksheets(2)
.Range(.Cells(1, 1), .Cells(2, 2)).Copy
End With
End Sub
Kann ich wirklich niemals .Select
o .Activate
für irgendetwas?
- Ein gutes Beispiel dafür, wann es gerechtfertigt ist, die
.Activate
y .Select
ist, wenn Sie sicherstellen wollen, dass ein bestimmtes Arbeitsblatt aus optischen Gründen ausgewählt ist. Z.B., dass Ihr Excel immer mit dem zuerst ausgewählten Deckblatt geöffnet wird, unabhängig davon, welches Blatt beim Schließen der Datei das aktive Blatt war.
So etwas wie der folgende Code ist also absolut in Ordnung:
Private Sub Workbook_Open()
Worksheets("Cover").Activate
End Sub