XL 2013 connaitre le type de variable tableau un ou 2 dim et le sens

patricktoulon

XLDnaute Barbatruc
Bonjour a tous
je cherche un moyen efficace de savoir quelle est le type de variable tableau une ou deux dim et est une ligne ou une colonne sans avoir a gérer des erreurs dans un sens ou dans l'autre
@Yeahou a donné un début de piste interessant mais c'est pas full right

VB:
Sub testy7()
a = [A1:H1].Value
MsgBox oneDim(a)
End Sub

Sub testy8()
a = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
MsgBox oneDim(a)
End Sub

Sub testy9()
Dim a(0 To 5, 1)
  a(5, 0) = "toto "
MsgBox oneDim(a) & " " & UBound(a, 2)
End Sub

'***********************************************************
'ERREUR!!!!
Sub testy10() ' erreur donne vrai quand base 0
Dim a(0 To 5, 0)
  a(5, 0) = "toto "
 'a(5) = "titi"    'erreur " nombre de dimensions incorect"
Msgbox  oneDim(a) & " " & UBound(a, 2)
End Sub
'***********************************************************

Sub testy11() '
Dim a(0 To 5)
MsgBox oneDim(a)
End Sub

Function oneDim(a)
  oneDim = UBound(a) + 1 - LBound(a) = Application.CountA(a)
End Function

il faudrait le moyen de compter le base 0 et ce sera bon
 
Solution
re
Bonjour @Yeahou
oui perso moi aussi je l'utilise rarement le ".iserr" de l'app
j'utilise typename par ce que je fait la même chose avec evaluate

pour le coup là il y en a pour tout les goûts

3 écriture différentes

sub de test

VB:
Dim q(1 To 1000000, 1 To 1)

Sub test0()    'tableau 1 colonne explicite base(1,1)
    MsgBox GetTypeArray(q)
    MsgBox GetTypeArray2(q)
    MsgBox GetTypeArray3(q)
End Sub

Sub testX0()    'tableau 1 colonne explicite base(1,1)
    Dim t
    t = [A1].Resize(1000000, 1).Value
    MsgBox GetTypeArray(t)
    MsgBox GetTypeArray2(t)
    MsgBox GetTypeArray3(t)
End Sub

Sub test1()    'tableau 1 colonne explicite base (1,1)
    t = [A1:A1000000].Value
    MsgBox...
Bonjour le fil, le forum

essaie donc de faire msgbox tablo2(2)
Ok, je vois, par contre je ne vois pas toujours l'intérêt de ce type de tableau en base 0, à quoi ça peut servir ?, un tableau unidimensionnel attaquable avec redim ?

En tout cas, pour pouvoir faire ce que tu veux, il faut trouver une différence de comportement entre un tableau unidimensionnel et un tableau base 0, cela sans génération d'erreur
Une piste peut être, il y a quelque chose avec application.transpose(a) qui passe sur tous les tableaux, y compris unidimensionnel. Le truc intéressant, c'est qu'on a l'impression qu'un transpose sur un unidimensionnel ne fait rien et ne décale pas le tableau, mais après un transpose, un unidimensionnel ne génère plus d'erreur avec un lbound(a,2) et un ubound(a,2) qui renvoient bien 1 pour la taille de la deuxième dimension.
Malheureusement, le transpose a l'effet inverse sur un tableau base 0 unique qui ne se décale pas non plus mais qui renvoie du coup, lui, une erreur avec ubound(a,2) après un transpose. Un double transpose pour lui le retransforme en un tableau qui renvoie cette fois 1 avec lbound(a,2) et ubound(a,2) contre 0 avant le double transpose. Mais le double transpose sur l'unidimensionnel ne le décale toujours pas et le renvoie à son état intitial, le serpent qui se mord la queue.

Bien cordialement, @+
 
Dernière édition:

mapomme

XLDnaute Barbatruc
Re,

Un tableau est une structure avec indices numériques. La plage des indices n'a pas forcément 0 ou 1 comme borne inférieure.

Dim t(-100 to -1, -5 to 7) est parfaitement correct.

et le code ci-dessous fonctionne:
VB:
Sub test()
Dim t(-100 To -1, -5 To 7), i&, j&
   For i = -98 To -87
      For j = -5 To 7
         t(i, j) = i & " / " & j
      Next j
   Next i
   Range("a1").Resize(Abs(UBound(t) - LBound(t)) + 1, Abs(UBound(t, 2) - LBound(t, 2)) + 1) = t
End Sub
 

laurent950

