Frage von jakob199317, 40

VBA Listen filtern?

Wie kann ich folgenden Code kürzer Formulieren?

If Cells(2, 4) >= 3 Then Worksheets("Blatt1").Range("D2").Copy Destination:=Worksheets("Blatt1").Range("E2")
If Cells(3, 4) >= 3 Then Worksheets("Blatt1").Range("D3").Copy Destination:=Worksheets("Blatt1").Range("E3")
If Cells(4, 4) >= 3 Then Worksheets("Blatt1").Range("D4").Copy Destination:=Worksheets("Blatt1").Range("E4")
Expertenantwort
von Oubyi, Community-Experte für Excel, 17

Vielleicht etwas aufwendiger aber flexibler/ leichter anzupassen:

Sub testtest()
Dim rngCheck As Range
Dim Zelle As Range
Set rngCheck = Range("D2:D4")

With Worksheets("Blatt1")
For Each Zelle In rngCheck
If Zelle.Value >= 3 Then _
.Cells(Zelle.Row, Zelle.Column).Copy .Cells(Zelle.Row, Zelle.Column + 1)
Next Zelle
End With
End Sub

Voraussetzung ist allerdings, dass die Bereiche in beiden Blättern immer übereinstimmen. "D2:D4" und "Blatt1" kann hier leicht angepasst werden.

Hilft Dir das?

Expertenantwort
von Iamiam, Community-Experte für Excel, 11

Zusätzlich zu Schleife oder With geht anstatt

.Range("D2:D4")
diese Formulierung (ohne Gänsefüßchen!):
.[D2:D4]
Ging zumindest früher, aber: die [Klammer] wertet nicht aus, also Parameter darfst du so nicht verwenden: zB [Adressvariable] geht nicht
Expertenantwort
von Suboptimierer, Community-Experte für Excel, 37
Dim i As Integer
  For i=2 To 4
    If Cells(i, 4) >= 3 Then Worksheets("Blatt1").Range("D" & i).Copy Destination:=Worksheets("Blatt1").Range("E" & i)
Next

(ungetestet)

Okey, so ist es noch nicht kürzer. ^^ Das lohnt sich erst, wenn mehrere Zeilen abgearbeitet werden sollen.

Antwort
von EGitarre, 28
If Cells(2, 4;3 ,4;4 ,4) >= 3 Then Worksheets("Blatt1").Range("D2;D3;D4").Copy Destination:=Worksheets("Blatt1").Range("E2;E3;E4")
Kommentar von Suboptimierer ,

Nicht schlecht! Getestet und läuft?

Kommentar von EGitarre ,

Nicht getestet, aber soweit ich mich an meine Excel Zeit erinnere sollte es so gehen =D Kann aber auch genausogut falsch sein ='D

Kommentar von Ninombre ,

Ich habe es auch nicht getestet, hätte aber eine Vermutung....

Kommentar von Iamiam ,

wenn das läuft, genial!

Werde es in nächster Zeit mal testen, heute nicht mehr. Wäre wohl ein Matrixformel-Analog?

Das Destination:= kann man sich übrigens üblicherweise auch noch sparen

Kommentar von Iamiam ,

ich hab das jetzt doch noch getestet, aber es nicht zum laufen gekriegt. Stammt vllt aus einer anderen Sprache.

Was bei mitr läuft ist:

ActiveSheet.[D2:D4].Copy Worksheets("Blatt1").[E2:E4]

Aber da ist halt keine Prüfung dabei und wie gesagt, [...] wertet nicht aus, so dass man also nicht zB per Schleife mit Variabler i so arbeiten kann: ["D" & i & ":D" & i], das geht nur mit Range("D" & i & ":D" & i)

was ginge, wäre [E2].offset(i - 1, 0), aber das ist kaum kürzer als Range(..)

Keine passende Antwort gefunden?

Fragen Sie die Community

Weitere Fragen mit Antworten