Clever-Excel-Forum

Normale Version: Formel per VBA dynamisch anpassen
Du siehst gerade eine vereinfachte Darstellung unserer Inhalte. Normale Ansicht mit richtiger Formatierung.
Hallo zusammen,

ich stehe schon wieder auf dem Schlauch: ich suche eine Möglichkeit, in VBA eine Formel "dynamisch" anzupassen; soll heißen: ich möchte die "festen" Bezeichner wie z.B. 'Range("I2:I"...' durch Zellbezüge in Form von "Cells(Row, Column)" ersetzen. Wie muss ich das umformen, so dass ich im Folgenden die Routine auch verwenden kann, wenn sich z.B. die E-Mail-Spalte ändert?


Code:
Sub SucheDoppelte()

    Dim Zelle As Range
    Dim EMail_Spalte As Integer
    Dim Doppelte_Spalte  As Integer

    EMail_Spalte = 8
    Doppelte_Spalte = 10

    For Each Zelle In Range("TNDaten").Columns(EMail_Spalte).Cells
        ' nur die folgende Zeile soll statt "I" "dynamisch" werden:
        If Application.CountIf(Range("I2:I" & Zelle.Row), Cells(Zelle.Row, 9)) > 1 Then
            Cells(Zelle.Row, Doppelte_Spalte) = "doppelt"
        End If
    Next

End Sub

Ich weiß, dass ich das Ganze per Formel direkt in den Zellen erledigen kann:

Code:
=WENN(ZÄHLENWENN(I$2:I2;I2)>1;"doppelt";"")

... aber ich brauche das als VBA-Routine.

Danke schon mal im Voraus.
Hallo,

du könntest die Spalten als Parameter übergeben, anstatt sie im Code fest zu schreiben.

Oder du suchst nach einer Überschrift, der betreffenden Spalte.

Ohne deine Datei angeschaut zu haben.
Hallöchen,

ich hab auch nicht in die Datei geschaut Sad Hier mal eine Range-Angabe, die sich aus Zellen zusammensetzt.

Range(Cells(a,b),Cells(e,f))


Alternativ könntest Du auch eine Cells Angabe nehmen und die Resizen

Cells(a,b).Resize(e,f)

wobei hier e und f keine Zeilennummer bzw. Spaltennummer ist wie im ersten Beispiel sondern die Anzahl Zeilen und Spalten.
Hallo,

@André
völlig sinnlos, was du das schreibst ... wenn sich seine Spalten verschieben sollten, dann weiß er eben genau diese Zellenzuordnung nicht.

@LuckyJoe
Habe mal in meinem Archiv gewühlt ... suchen der richtigen Überschrift könnte so aussehen ...

Code:
Public Function ColumnFromHeader(ByVal strSearch As String) As Integer
   Dim rngFound As Range
   
   Set rngFound = Rows(1).Find(What:=strSearch, LookIn:=xlValues, LookAt:=xlWhole)
   If Not rngFound Is Nothing Then
       ColumnFromHeader = rngFound.Column
   Else
       ColumnFromHeader = 0
   End If
End Function
Hi Sabina,

Zitat:völlig sinnlos, was du das schreibst ...

seh ich nicht so, sonst hätte ich es nicht geschrieben. Lies einfach nochmal die Aufgabenstellung und lass sie etwas einwirken :16:

Im Code steht

Zitat:EMail_Spalte = 8

