Der WVERWEIS hat mich an eine ältere ...
29.04.2016 19:11:48
Luc:-?
…Matrix-Bildungs-UDF erinnert, die du in diesem Zusammenhang ja auch gleich testen könntest, Luschi;
die Fml dazu würde dann =WVERWEIS("?*";VMx(2;;Q2:S2;"manuell");1;0) lauten und die UDF VMx folgt hier in ErstPublikation (in diesem BT hatte ich sie schon mal eingesetzt):
Public Enum cxTriState: cxAsUsed = -2: cxTrue: cxFalse: cxCTrue: End Enum
Rem Bildet Vektor bzw Matrix aus Arg3Vektt lt Arg1RichtAngabe
' Arg1: ±2|0/±1=horz/vert, =0 (entfällt sonst); in Arg3 müss alle KomponentVek-
' toren/-Zeil-/-SpaltenBereiche/-Skalare einzeln aufgeführt
' wdn, SchnittmengBereiche`(adr1:adr2 adr3:adr4)´ sind aber
' zulässig, sofern sie 1 zusammhängd VektorBereich ergeben,
' unzusamhängd Bereiche könn nur als 1zelVektt angegeb wdn;
' falls Arg1 leer bleibt, folgt d.Erg-Wdgabe d.ZellAuswahl.
' Achtung! Bei Anwend in vbProcs müss stets Arg1+2 (ggf als
' Null/0) angegeben wdn, in ZellFmln nur b.Bedarf (aber im-
' mer mindest zugehöriges ;)! Benötigt Enumerat cxTriState!
' Vs1.5 -LSr:CyWorXxl -cd:20121027 -1pub:20160429herber -lupd:20160429t
Function VMx(ByVal VertR, ByVal ErgzZ, ParamArray Bezug())
Dim isNoReg As Boolean, isVV As cxTriState, isRept As VbTriState, _
bezz(1) As Long, kix As Long, kox As Long, lb As Long, pax As Long, _
stix As Long, av, ax, bez, vdf As Variant, ac As Range
Err.Number = 0: On Error Resume Next
If IsMissing(VertR) Or IsNull(VertR) Then
With Application
If IsError(.Caller) Then
Else: Set ac = .Caller
If ac.HasArray Then isVV = Abs(CBool(ac.Rows.Count - 1))
End If
End With
ElseIf IsNumeric(VertR) Then
isVV = VertR Mod 3: isVV = isVV * (-1) ^ CInt(isVV > cxCTrue)
End If
If IsMissing(ErgzZ) Then ErgzZ = Null: isNoReg = isVV 'Anm: Wird stets 2x durchlaufen!
If IsArray(Bezug(pax)) Then
With WorksheetFunction
bez = .Transpose(Bezug(pax))
On Error Resume Next
If IsError(LBound(bez, 2)) Then
Else: bez = .Transpose(bez)
If IsError(LBound(bez, 2)) Then _
Else On Error GoTo fx: Err.Raise xlErrRef
End If
End With
On Error GoTo fx
bezz(1) = UBound(bez) + 1 - LBound(bez)
If isNoReg Then
ElseIf bezz(0) > bezz(1) Then
ReDim Preserve bez(LBound(bez) To bezz(0) - 1 + LBound(bez))
If Not IsNull(ErgzZ) Then
For kix = bezz(1) + 2 - LBound(bez) To UBound(bez)
bez(kix) = ErgzZ
Next kix
End If
ElseIf CBool(bezz(0)) And bezz(0) bezz(1) And Not isNoReg Then
ReDim bez(LBound(bez) To bezz(0) - 1 + LBound(bez))
bez(LBound(bez)) = Bezug(pax)
If Not IsNull(ErgzZ) Then
For kix = bezz(1) + 2 - LBound(bez) To UBound(bez)
bez(kix) = ErgzZ
Next kix
End If
vdf(pax - lb) = bez
Else: vdf(pax - lb) = Bezug(pax)
End If
End If
Next pax
isRept = isRept + 1: On Abs(isRept) GoTo zK
If isVV xlErrNA Then
VMx = CVErr(xlErrNull)
Else: VMx = CVErr(Err.Number)
End If
End If
bez = Empty: vdf = Empty: Set ac = Nothing
End Function
Ich habe sie jetzt nur um ein Feature ergänzt, das stets alle Arg3ff-Angaben zu einem Vektor vereint. Anderenfalls käme eine zu einer regulären normierte Matrix heraus.
So kann man hier den AlternativText gleich mit einbinden.
Viel Spaß, Luc :-?