Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Inhaltsverzeichnis

Frage zu With Sheets()

Forumthread: Frage zu With Sheets()

Frage zu With Sheets()
Daniel
Hallo,
wenn ich in einem Sub konkret bezug auf ein Sheet nehmen will, dann dachte ich dass es so geht:

Sub CheckOrderChanges(ByVal sheetName As String)
Sheets(sheetName).Range("A34").Value = "check order Changes was called"
Dim Zeile As Integer
Dim K As Integer
If (calculating) Then Exit Sub
calculating = True
Sheets(sheetName).Range("A35").Value = "check order Changes was called 2"
With Sheets(sheetName)
For K = 8 To 16
If K = 12 Then K = K + 1 'Skip the "SL Orders" row
If Not IsError(Range("K" & K).Value) Then
If Range("K" & K).Value = "" Then
Range("E" & K).Value = Range("L2").Value
End If
End If
Next K
End With
Das Sub wird nun aufgerufen, wenn ich in einem anderen Tabellenblatt bin. Der Code wird allerdings auf dem selektieren Blatt angewendet und nicht auf dem übergebenen. Reicht With Sheets() dafür nicht aus?
Muss ich jedesmal Sheets(sheetName).Range benutzen, um auf der sicheren Seite zu sein?
Danke,
Daniel
Anzeige

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

Betreff
Benutzer
Anzeige
AW: Frage zu With Sheets()
17.02.2011 11:20:11
Hajo_Zi
Hallo Daniel,
vor Range gehört dann aber ein Punkt.

AW: Frage zu With Sheets()
17.02.2011 11:20:36
Daniel
Ahh. Daran liegt´s dann wohl. Danke Hajo!
AW: Frage zu With Sheets()
17.02.2011 11:35:51
Daniel
kurze Anschlussfrage:
ich übergebe an eine Funktion folgende Adresse. Das kann sich aber auf verschiedene Sheets beziehen.
Gibt es eine Möglichkeit dem .Address auch das genaue Sheet mitzugeben?
.Range("A38").Value = .Range("B" & Zeile).Address

Anzeige
Adresse mit Blattname
17.02.2011 11:44:29
Erich
Hi Daniel,
Address hat so einige Parameter. Schau mal in die VBA-Hilfe.
Probier mal
.Range("A38").Value = .Range("B" & Zeile).Address(,,,1)
entspricht
.Range("A38").Value = .Range("B" & Zeile).Address(True,True,xlA1,True)
Wenn das zuvuiel ist (hier kommt auch der Mappenname mit): Was genau soll in die Zelle?
Möglich wäre z. B.
.Range("A38").Value = sheetName & "!" & .Range("B" & Zeile).Address
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Adresse mit Blattname
17.02.2011 12:22:39
Daniel
Ich übergebe den Wert an eine Funktion, und die muss wissen in welchem Worksheet das ist. Ich werde das aber einfacher über einen weiteren Parameter für die Funktion einbinden. Danke für die Hilfe!
Codevorschlag
17.02.2011 11:37:37
Erich
Hi Daniel,
Hajo hat das mit dem Punkt ja schon geschrieben.
Vielleicht kannst du hiermit noch etwas anfangen:

Sub CheckOrderChanges(ByVal sheetName As String)
Dim lngZ As Long              ' Zeilen und Spalten besser als Long
Dim calculating As Boolean
With Sheets(sheetName)
.Cells(34, 1).Value = "check order Changes was called"   ' A34
If calculating Then Exit Sub
calculating = True
.Cells(35, 1).Value = "check order Changes was called 2" ' A35
For lngZ = 8 To 16
If lngZ = 12 Then lngZ = lngZ + 1 'Skip the "SL Orders" row
If Not IsError(.Cells(lngZ, 11).Value) Then           ' Knn
If .Cells(lngZ, 11).Value = "" Then _
.Cells(lngZ, 11).Value = .Cells(2, 12).Value    '  =L2
End If
Next lngZ
End With
End Sub

