Anzeige
Archiv - Navigation
1200to1204
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

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

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

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
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.

Beliebteste Forumthreads (12 Monate)

Anzeige

Beliebteste Forumthreads (12 Monate)

Anzeige
Anzeige
Anzeige