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.
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.
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.