Wenn nun aus der 8 eine 9 gemacht wird - auch das ist eine "Verschiebung", dann klappt das mit Range("I... nicht mehr. Siehe die Frage

Zitat:ich möchte die "festen" Bezeichner wie z.B. 'Range("I2:I"...' durch Zellbezüge in Form von "Cells(Row, Column)" ersetzen.
Hallo Sabina, hallo André,

zunächst einmal vielen Dank, dass ihr euch mit dem Problem beschäftigt habt. Eine Frage außerhalb des Themas: "Datei nicht angeschaut" ... weil es eine .xlsm ist? Ist das hier wegen der Makros nicht gewünscht? Wie kann ich das alternativ machen? Nur mit .xlsx-Dateien arbeiten und den Code dann hier im Text?

@Sabina: Danke für die Formel mit der Spaltenüberschrift, aber die hatte ich bereits - auch in meinem Beispiel, wo ich sie aber rausgenommen habe, um nicht unnötig Lesestoff zu produzieren.

Zum Thema: Grundsätzlich ist mir das Konstrukt mit "Cells(Zeile, Spalte)" bekannt, es geht mir um diese eine Zeile:

Code:
If Application.CountIf(Range("I2:I" & Zelle.Row), Cells(Zelle.Row, 9)) > 1 Then

Wie bekomme ich die damit hin?

Ich habe diese Routine im Herber-Forum gefunden und fand sie wegen der Kürze so charmant. Sonst müsste ich per VBA halt eine Routine schreiben, die mir in einer nicht sortierten Spalte doppelte Einträge markiert.

Danke nochmals für euer Mitdenken.
Hallöchen,

wenn ich denke, dass ich mit der Problembeschreibung zurecht komme, schaue ich nicht in eine Beispieldatei. Ich stehe nun mal auf ordentliche Beschreibungen und mit Tabellenausschnitten aufgehübschte Beiträge. Man muss, wenn man die Diskussionen verfolgt oder auch auf der Suche ist, nicht laufend Dateien runterladen, um zu schauen, was da eigentlich abgeht. Wenn da ein Thread nicht viel mehr Text enthält als "Problembeschreibung siehe Datei" und dann eine Datei x mal hin und her geht ist das auch nicht prickelnd.

Komplexere Problemstellungen gehen dagegen oftmals nicht ohne Beispiel.

Wenn ich mal eine Datei runterlade, dann mache ich sie meistens auch gleich direkt auf und speichere sie nicht ab. Irgendwann hat man so viel Müll auf der Platte und sieht nicht mehr durch, was eigentlich wichtig ist. Als Fragesteller geht es ja immer mal um eine einzelne Datei oder zwei oder .., aber als vielbeschäftigter Antworter können es hunderte, wenn nicht tausende werden, wenn man nicht aufpasst.

Ich finde, die werden viel zu häufig strapaziert. Ein Forum ist ja nun auch kein Up- und Downloadportal. Zuweilen hat man dann auch noch Dateien, die nicht unbedingt mehr Informationsgehalt haben als die schon magere Problembeschreibung im Thread …  Zuweilen bekommt man vielleicht noch eine Beispieldatei wo es um eine einzelne Formel geht - mal überspitzt in B1 muss =A1 rein …
Na ja, und ein bisschen kann der Fragesteller ja auch mitarbeiten, und sei es nur, um einen Code zu kopieren und an der passenden Stelle einzufügen. Eines unserer Ziele ist ja die Hilfe zur Selbsthilfe und da ist das sicher nicht zu viel verlangt. Wegen dem Hilfeanspruch kommt von mir auch häufig eine allgemeinere Antwort und man liest bei mir oft "im Prinzip" oder "ein Ansatz" … Ich verfolge damit auch ein bisschen das Ziel, dass eine allgemeinere Antwort, die eventuell noch die eine oder andere Erläuterung enthält, vielleicht anderen Suchenden eher hilft und den Fragesteller zum Mitdenken veranlasst als einfach nur immer fertige Lösungen hin und her zu schicken.

Aber da haben die Antworter auch unterschiedliche Ansichten dazu.


Nun zu Deiner fachlichen Frage, ich hatte das Prinzip ja schon beschrieben:

Range(Cells(2, EMail_Spalte), Cells(Zelle.Row, EMail_Spalte))
... jau, bin gerade von meinem Schlauch runtergeklettert und wollte mein Ergebnis hier mitteilen, da hast du es schon (quasi noch einmal) veröffentlicht. Danke! Ich hatte nicht gewusst, dass man ein "Range von:bis" auch so mit den "Cells" hinbekommt ... umso schöner Smile