Das hier war eine Vorstufe davon - mit ein paar Kommentaren:

Sub CheckOrderChangesALT(ByVal sheetName As String)
Dim K As Integer                 ' Deklarationen besser ganz oben
Dim calculating As Boolean       ' Wo kommt das her?
'   Dim Zeile As Integer            ' Zeile kommt gar nicht vor
With Sheets(sheetName)
.Range("A34").Value = "check order Changes was called"
If calculating Then Exit Sub
calculating = True
.Range("A35").Value = "check order Changes was called 2"
For K = 8 To 16
If K = 12 Then K = K + 1 'Skip the "SL Orders" row
If Not IsError(Range("K" & K).Value) Then
If .Range("K" & K).Value = "" Then
.Range("E" & K).Value = .Range("L2").Value
End If
End If
Next K
End With
End Sub
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Codevorschlag
17.02.2011 11:44:25
Daniel
Hallo Erich,
es war nur ein Codeausschnitt des Subs, daher kommt manches nicht vor.
Hätte ich vorher erwähnen sollen.
Ist es denn besser .Cells zu verwenden? Wenn ja: warum?
Ich fand Range beim Entwerfen des Codes immer einfacher, weil leichter aus der Tabelle zu lesen.
Also Zeilen und Spalten Counter lieber Long statt Integer? Weshalb das?
Gruß
Daniel
Anzeige
Cells und Long
17.02.2011 11:59:12
Erich
Hi Daniel,
wenn man so mit Cells arbeitet, vermeidet man Konvertierungen, die bei Range("A" & x) nötig sind.
Bei Range("A" & x) muss erst mal ein String zusammengefügt werden, dann werden aus dem Adress-String
"A5" Zeile und Spalte der Zelle ermittelt. Bei Cells(x,y) gibt man die beiden direkt an.
Und man kann sehr schön mit den Spalten(nummern) rechnen, darüber Schlaifen laufen lassen usw.
Die Spaltenbuchstaben im Code sind wohl zunächst etwas sprechender.
Aber glaube mir: Man gewöhnt sich sehr schnell an die Zahlen und das Cells.
Warum nicht Integer? Integer geht nur bis 32767. es gibt aber mehr Zeilen.
Und dann kann es schon mal zu einem Überlauf kommen.
Ein weiterer Grund: Excel/VBA arbeitet an dieser Stelle selbst mit Long-Variablen.
Deklarierst du als Integer, muss Excel/VBA deine Integer-Zahl immer erst mal in eine Long konvertieren.
Rückmeldung wäre nett! - Grüße von Erich aus Kamp-Lintfort
Anzeige
AW: Cells und Long
17.02.2011 12:26:48
Daniel
Okay, das hört sich logisch und effizienter an! Ich werde versuchen das zukünftig anzupassen. Danke.
;
Anzeige

Infobox / Tutorial

Mit VBA und Sheets arbeiten: Tipps und Tricks


Schritt-für-Schritt-Anleitung

  1. Subroutine erstellen: Beginne mit der Erstellung einer Subroutine, die ein Sheet anhand seines Namens bearbeitet. Verwende dazu den With Sheets(sheetName)-Befehl, um den Code auf das spezifische Blatt zu konzentrieren.

    Sub CheckOrderChanges(ByVal sheetName As String)
        Dim calculating As Boolean
        With Sheets(sheetName)
            .Range("A34").Value = "check order Changes was called"
            If calculating Then Exit Sub
            calculating = True
            .Range("A35").Value = "check order Changes was called 2"
            ' Weitere Verarbeitung...
        End With
    End Sub
  2. Range und Cells verwenden: Achte darauf, die richtige Syntax zu verwenden. Wenn Du Range innerhalb eines With-Blocks verwendest, setze einen Punkt davor.

    With Sheets(sheetName)
        .Range("A1").Value = "Hello"
    End With
  3. Zugriff auf Zellwerte: Um mit Zellwerten zu arbeiten, verwende Cells statt Range, da dies oft effizienter ist und du so Überlaufprobleme mit Integer-Variablen vermeiden kannst.

    Dim lngZ As Long
    For lngZ = 1 To 10
        .Cells(lngZ, 1).Value = "Test"
    Next lngZ

