Clever-Excel-Forum

Normale Version: VBA - dynamischer Code
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

ich würde den Code gerne etwas dynamischer gestalten.

Aktuell und funktionierend: 
Code:
ws2.Cells(x, ersteSpalte).Value = Application.WorksheetFunction.SumIfs(ws.Range("X6:X20000"), ws.Range("R6:R20000"), SuchBegriffDE(I))

Da sich die Tabelle ständig ändern kann würde ich statt X gerne eine Variable nutzen. Habe bereits ein Hilfsblatt gemacht, wo ich die Spalte immer genau nachvollziehen kann.
Ich lese bereits die Spalte als Integer in die Variablen Spaltenindex1, Spaltenindex2 ein.
Code:
ws2.Cells(x, ersteSpalte).Value = Application.WorksheetFunction.SumIfs(ws.Range(Cells(7, Spaltenindex1), Cells(20000, Spaltenindex1)), ws.Range(Cells(7, Spaltenindex2), Cells(20000, Spaltenindex2), SuchBegriffDE(I))
Leider bekomme ich einen Fehler bei der Range.
Habe eigentlich schön öfter Range(Cells(),Cells()) ohne Probleme genutzt. 

Vielen Dank!
Hi

Auf jeden Fall fehlt erst mal für die zweite Range eine )
Siehe rot.
Ob das schon alles war wird sich zeigen.

ws2.Cells(x, ersteSpalte).Value = Application.WorksheetFunction.SumIfs(ws.Range(Cells(7, Spaltenindex1), Cells(20000, Spaltenindex1)), ws.Range(Cells(7, Spaltenindex2), Cells(20000, Spaltenindex2)), SuchBegriffDE(I))

Gruß Elex
Hallo

Zitat:
Code:
ws.Range("X6:X20000"), ws.Range("R6:R20000")


Ich benutze in solchen Fällen gerne die Variablen Bereich1, Bereich2 und kann die vorher mit Resize festlegen
Bereich1 = ws.Cells(z, Spaltenindex1).Resize(20000, 1)   Resize vergrößert einen Rangebereich wie bei Cells(z,s)  z=Zeile, S=Spalte
Bereich2 = ws.Cells(z, Spaltenindex2).Resize(20000, 1)   Tipp: Statt immer 20000 kann man auch in der Spalte 1+2 vorher die LastZell ermitteln!

Lz1 =  ws.Cells(Rows.Count, Spaltenindex1).End(xlUp).Row     So sieht die verkürzte Variante aus, das gleiche für Bereich2
Bereich1 = ws.Cells(z, Spaltenindex1).Resize(Lz1, 1) 

mfg Gast 123
(25.02.2022, 13:00)Elex schrieb: [ -> ]Hi

Auf jeden Fall fehlt erst mal für die zweite Range eine )
Siehe rot.
Ob das schon alles war wird sich zeigen.

ws2.Cells(x, ersteSpalte).Value = Application.WorksheetFunction.SumIfs(ws.Range(Cells(7, Spaltenindex1), Cells(20000, Spaltenindex1)), ws.Range(Cells(7, Spaltenindex2), Cells(20000, Spaltenindex2)), SuchBegriffDE(I))

Gruß Elex

Hallo Elex,

danke für deine Antwort. Im Code selbst sind dort zwei geschlossene Klammern.
Als ich den Variablennamen für CEF geändert habe, habe ich wohl leider ausversehen eine gelöscht.
Leider ist es nicht das Problem.

Wenn ich im Debug Modus über die Range hover gibt er mir aus:
"Die Methode 'Range' für das Objekt '_Worksheet' ist.."
Dann Prüfe mal den Inhalt der beiden Variablen (Spaltenindex...).
Für weitere Hilfen wäre dann die Datei gut.

Gruß Elex
Verwende VBA wenn du in VBA arbeitest.
Verwende Excel Formel wenn du in Excel arbeitest.

In VBA
Code:
Sub M_snb()
    sn = Cells(1).CurrentRegion
    a = 24
    b = 18
   
    For j = 1 To UBound(sn)
      If sn(j, a) = c00 Then y = y + sn(j, b)
    Next
   
    MsgBox y
End Sub
In Excel

in G1: 24 (Suchspalte)
in H1: 18 (Summierspalte)
In I1: 200 (Suchbegriff)

In A1:
PHP-Code:
=SUMIF(INDEX($A$7:$Z$2000;0;G1);$I$1;INDEX($A$7:$Z$2000;0;$H$1)) 
oder
PHP-Code:
=SUMPRODUCT((INDEX($A$7:$Z$2000;0;$G$1)=$I$1)*(INDEX($A$7:$Z$2000;0;$H$1)))