Anzeige
Anzeige
HERBERS
Excel-Forum (Archiv)
20+ Jahre Excel-Kompetenz: Von Anwendern, für Anwender
Anzeige
Inhaltsverzeichnis

Excel VBA - Funktion mit mehreren Bereichen (ranges)

Forumthread: Excel VBA - Funktion mit mehreren Bereichen (ranges)

Excel VBA - Funktion mit mehreren Bereichen (ranges)
12.01.2025 20:29:27
menschenschreck
Hallo zusammen,

ich habe versucht eine Funktion in Excel zu erstellen, die anhand der Zellfarbe die Anzahl der Urlaubstage ermittelt. Dieses funktioniert auch recht gut, wenn ich die Funktion über eine Sub aufrufe und dabei eine zusammengesetzte Range übergebe. Sobald ich aber im Tabellenblatt die Funktion verwende und mehr als einen Bereich (mit Strg) wähle, läuft die Prozedur auf Fehler (#WERT!).

Mein Code:

Public Function JahUrl(UBereich As Range) As Single

Dim Cell As Range
Dim UFarbe As Single
Dim U2Farbe As Single
Dim UTage As Single
Dim rangetouse As Range

UFarbe = 6
U2Farbe = 36
UTage = 0

Set rangetouse = UBereich

For Each singleArea In rangetouse.Areas

For Each Cell In singleArea

Application.Volatile
ZFarbe = Cell.Interior.ColorIndex
If ZFarbe = UFarbe Then
UTage = UTage + 1
ElseIf ZFarbe = U2Farbe Then
UTage = UTage + 0.5
End If

Next Cell

Next singleArea

JahUrl = UTage

End Function
-------------------------------------------------------------------
Sub test()
MsgBox JahUrl(Range("A3:A33,E3:E33,I3:I33,M3:M33,Q3:Q33,U3:U33,Y3:Y33,AC3:AC33,AG3:AG33,AK3:AK33,AO3:AO33,AS3:AS33")) & " Tag(e) Urlaub"
End Sub


Wäre toll, wenn jemand eine gute Idee für mich hätte.
Anzeige

22
Beiträge zum Forumthread
Beiträge zu diesem Forumthread

Betreff
Datum
Anwender
Anzeige
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
12.01.2025 21:36:38
Onur
1) Application.Volatile muss immer die erste Zeile der Funktion sein, sonst wird sie ignoriert.
2) Was sollen die "---------------------" ? Die produzieren nur Fehler
3) Du hast zwei Variablen nicht deklariert.
4) Strukturierte Codes erleichtern die Lesbarkeit (und ggf das Debuggen)
Option Explicit

Public Function JahUrl(UBereich) As Single
Application.Volatile
Dim Cel As Range
Dim UFarbe As Single
Dim U2Farbe As Single
Dim UTage As Single
Dim RangeToUse As Range
Dim singleArea, ZFarbe
UFarbe = 6
U2Farbe = 36
UTage = 0
Set RangeToUse = Range(UBereich)
For Each singleArea In RangeToUse.Areas
For Each Cel In singleArea
ZFarbe = Cel.Interior.ColorIndex
If ZFarbe = UFarbe Then
UTage = UTage + 1
ElseIf ZFarbe = U2Farbe Then
UTage = UTage + 0.5
End If
Next Cel
Next singleArea
JahUrl = UTage
End Function

Sub test()
MsgBox JahUrl("A3:A33,E3:E33,I3:I33,M3:M33,Q3:Q33,U3:U33,Y3:Y33,AC3:AC33,AG3:AG33,AK3:AK33,AO3:AO33,AS3:AS33") & " Tag(e) Urlaub"
End Sub
Anzeige
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
13.01.2025 00:24:24
Uduuh
Hallo,
da die Anzahl und Größe der Bereiche variieren kann, musst du sie in einer Tabellenfunktion als ParamArray übergeben
Beispiel:
Function xxx(ParamArray r())

Dim a, c
For Each a In r
For Each c In a
xxx = xxx & "# " & c.Address(0, 0)
Next c
Next a
xxx = Mid(xxx, 3)
End Function

=xxx(D3;F6:G8) ergibt D3# F6# G6# F7# G7# F8# G8

Gruß aus'm Pott
Udo
Anzeige
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
13.01.2025 16:34:25
daniel
Hi
mag sein, dass die Antwort schon dabei ist, aber die Lösung könnte einfach sein:

wenn du einer Funktion eine Range, die aus mehreren Areas besteht, als eine Range übergeben willst, dann setze Klammern:

=JahUrl((A3:A33;E3:E33;I3:I33;M3:M33;Q3:Q33;...))

