Range in Array Funktion

Informationen und Beispiele zu den hier genannten Dialog-Elementen:
MsgBox
Bild

Betrifft: Range in Array Funktion
von: VB 5000
Geschrieben am: 30.07.2015 15:55:35

Hallo zusammen!
Ich versuche Folgendes zu realisieren:
Ich möchte eine Funktion schreiben, bei der der Anwender zwei Zellenbereiche (i.d.R. Teile einer Spalte) auswählen kann. In meinem Kopf stelle ich mir dies als 2 Vektoren gleicher Länge vor, die der Anwender jedoch frei wählen kann.
Innerhalb der Funktion wird dann mit den beiden Vektoren gerechnet, z.B. wird paarweise die Differenz der Vektoreintraege gebildet und hinterher ein Mittelwert ausgegeben. Was mir vermutlich helfen würde, wäre zu wissen, wie ich bei einer Range z.B. A1:A10 auf den Wert in der 5. Zelle von oben zugreifen kann!?
Hier mein Versuch, bei dem ich die Range an einen Array übergebe:


Function test(range1 As Range, range2 As Range) As Double
Dim n As Integer
Dim i As Integer
Dim h() As Double
Dim x() As Double
Dim y() As Double
'If Application.WorksheetFunction.Count(range1) <> Application.WorksheetFunction.Count(range2)  _
Then MsgBox "Einlesen fehlgeschlagen"
n = Application.WorksheetFunction.Count(range1)
ReDim x(n - 1) 'n = 20 dann array von 0 bis 19
ReDim y(n - 1)
x = range1.Value 'scheint nicht zu funktionieren, ich moechte das Eingelesene als Array haben
y = range2.Value 
For i = 0 To (n - 1)
    
    h(i) = (x(i) - y(i)) 
Next i
test = Application.WorksheetFunction.Average(h)
End Function

Bild

Betrifft: AW: Range in Array Funktion
von: Rudi Maintaire
Geschrieben am: 30.07.2015 16:16:35
Hallo,
mal als Ansatz:

Function test(range1 As Range, range2 As Range) As Double
Dim n As Integer
Dim i As Integer
Dim h() As Double
Dim x
Dim y
'If Application.WorksheetFunction.Count(range1) <> Application.WorksheetFunction.Count(range2)  _
_
Then MsgBox "Einlesen fehlgeschlagen"
n = Application.WorksheetFunction.Count(range1)
x = range1.Value 'scheint nicht zu funktionieren, ich moechte das Eingelesene als Array haben
x = WorksheetFunction.Transpose(x)
y = range2.Value
y = WorksheetFunction.Transpose(y)
ReDim h(LBound(x) To UBound(x))
For i = LBound(x) To UBound(x)
    
    h(i) = (x(i) - y(i))
Next i
test = Application.WorksheetFunction.Average(h)
End Function

Wenn du aber z.B. A1:J1 und A2:J2 als Range übergibst, geht das schief.
Gruß
Rudi

Bild

Betrifft: verallgemeinert
von: Michael
Geschrieben am: 30.07.2015 16:55:41
Hi zusammen,
ich denke, Rudi geht es eher nicht um die Überschneidung, sondern zweidimensionale Arrays.
Das geht aber so:

Public Function test(ByVal range1 As Range, ByVal range2 As Range) As Variant
Dim cx&, cy&, rx&, ry&
Dim y As Long
Dim xa As Variant, ya As Variant
Dim xc&, xr&, yc&, yr&
'Stop
xc = range1.Columns.Count
xr = range1.Rows.Count
yc = range2.Columns.Count
yr = range2.Rows.Count
If xc <> yc Or xr <> yr Then
  test = "#[GRÖSSE!]"
  Exit Function
End If
' kannst ja mal probieren: ****************************************************
' MsgBox range1(5)     ' bei ein- oder mehrdimensionalen Ranges mit (1) bis (n)
' kannst ja mal probieren: ****************************************************
xa = range1: ya = range2
For cx = 1 To xc
  For rx = 1 To xr
    xa(rx, cx) = xa(rx, cx) - ya(rx, cx)
  Next
Next
test = Application.WorksheetFunction.Average(xa)
End Function
Happy Exceling,
Michael

Bild

Betrifft: AW: Range in Array Funktion
von: VB 5000
Geschrieben am: 30.07.2015 16:37:57
Perfekt, vielen vielen Dank!
Da war ich ja nichtmal komplett auf dem Holzweg (finde ich ;), kenne mich nur mit der Syntax in VBA noch nicht so aus ).
Überschneiden dürften sich die Ranges für meinen Zweck eigentlich nie, von daher ist das kein Problem.

 Bild

Beiträge aus den Excel-Beispielen zum Thema "Range in Array Funktion"