Forum: PC-Programmierung EXCEL VBA Formelerweiterung auf Bereich


von VBA_Stift (Gast)


Lesenswert?

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!

von VBA_Stift (Gast)


Lesenswert?

kennt sich hier niemand mit VBA aus?

von jwg (Gast)


Lesenswert?

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.

von Rainer V. (rudi994)


Lesenswert?

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?

von Dennis H. (c-logic) Benutzerseite


Lesenswert?

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
von Rainer V. (rudi994)


Lesenswert?

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
Noch kein Account? Hier anmelden.