XLDnaute Barbatruc
Bonjour @patricktoulon

Avec cela ca fonctionne pas
a = Array([{1,"a"}], [{2,"b"}], [{ 3,"c" }], [{ 4,"d"}], [{5,"e"}], [{6,"f"}], [{7,"g"}], [{8,"h"}], [{9,"i"}])
Peut être faire des essais avec application.transpose
Puis il faut adapter avec les variables tableaux Multidimensions

le code :

Code:
Function NumberOfArrayDimensions(arr As Variant, TypeTab() As Variant) As Variant()
' https://stackoverflow.com/questions/24613101/vba-check-if-array-is-one-dimensional
''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
' NumberOfArrayDimensions
' This function returns the number of dimensions of an array. An unallocated dynamic array
' has 0 dimensions. This condition can also be tested with IsArrayEmpty.
'''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
Dim Ndx As Integer
Dim Res As Integer
On Error Resume Next
' Loop, increasing the dimension index Ndx, until an error occurs.
' An error will occur when Ndx exceeds the number of dimension
' in the array. Return Ndx - 1.
    Do
        Ndx = Ndx + 1
        Res = UBound(arr, Ndx)
    Loop Until Err.Number <> 0
Err.Clear
TypeTab(0) = Ndx - 1
'
Select Case TypeTab(0)
    Case 1
        TypeTab(1) = "Base 0"                   'MsgBox "Base 0"
        If LBound(arr) = 0 Then TypeTab(2) = UBound(arr) + 1 Else TypeTab(2) = UBound(arr)
    Case 2
        If LBound(arr, 1) > 0 And LBound(arr, 2) > 0 Then
            TypeTab(1) = "Base 1"          'MsgBox "Base 1"
            If LBound(arr, 2) = 0 Then TypeTab(2) = UBound(arr, 2) + 1 Else TypeTab(2) = UBound(arr, 2)
        ElseIf LBound(arr, 1) = 1 Or LBound(arr, 2) = 1 Then
            TypeTab(1) = "Base 1"          'MsgBox "Base 1"
            If LBound(arr, 2) = 0 Then TypeTab(2) = UBound(arr, 2) + 1 Else TypeTab(2) = UBound(arr, 2)
        Else
            TypeTab(1) = "Base 1"          'MsgBox "Base 1"
            If LBound(arr, 2) = 0 Then TypeTab(2) = UBound(arr, 2) + 1 Else TypeTab(2) = UBound(arr, 2)
        End If
End Select
    NumberOfArrayDimensions = TypeTab
End Function

VB:
Pour test
Sub testy1()
Dim Res(0 To 2) As Variant
a = [A1:A7].Value
NumberOfArrayDimensions a, Res
    MsgBox "Variable tableau de type :" & vbCrLf & " --------> " & Res(0) & " dimensions" _
                                        & vbCrLf & " --------> " & " En " & Res(1) _
                                        & vbCrLf & " --------> " & " Nombre de Colonnes " & Res(2)
End Sub
Sub testy2()
Dim Res(0 To 2) As Variant
a = [A1:B7].Value
NumberOfArrayDimensions a, Res
    MsgBox "Variable tableau de type :" & vbCrLf & " --------> " & Res(0) & " dimensions" _
                                        & vbCrLf & " --------> " & " En " & Res(1) _
                                        & vbCrLf & " --------> " & " Nombre de Colonnes " & Res(2)
End Sub
Sub testy3()
Dim Res(0 To 2) As Variant
a = [A1:C7].Value
NumberOfArrayDimensions a, Res
    MsgBox "Variable tableau de type :" & vbCrLf & " --------> " & Res(0) & " dimensions" _
                                        & vbCrLf & " --------> " & " En " & Res(1) _
                                        & vbCrLf & " --------> " & " Nombre de Colonnes " & Res(2)
End Sub
Sub testy4()
Dim Res(0 To 2) As Variant
a = Array(1, 2, 3, 4, 5, 6, 7, 8, 9)
NumberOfArrayDimensions a, Res
    MsgBox "Variable tableau de type :" & vbCrLf & " --------> " & Res(0) & " dimensions" _
                                        & vbCrLf & " --------> " & " En " & Res(1) _
                                        & vbCrLf & " --------> " & " Nombre de Colonnes " & Res(2)
End Sub
Sub testy5()
Dim Res(0 To 2) As Variant
a = Array([{1,"a"}], [{2,"b"}], [{ 3,"c" }], [{ 4,"d"}], [{5,"e"}], [{6,"f"}], [{7,"g"}], [{8,"h"}], [{9,"i"}])
NumberOfArrayDimensions a, Res
    MsgBox "Variable tableau de type :" & vbCrLf & " --------> " & Res(0) & " dimensions" _
                                        & vbCrLf & " --------> " & " En " & Res(1) _
                                        & vbCrLf & " --------> " & " Nombre de Colonnes " & Res(2)
End Sub
Sub testy6()
Dim Res(0 To 2) As Variant
Dim a(0 To 0, 0 To 0)
NumberOfArrayDimensions a, Res
    MsgBox "Variable tableau de type :" & vbCrLf & " --------> " & Res(0) & " dimensions" _
                                        & vbCrLf & " --------> " & " En " & Res(1) _
                                        & vbCrLf & " --------> " & " Nombre de Colonnes " & Res(2)
End Sub
Sub testy7()
Dim Res(0 To 2) As Variant
Dim a(0 To 1, 0 To 0)
NumberOfArrayDimensions a, Res
    MsgBox "Variable tableau de type :" & vbCrLf & " --------> " & Res(0) & " dimensions" _
                                        & vbCrLf & " --------> " & " En " & Res(1) _
                                        & vbCrLf & " --------> " & " Nombre de Colonnes " & Res(2)
End Sub
Sub testy8()
Dim Res(0 To 2) As Variant
Dim a(0 To 0, 0 To 1)
NumberOfArrayDimensions a, Res
    MsgBox "Variable tableau de type :" & vbCrLf & " --------> " & Res(0) & " dimensions" _
                                        & vbCrLf & " --------> " & " En " & Res(1) _
                                        & vbCrLf & " --------> " & " Nombre de Colonnes " & Res(2)
End Sub
Sub testy9()
Dim Res(0 To 2) As Variant
Dim a(1 To 1, 1 To 1)
NumberOfArrayDimensions a, Res
    MsgBox "Variable tableau de type :" & vbCrLf & " --------> " & Res(0) & " dimensions" _
                                        & vbCrLf & " --------> " & " En " & Res(1) _
                                        & vbCrLf & " --------> " & " Nombre de Colonnes " & Res(2)
End Sub
Sub test10()
Dim Res(0 To 2) As Variant
Dim a(1 To 1, 0)
NumberOfArrayDimensions a, Res
    MsgBox "Variable tableau de type :" & vbCrLf & " --------> " & Res(0) & " dimensions" _
                                        & vbCrLf & " --------> " & " En " & Res(1) _
                                        & vbCrLf & " --------> " & " Nombre de Colonnes " & Res(2)
End Sub
Sub testy11()
Dim Res(0 To 2) As Variant
Dim a(0 To 5, 0)
NumberOfArrayDimensions a, Res
    MsgBox "Variable tableau de type :" & vbCrLf & " --------> " & Res(0) & " dimensions" _
                                        & vbCrLf & " --------> " & " En " & Res(1) _
                                        & vbCrLf & " --------> " & " Nombre de Colonnes " & Res(2)
End Sub
Sub test12() '
Dim Res(0 To 2) As Variant
Dim a(0 To 5)
NumberOfArrayDimensions a, Res
    MsgBox "Variable tableau de type :" & vbCrLf & " --------> " & Res(0) & " dimensions" _
                                        & vbCrLf & " --------> " & " En " & Res(1) _
                                        & vbCrLf & " --------> " & " Nombre de Colonnes " & Res(2)
End Sub
Sub testy13() '
Dim Res(0 To 2) As Variant
Dim a(0 To 5, 1 To 8)
NumberOfArrayDimensions a, Res
    MsgBox "Variable tableau de type :" & vbCrLf & " --------> " & Res(0) & " dimensions" _
                                        & vbCrLf & " --------> " & " En " & Res(1) _
                                        & vbCrLf & " --------> " & " Nombre de Colonnes " & Res(2)
End Sub
 

patricktoulon

XLDnaute Barbatruc
Bonjour,
J'ai bon chercher je ne trouve pas de fonction , genre TypeNameDetail ,qui fournirai un réponse plus précise, alors que quand on place la variable dans l'espion on voit bien Variant (0 To10)!
Bonjour robert
Ah!!.... tu soulève une couleuvre là ;)
serait il possible de récupérer en vba ce que te dis la fenêtre des variable locales
si oui ce serait bien évidement le jackpot
 

Discussions similaires

Réponses
4
Affichages
455

Statistiques des forums

Discussions
315 138
Messages
2 116 685
Membres
112 837
dernier inscrit
Sting