ich bin VBA-Neuling und versuche verzweifelt folgende Funktion auf "Bereiche zu erweitern". Die Funktion prüft ob "sTextSoll" in "sTextIst" enthalten ist. Falls ja wird "iData" zurückgegeben andernfalls 0. Function EnthaeltText(iData As Integer, sTextIst As String, sTextSoll As String) As Double EnthaeltText = 0 If InStr(sTextIst, sTextSoll) > 0 Then EnthaeltText = iData End If End Function Die Funktion soll jetzt so erweitert werden dass sie über mehrere Zeilen die Summe bildet. Die Formel soll in Excel z.B. so aufgerufen werden =EnthaeltText(A1:10;B1:10;C1) Function EnthaeltText(iData As Range, sTextIst As Range, sTextSoll As String) As Double EnthaeltText = 0 ' Loop für jede Zeile If InStr(sTextIst, sTextSoll) > 0 Then EnthaeltText = EnthaeltText + iData End If 'Ende Loop End Function Ich weis nicht wie ich die Schleife umsetzen soll. Die Anzahl der Zeilen müsste für "iData" und "sTextIst" natürlich gleich. Wäre aber super wenn die Funktion auch funktionieren würde wenn unterschiedliche Bereiche angegeben werden. Ich denke dann sollte die Schleife nur über den kleineren Bereich Zählen Vielen Dank!
Geduld will bei dem Werke sein. Du hättest in den knapp zwei Stunden die Hilfe über Eigenschaften und Objekte eines Range befragen können. Da findet man u.a. auch rows().count.
Was macht iData vom Typ Integer und die Rückgabe vom Typ Double? iData im 2.Beispiel ein Range-Objekt, soll vermutl. der zu durchsuchende Bereich sein. Wie bzw. in welcher Form kommt die Bereichsangabe zustande? Durch Festlegung als Konstante "...", Markierungen in Tabelle (Selection)? Eine Möglichkeit gibt es sicher durch Bereichsabfrage mit For-Each-Schleife. Was soll mit den gefundenen Strings passieren? Sollen die z.B. gezählt oder gelöscht werden? Müssen die Stringpositionen bzw. Adressen der Zellen zurückgegeben werden? Wann soll die Funktion aufgerufen werden? Sofort nach Eingabe/Änderung einer Zelle oder erst bei Aufruf durch Benutzer?
Sowas geht übrigens auch Worksheet : =getrange(F7:I18) Makro: Public Function getrange(i As Range) As Double Dim o As Range For Each o In i.Rows For Each o2 In o.Columns Debug.Print o2.Value Next Next End Function oder so Public Function getrange(i As Range) As Double Dim o As Range For Each o In i.Cells Debug.Print o.Value Next End Function Ist nicht wirklich vollständig funktionell und soll nur als Beispiel dienen.
:
Bearbeitet durch User
VBA_Stift schrieb:
> EnthaeltText = EnthaeltText + iData
Funktioniert nicht, weil EnthaeltText eine Funktion ist und rechts vom
Gleichheitszeichen die Funktionsargumente fehlen. Der rekursive Aufruf
würde auch zum Stacküberlauf führen, sobald der gesuchte String mind.
einmal im durchsuchten Bereich gefunden wird. Hier ein Codebeispiel, das
hoffentlich weiterhilft. Möglich wäre auch, Bereiche in der Tabelle zu
markieren und die Suche zu starten, wobei das Makro markierte Zellen
selbst herausfindet. Diese Option habe ich hier mal weggelassen.
1 | Option Explicit |
2 | ' VB-Konstanten, Such-/Vergleichsmodus: vbBinaryCompare = Binärvergleich |
3 | ' vbTextCompare = Textvergleich, nicht case-sensitiv |
4 | |
5 | ' Zu durchsuchende Bereiche, z.B. Ausschnitte aus Rechteck A1...C20 |
6 | Const Bereichliste$ = "A1:A8, B5:B12, C9:C16, A17:C19" |
7 | |
8 | Sub SuchTest() |
9 | ' Sucht das Wort "hallo" in den Bereichen aus der o.g. Liste |
10 | Dim iData As Integer, Bereich As Range, SuchStrg$, Modus As Long |
11 | Dim Result As Double |
12 | iData = 1: SuchStrg$ = "hallo": Modus = vbTextCompare |
13 | Set Bereich = Worksheets("Tabelle1").Range(Bereichliste$) |
14 | Result = ForEachSuche(iData, Bereich, SuchStrg, Modus, True) |
15 | ' Alternative zu vorhergehenden beiden Zeilen: |
16 | ' Result = ForEachSuche(iData, Worksheets("Tabelle1").Range(Bereichliste$), _ |
17 | SuchStrg, Modus, True) |
18 | MsgBox "Textsuche, Rückgabe=" & Str(Result) |
19 | End Sub |
20 | |
21 | Function ForEachSuche(iData As Integer, Bereich As Range, Strg$, Modus As Long, _ |
22 | TrimSpaces As Boolean) As Double |
23 | ' Durchsucht den Bereich nach dem Suchstring Strg$. Bei TrimSpaces=True |
24 | ' werden Leerzeichen vor u. nach dem Text nicht berücksichtigt. |
25 | Dim c As Range, i As Integer, n As Double, v$ |
26 | n = 0: If TrimSpaces Then Strg$ = Trim(Strg$) |
27 | For Each c In Bereich |
28 | v$ = c.Value: If TrimSpaces Then v$ = Trim(v$) |
29 | If InStr(1, v$, Strg$, Modus) > 0 Then n = n + iData |
30 | Next: ForEachSuche = n |
31 | End Function |
PS: Falls der Suchstring leer ist, wird jede nicht leere Zelle als gefundener String gewertet. Da müßte noch etwas geändert werden.
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.