ohne die zusätzliche Klammer wird jeder durch Semikolon getrennte Bereich als ein eigener Parameter angesehen, mit der Klammer hast du einen Parameter und in diesem eine Range mit mehreren Areas.

Gruß Daniel
Anzeige
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
13.01.2025 20:55:54
menschenschreck
Hallo Daniel,

danke für deine Antwort. Funktioniert ebenso perfekt wie die anderen Lösungen. Allerdings muss ich hier die doppelten Klammern nach der Bereichswahl manuell setzen.
Gibt es auch eine Möglichkeit das im Code zu tun?
Set UBereich = "(" & UBereich & ")"
oder
UBereich = "(" & UBereich & ")"

funktionieren leider nicht.
Anzeige
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
15.01.2025 15:25:10
daniel
sorry, versteh ich nicht.
du musst doch nur im Excelblatt in der Formel die Klammern setzen.
der Code kann bleiben, wie er ist.
Gruß Daniel
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
15.01.2025 16:34:23
menschenschreck
Hallo Daniel,

mach dir keine Gedanken, das passt schon so. Zum Verständnis zu meiner Frage, ich wollte die doppelten Klammern um den zusammengesetzten Bereich nicht manuell im Tabellenblatt setzen müssen sondern das in der Funktion selbst erledigen - bei der Übergabe der Range.
Beispielsweise mit
UBereich = "(" & UBereich & ")"

Aber das war jetzt nur so ein dummer Gedanke, ob das auf irgendeinem Weg möglich gewesen wäre.Vielleicht über eine Konvertierung in einen String und dann die Klammern am Anfang und Schluß hinzufügen? So, wie ich es aber versucht hatte, funktioniert das nicht.
Wie gesagt, nicht so wichtig. Danke dir auf jeden Fall.

Frank
Anzeige
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
17.01.2025 16:23:44
daniel
das scheitert ja schon daran, dass du die Funktion mit nur einem Parameter geschrieben hast, ihr aber viele übergibst.
soweit kommst du gar nicht.

wenn, dann müsstest du mit einem ParamArray arbeiten, welches dir erlaubt eine variable Anzahl an Parametern zu übergeben (maximal 30 glaube ich)
diese könntest du dann so einer Range zusammenfassen:

Function xxx(ParamArray x() As Variant) As String

Dim a As Range
Dim i As Long
Set a = x(0)
For i = 1 To UBound(x)
Set a = Union(a, x(i))
Next
xxx = "Zellen: " & a.Cells.Count & " Bereiche: " & a.Areas.Count
End Function

Gruß Daniel
Anzeige
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
17.01.2025 18:39:22
menschenschreck
Hallo Daniel,

das hatte ich mir fast gedacht.
Mit ParamArray habe ich das dann auch gelöst, dank der Hilfe der Kollegen aus dem Forum.

Auch dir noch einmal herzlichen Dank für deine Unterstützung.

Gruß
Frank
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
13.01.2025 01:37:07
menschenschreck
Hey Udo,

du hast genau verstanden, was ich gemeint hatte, nämlich die Übergabe in die Funktion.
ParamArray hatte ich gelesen, wußte aber mit der Hilfe im Netz nicht wirklich was anzufangen bzw. wie ich das Ganze umzusetzen habe.

Wieso verknüpfst du aber mit "# "!? Sollte das nicht ein Komma "," sein?!

Ich denke mit deinem Tipp bekomme ich die komplette Funktion aber hingewurstelt (hoffentlich).

Gruß in'n Pott,
Frank

Anzeige
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
13.01.2025 01:39:53
Onur
Ich habe dir doch schon die Lösung gepostet und Udo auch noch die Datei, wo du sehen kannst, DASS es funktioniert.
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
13.01.2025 11:31:08
Uduuh
Hallo,
Wieso verknüpfst du aber mit "# "!? Sollte das nicht ein Komma "," sein?!
sollte nur ein Beispiel sein.

Function UTage(ParamArray r() As Variant)

Dim a, c
Const UFarbe = 6
Const U2Farbe = 36

For Each a In r
For Each c In a
Select Case c.Interior.ColorIndex
Case UFarbe: UTage = UTage + 1
Case U2Farbe: UTage = UTage + 0.5
End Select
Next c
Next a

End Function

Gruß aus'm Pott
Udo
Anzeige
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
13.01.2025 15:52:48
menschenschreck
Hallo Udo,

auch dir herzlichen Dank für deinen Code. Sieht sehr elegant aus. Kann ihn leider erst heute Abend testen.