Häufige Fehler und Lösungen

  • Fehler: Falsches Blatt bearbeitet: Wenn Du den Code auf einem anderen Blatt ausführst, achte darauf, dass Du den richtigen Bezug zum sheetName hast. Wenn Du den Punkt vor Range oder Cells vergisst, wird das aktive Blatt verwendet.

  • Lösung: Immer den Punkt verwenden, wenn Du auf Range oder Cells innerhalb eines With Sheets(sheetName)-Blocks zugreifst.


Alternative Methoden

  • Verwendung von Worksheets: Du kannst auch Worksheets anstelle von Sheets verwenden, um sicherzustellen, dass Du nur auf Arbeitsblätter und nicht auf Diagramme zugreifst.

    With Worksheets(sheetName)
        .Range("A1").Value = "Alternative"
    End With
  • Direkter Zugriff: Wenn Du nicht in einer Subroutine bist, kannst Du auch direkt auf das Sheet zugreifen, indem Du ThisWorkbook.Worksheets(sheetName) verwendest.


Praktische Beispiele

Hier ist ein vollständiges Beispiel, das zeigt, wie Du mit VBA und Sheets arbeiten kannst, um Daten in einem bestimmten Sheet zu aktualisieren:

Sub UpdateSheetData(ByVal sheetName As String)
    Dim lngRow As Long
    Dim calculating As Boolean
    With Sheets(sheetName)
        .Cells(1, 1).Value = "Daten aktualisiert am: " & Now
        For lngRow = 2 To 10
            If .Cells(lngRow, 2).Value = "" Then
                .Cells(lngRow, 2).Value = "Leer"
            End If
        Next lngRow
    End With
End Sub

Tipps für Profis

  • Verwende Long statt Integer: Bei der Deklaration von Variablen, die Zeilen- oder Spaltennummern enthalten, ist es besser, Long zu verwenden, da Excel mehr als 32.767 Zeilen hat und Integer bei größeren Zahlen zu Überläufen führen kann.

  • Sei vorsichtig mit .Address: Wenn Du Zelladressen in Strings einfügst, achte darauf, dass Du den Blattnamen korrekt angibst. Verwende die Adresse in der Form sheetName & "!" & .Range("B" & Zeile).Address.


FAQ: Häufige Fragen

1. Frage Was ist der Unterschied zwischen Sheets und Worksheets in VBA?

Antwort: Sheets kann sowohl Arbeitsblätter als auch Diagramme enthalten, während Worksheets nur auf Arbeitsblätter zugreift.

2. Frage Warum sollte ich Cells anstelle von Range verwenden?

Antwort: Cells ist oft effizienter, da Du direkt Zeilen- und Spaltennummern angibst, ohne einen String zusammenstellen zu müssen. Dies kann die Leistung verbessern und Fehler vermeiden.

3. Frage Wie kann ich sicherstellen, dass mein Code auf dem richtigen Blatt ausgeführt wird?

Antwort: Stelle sicher, dass Du den Punkt vor Range oder Cells innerhalb eines With Sheets(sheetName)-Blocks verwendest, um sicherzustellen, dass Du auf das richtige Blatt zugreifst.

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Entdecke mehr
Finde genau, was du suchst

Die erweiterte Suchfunktion hilft dir, gezielt die besten Antworten zu finden

Suche nach den besten Antworten
Unsere beliebtesten Threads

Entdecke unsere meistgeklickten Beiträge in der Google Suche

Top 100 Threads jetzt ansehen
Anzeige