Function tbl(rng)
tbl = rng.Value
End Function
original | matricielle | ||||
toto | toto | ||||
titi | titi | formule validée en matricielle:=tbl(A1:A7) | |||
riri | riri | ||||
fifi | fifi | ||||
loulou | loulou | ||||
truc | truc | ||||
bidule | bidule | ||||
machin | #N/A | ||||
chouette | #N/A | ||||
blablabla | #N/A | ||||
toto | #N/A | ||||
taratata | #N/A | ||||
turlututu | #N/A | ||||
chapeau | #N/A | ||||
pointu | #N/A |
Function TBLX(rng As Range)
Dim x, y, T
T = rng.Value
On Error Resume Next
If TypeName(Application.Caller) = "Range" Then
If Err.Number = 0 Then
x = Evaluate("ROW(1:" & Application.Caller.Rows.Count & ")")
y = Evaluate("COLUMN(" & Cells(1).Resize(, Application.Caller.Column.Count).Address(0, 0) & ")")
T = Application.Index(T, x, y)
End If
Else: Err.Clear: On Error GoTo 0
End If
For i = rng.Rows.Count + 1 To UBound(T): T(i, 1) = "": Next
TBLX = T
End Function
Sub descript()
Application.MacroOptions _
Macro:="DicoAndCountOrder", _
Description:="Developed by Patricktoulon 03/01/2022" & vbCrLf & vbCrLf & _
"Argument 1 : plage de cellule à trier(doit etre une colonne)" & vbCrLf & vbCrLf & _
"Argument 2 : trier 1 pour trier les chaines et 2 pour trier par les nombres d'occurences" & vbCrLf & vbCrLf & _
"Argument 3 : 1 pour croissant 2 pour décroissant", _
Category:=8, _
ArgumentDescriptions:=Array( _
"Adresse de la colonne à trier", "2d argument :1 pour trier les chaines 2 pour les nombres d'occurences ", _
"bbbbbbbbbbbbe" & vbLf & "zzzzzzzzzzzzzzz")
End Sub
Function Matrice(R As Range)
'R doit être un vecteur colonne
Dim tablo, i&
tablo = R.Resize(R.Parent.UsedRange.Rows.Count + 1) 'matrice, plus rapide, au moins 2 éléments
For i = R.Count + 1 To UBound(tablo)
tablo(i, 1) = ""
Next
Matrice = tablo 'vecteur colonne
End Function
mais si les formules devaient aller sur une autre feuille ben on est chocolatje devrais utiliser le usedrange de la feuille destination en espérant qu'il y est assez de lignes
Function TBL(rng)
Dim TBL_Temp, TBL_Temp2(), i&, x&, y&
TBL_Temp = rng.Value
With Application.ThisCell
For i = 1 To .End(xlDown).Row - .Row + 1
If Not .FormulaArray = .Offset(i, 0).FormulaArray Then Exit For
Next i
End With
ReDim TBL_Temp2(1 To i, 0)
y = UBound(TBL_Temp, 1)
For x = 1 To i
If x > y Then TBL_Temp2(x, 0) = "" Else TBL_Temp2(x, 0) = TBL_Temp(x, 1)
Next x
TBL = TBL_Temp2
End Function
Function TBLX(rng As Range)
Dim X, X1, X2, T
X1 = rng.Rows.Count
X = Application.Caller.Rows.Count: X2 = Evaluate("ROW(1:" & X & ")")
'on redimensionne le tableau simplement avec app.index
' qui nous permet de redimentionner les deux dimension à l'inverse de redim preserve
T = Application.Index(rng.Value, X2, Array(1))
For a = X1 + 1 To UBound(T): T(a, 1) = "": Next:'obligatoire faut bien vider les items supplémentaires
TBLX = T
End Function
je n'y ai pas pensé tout simplement, mais le principe est le mèmepourquoi tout ce moulin ?
le application.caller donne la plage entière