Falls die Frage ernst gemeint war: ...Mehrere Bereiche markieren ... In der Funktion erste Auswahl mit der Maus markieren, Maustaste loslassen .... [STRG] gedrückt halten, zweiten Bereich bei gedrückter Maustaste auswählen, Maustaste loslassen ... usw.

Vielen vielen Dank für deine Zeit und Hilfe.
LG Frank
Anzeige
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
13.01.2025 02:05:53
menschenschreck
Hallo Onur,

ich glaube wir reden aneinander vorbei. Klar funktoniert deine Lösung, aber nicht so, wie ich das gemeint hatte. Man soll im Tabellenblatt den Bereich wählen können und das ganze auch mit [Strg] über mehrere Bereiche. Keiner will manuell in die Formen die Bereiche eingeben [=JahUrl("A3:A33,C3:C33")] sondern Sie im Tabellenblatt auswählen.
Die Auswahl übergibt aber "falsch" für die Funktion, nämlich [=JahUrl(A3:A33;C3:33)], weshalb wohl nur der Weg von Udo so funktionieren sollte, wie ich mir das vorgestellt habe.

Vielen Dank auf jeden Fall,
Frank
Anzeige
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
13.01.2025 02:32:00
Onur
Sorry, ich dachte die ganze Zeit, du WOLLTEST unbedingt die UDF genauso aufrufen wie in der MsgBox.
Guckst du hier:
https://www.herber.de/bbs/user/174844.xlsm
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
13.01.2025 04:55:27
Onur
Hier etwas kürzer:
Public Function JahUrl(rng1 As Range, ParamArray arr() As Variant) As Double

Application.Volatile
Dim Cel As Range
Dim UFarbe As Single
Dim U2Farbe As Single
Dim ZFarbe, i, rng
UFarbe = 6
U2Farbe = 36
For Each rng In arr
Set rng1 = Union(rng1, rng)
Next rng
For Each Cel In rng1
ZFarbe = Cel.Interior.ColorIndex
If ZFarbe = UFarbe Then
JahUrl = JahUrl + 1
ElseIf ZFarbe = U2Farbe Then
JahUrl = JahUrl + 0.5
End If
Next Cel
End Function
Anzeige
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
13.01.2025 11:09:05
menschenschreck
Hallo Onur,

das ist jetzt genau DAS, was ich mir vorgestellt hatte. Vielen vielen herzlichen Dank für deinen sauberen und nachvollziehbaren Code. So kann auch ich vielleicht noch VBA lernen. Auf jeden Fall weiß ich jetzt schon mal, was ParamArray ist und wie man es einsetzen kann.

Nochmals danke für deine Zeit und Hilfe.

LG Frank
Anzeige
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
12.01.2025 21:57:34
Onur
Sind die Zellen eigentlich durch bedingte Formatierungen gefärbt oder händisch?
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
12.01.2025 23:46:31
menschenschreck
Hallo Onur,

herzlichen Dank für die Antwort.
Sorry für den unstrukturierten Code, aber leider bin ich kein VBA-Profi, deswegen steht im Erfahrungslevel ja auch "VBA bescheiden".

zu 2) die "-------------" stehen nicht im Code, das sollte hier nur eine optische Trennung zwischen Funktion und Sub sein.

Die Zellen sind nicht(!) über eine bedingte Formatierung gefärbt, sondern händisch.

Der Aufruf der Funktion über die sub test() funktioniert und liefert auch das gewünschte Ergebnis.

Das Problem: Funktion im Tabellenblatt liefert einen Fehler, wenn zusammengesetzte Bereiche gewählt werden.
Z. B. =JahUrl(A3:A13;E3:E14;I3:I15) - Ergebnis: #WERT!
Anzeige
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
13.01.2025 00:44:27
Onur
Du musst schon die Funktion GENAU SO aufrufen wie mit der MsgBox (im von mir geposteten Code):
=JahUrl("A3:A33,E3:E33,I3:I33,M3:M33,usw,usw")
AW: Excel VBA - Funktion mit mehreren Bereichen (ranges)
13.01.2025 01:20:21
Uduuh
Hallo,
damit übergibst du einen String als Parameter statt eines Bereichs und die Markierung mehrerer Bereiche mit Strg funktioniert auch nicht.

Gruß aus'm Pott
Udo
Anzeige
vielleicht ...
13.01.2025 11:34:23
Uduuh
Hallo,
... stell ich mich ja zu blöd an. ;-) Aber ich schaffe es nicht, die unterschiedlichen Bereiche mit STRG zu markieren.

Gruß aus'm Pott
Udo
Anzeige

Forumthreads zu verwandten Themen

Anzeige
Anzeige
Anzeige