Stehe vor einem Problem und weiss nicht weiter, wäre dankbar wenn mir jemand weiterhelfen könnte !
Starte aus einem Chart folgenden Code und erhalte immer folgende
Fehlermeldung: „Methode ‚Cells‘ of object’ _Global’ failed“
For i = 10 To 20
j = 0
For Each Zelle In Worksheets("Sheet1").Range(Cells(5, i), Cells(50, i))
If Zelle.Value = "Januar" Then j = j + 1
Next Zelle
Worksheets("Sheet1").Cells(2, i) = j
Next i
Es liegt definitiv am .Range(Cells…), denn mit Range(„E5:E50“) funktioniert alles. Aber so kann ich keine Schleife laufen lassen.
Starte aus einem Chart folgenden Code und erhalte immer
folgende
Fehlermeldung: „Methode ‚Cells‘ of object’ _Global’ failed“
Ja, das ist logisch…
For i = 10 To 20
j = 0
For Each Zelle In Worksheets(„Sheet1“).Range(Cells(5, i),
Cells(50, i))
…denn das Chart-Objekt enthält kein Cells()-Element auf das sich der Code beziehen könnte.
Es liegt definitiv am .Range(Cells…), denn mit
Range(„E5:E50“) funktioniert alles. Aber so kann ich keine
Schleife laufen lassen.
Du musst auch die Cells()-Anweisung sauber referenzieren, damit das zuverlässig klappt (beachte die Punkte vor ‚Range()‘ und Cells()):
For i = 10 To 20
j = 0
With Worksheets("Sheet1")
For Each Zelle In .Range(.Cells(5, i), .Cells(50, i))
If Zelle.Value = "Januar" Then j = j + 1
Next Zelle
.Cells(2, i) = j
End With
Next i
For i = 10 To 20
j = 0
For Each Zelle In Worksheets(„Sheet1“).Range(Cells(5, i),
Cells(50, i))
If Zelle.Value = „Januar“ Then j = j + 1
Next Zelle
Worksheets(„Sheet1“).Cells(2, i) = j
Next i
Es liegt definitiv am .Range(Cells…), denn mit
Range(„E5:E50“) funktioniert alles. Aber so kann ich keine
Schleife laufen lassen.
Hallo Snetto,
für was eine Schleife? Probiers mal wie folgend. GGfs. kannst du noch das Hochkomma entfernen, dann verschwinden die Formeln nach Benutzung.
Sub Jan()
Worksheets("Sheet1").Range("J2:T2").FormulaLocal = "=Zählenwenn(J5:T50;""Januar"")"
'Worksheets("Sheet1").Range("J2:T2").Value = Worksheets("Sheet1").Range("J2:T2").Value
End Sub
bzw.:
Sub Jan2()
With Worksheets("Sheet1").Range("J2:T2")
.FormulaLocal = "=Zählenwenn(J5:T50;""Januar"")"
'.Value = .Value
End With
End Sub
Die For-Next Schleife, die überprüft wieviele Daten auf die X-Achse kommen sollen. Darum arbeite ich mit Cells und setzte denn Range nicht einfach mit Range("…:…") fest.
Die For-Next Schleife, die überprüft wieviele Daten auf die
X-Achse kommen sollen. Darum arbeite ich mit Cells und setzte
denn Range nicht einfach mit Range("…:…") fest.
Hallo Snetto,
ich meinte die Frage so, warum eigentlich eine Schleife, du klapperst da Zellen ab, zählst wie oft da „Januar“ steht und schreibst das in eine Zelle, das kann „Zählenwenn“ auch und schneller.
Du schreibst „Starte aus einem Chart folgenden Code…“, das kann zwei Dinge bedeuten, das aktive Blatt ist ein Diagrammblatt.
Dann gibts Ärger mit Range oder Cells weil ein Diagrammblatt sowas nicht hat.
Oder du hast grad beim Codestart ein Diagramm in einem Blatt selektiert, dann gibts gelegentlich auch Ärger.
Dem Ärger weichst du aus, in dem du sauber referenzierst wie Thomas schon schrieb.
Und grundsätzlich kann man For-Next-Schleifen auch für range() laufen lassen genauso wie mit Cells(). Cells() ist halt einfacher zu handhaben wegen den Spaltenbuchstabenbezeichnungen bei Range().
Andererseits, manche nicht so Vba-Gewöhnte Anfrager hier, lesen, verstehen, sowas lieber/leichter:
For X = 1 to 100
MsgBox Range("D" & x)
next X
als:
For X = 1 to 100
MsgBox Cells(x,4)
next X
ich meinte die Frage so, warum eigentlich eine Schleife, du
klapperst da Zellen ab, zählst wie oft da „Januar“ steht und
schreibst das in eine Zelle, das kann „Zählenwenn“ auch und
schneller.
Da hast Du absolut recht, so habe ich es am Schluss auch gemacht
Du schreibst „Starte aus einem Chart folgenden Code…“, das
kann zwei Dinge bedeuten, das aktive Blatt ist ein
Diagrammblatt.
Dann gibts Ärger mit Range oder Cells weil ein Diagrammblatt
sowas nicht hat.
Jep… das hatte ich dann gemerkt, Thomas hat mich zu dem Punkt sehr gut aufgeklärt.
Oder du hast grad beim Codestart ein Diagramm in einem Blatt
selektiert, dann gibts gelegentlich auch Ärger.
Genau, definitv weniger
Dem Ärger weichst du aus, in dem du sauber referenzierst wie
Thomas schon schrieb.
Gar nicht so einfach… beim ersten mal !
Und grundsätzlich kann man For-Next-Schleifen auch für range()
laufen lassen genauso wie mit Cells(). Cells() ist halt
einfacher zu handhaben wegen den
Spaltenbuchstabenbezeichnungen bei Range()
Ahja… wieder was gelernt. Cool
Aber wie kann man „D“ erweitern, for i = A To Z geht ja kaum, oder ?
muss ich mal testen.
Andererseits, manche nicht so Vba-Gewöhnte Anfrager hier,
lesen, verstehen, sowas lieber/leichter:
Und grundsätzlich kann man For-Next-Schleifen auch für range()
laufen lassen genauso wie mit Cells(). Cells() ist halt
einfacher zu handhaben wegen den
Spaltenbuchstabenbezeichnungen bei Range()
Aber wie kann man „D“ erweitern, for i = A To Z geht ja kaum,
oder ?
naja, gemeinhin nimmt man sowieso eher Cells als Range, ist möglicherweise auch schneller.
Range dann ggfs. mal für Zeilen
also Range(„D“ & i)
ansonsten muß mna halt rumtricksen:
Sub AlleSpalten()
Dim i
For i = 10 To 30
Range(Spalte(i) & 2).Value = i
Next i
End Sub
'
Sub SpaltenA\_Z()
Dim i
For i = 10 To 27 'J-Z
Range(Chr(64 + i - 1) & 2).Value = i
Next i
End Sub
'
Function Spalte(ByVal Zahl As Integer) As String
Spalte = Split(Cells(1, Zahl).Address, "$")(1)
End Function
Sub AlleSpalten()
Dim i
For i = 10 To 30
Range(Spalte(i) & 2).Value = i
Next i
End Sub
’
Sub SpaltenA_Z()
Dim i
For i = 10 To 27 'J-Z
Range(Chr(64 + i - 1) & 2).Value = i
Next i
End Sub
’
Function Spalte(ByVal Zahl As Integer) As String
Spalte = Split(Cells(1, Zahl).Address, „$“)(1)
End Function
krass… aber wenns einfach geht… bleiben wir bei einfach !
Und grundsätzlich kann man For-Next-Schleifen auch für range()
laufen lassen genauso wie mit Cells().
Aber wie kann man „D“ erweitern, for i = A To Z geht ja kaum,
oder ?
naja, gemeinhin nimmt man sowieso eher Cells als Range
Das halte ich für ein (unbestätigtes) Gerücht…
ansonsten muß mna halt rumtricksen:
Sub SpaltenA_Z()
Dim i
For i = 10 To 27 'J-Z
Range(Chr(64 + i - 1) & 2).Value = i
Next i
End Sub
Warum nicht einfach mit den Objekten arbeiten, statt sie abzuzählen?
Sub tr\_SpaltenA\_Z()
Dim rngZelle As Range
For Each rngZelle In Range("J5:Z5") 'so weiss ich welche Zelle bearbeitet wird
rngZelle.Value = rngZelle.Column
Next rngZelle
End Sub
naja, gemeinhin nimmt man sowieso eher Cells als Range
Das halte ich für ein (unbestätigtes) Gerücht…
sicher ist das unbestätigt, ist ja nicht mal ein Gerücht, mehr nur mein Eindruck vom Mitlesen in Codes
Soll das heißen, mal beim Beispiel bleibend, für eine Schleife über 100 Spalten benutzt du oft „Range“?
Sub tr_SpaltenA_Z()
Dim rngZelle As Range
For Each rngZelle In Range(„J5:Z5“) 'so weiss ich welche
Zelle bearbeitet wird
rngZelle.Value = rngZelle.Column
Next rngZelle
End Sub
Okay, wie angedeutet, ist das besser, das kann ja dann wohl jeder auf andere Bereiche abändern, der nur die A1-Schreibweise in Excel kann und bei Cells() Deutungs/Anpassungsschwierigkeiten bekommt.
Soll das heißen, mal beim Beispiel bleibend, für eine Schleife
über 100 Spalten benutzt du oft „Range“?
Sagen wir mal so - ich versuche möglichst direkt mit den Objekten zu arbeiten statt sie abzuzählen und die ermittelten Werte dann wieder in ein Objekt zu überführen.
…aber warte nur eine Weile und ich behaupte das genaue Gegenteil…
Sub tr_SpaltenA_Z()
Dim rngZelle As Range
For Each rngZelle In Range(„J5:Z5“) 'so weiss ich welche
Zelle bearbeitet wird
rngZelle.Value = rngZelle.Column
Next rngZelle
End Sub
Okay, wie angedeutet, ist das besser, das kann ja dann wohl
jeder auf andere Bereiche abändern, der nur die
A1-Schreibweise in Excel kann und bei Cells()
Deutungs/Anpassungsschwierigkeiten bekommt.
Mir liegt diese Schreibweise näher, aber das ist mit Sicherheit eine persönliche Präferenz die nicht von allen geteilt wird (was auch nicht problematisch ist).