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...

Bernard_XLD

XLDnaute Barbatruc
Membre du Staff
Bonjour le fil, le forum

En fait, je pense qu'on prend le problème à l'envers en essayant d'identifier la différence entre un array et un tableau base 0 à une colonne, ils contiennent le même nombre de données de base. Si on élimine l'array de l'équation en le transformant directement en tableau 1 colonne à sa création, ça fonctionne dans tous les cas de figure car on a toujours un tableau à deux dimensions et ça m'étonnerait qu'on puisse génèrer au départ un array dépassant la limite de transpose.
Et comme cela, il n'y a plus qu'une seule façon de travailler avec un array quel qu'il soit au départ, le code de traitement est identique et plus besoin d'identifier le type d'array.

Bien cordialement, @+
VB:
Sub testy1()
    Dim Liste As Variant
    Liste = Application.Transpose(Array(1, 2, 3, 4, 5, 6))
    MsgBox WhatIsIt(Liste)
End Sub

Sub testy2()
    Dim Liste(1 To 50, 1 To 10) As Variant
    MsgBox WhatIsIt(Liste)
End Sub

Sub testy3()
    Dim Liste As Variant
    Set Liste = [A1:A13]
    MsgBox WhatIsIt(Liste)
End Sub

Sub testy4()
    Dim Liste As Variant
    Set Liste = [A1:H1]
    MsgBox WhatIsIt(Liste)
End Sub

Sub testy5()
    Dim Liste As Variant
    Liste = "1,2,3,4,5,6,7,8,9"
    MsgBox WhatIsIt(Liste)
End Sub

Sub testy6()
    Dim Liste As Variant
     Liste = 12.36
    MsgBox WhatIsIt(Liste)
End Sub

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

Sub testy8()
a = Application.Transpose(Array(1, 2, 3, 4, 5, 6, 7, 8, 9))
MsgBox WhatIsIt(a)
End Sub

Sub testy9()
Dim a(0 To 5, 1)
  a(5, 0) = "toto "
MsgBox WhatIsIt(a)
End Sub

Sub testy10() ' erreur donne vrai quand base 0
Dim a(0 To 5, 0)
  a(5, 0) = "toto "
MsgBox WhatIsIt(a)
End Sub

Function WhatIsIt(ByVal a As Variant)
    Dim b()
    If TypeName(a) = "Range" Then a = a.Value
    If IsArray(a) Then
        WhatIsIt = "Array 2 dimensions, Colonnes : " & UBound(a, 2) + 1 - LBound(a, 2) & " ,Lignes : " & UBound(a, 1) + 1 - LBound(a, 1)
    Else
        If TypeName(a) <> "Variant()" Then WhatIsIt = TypeName(a)
    End If
End Function
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Bonjour.
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
Je dirais à priori :
VB:
Function DescrVar(ByVal Quoi) As String
   Dim N%, LB&, TJn$()
   DescrVar = TypeName(Quoi)
   If Not IsArray(Quoi) Then Exit Function
   On Error Resume Next
   Do: N = N + 1: LB = LBound(Quoi, N): If Err Then Exit Do
      ReDim Preserve TJn(1 To N)
      TJn(N) = LB & " to " & UBound(Quoi, N)
      Loop
   DescrVar = Left$(DescrVar, Len(DescrVar) - 1) & Join(TJn, ", ") & ")"
   End Function
 

patricktoulon

XLDnaute Barbatruc
Bonjour @Yeahou
tu biaise le résultat là 🤣 ;)
le tableau ne doit être touché que dans la fonction

la transposition doit se faire alors dans la fonction

mais il va rester 2 problèmes
1°c'est quand transposer ou pas
2° en cas de grand tableau , transposition a ces limites ne l'oublions pas

donc retour case départ

@Dranreb
pas mal du tout on est dans le même principe que ce que j'avais avant avec la gestion d'erreur
il fallait y penser a celle là ;)

mais comprenons nous bien
si il est possible de récupérer les variables locales ou autre mon but n'est pas de voir variant(x) ou variant(x,x)
mon but est bien de déterminer ceci
soit
un array
un tableau (x lignes,1 colonne)
un tableau (1 ligne,x colonnes)

le retour pourrait se faire sous forme numérique 1 , 2 ou 3 par exemple , ou sous la forme que vous voulez
 

Dranreb

XLDnaute Barbatruc
Peut être quelque chose un peu dans ce style alors :
VB:
Function CasTab(ByVal Quoi) As Byte
   Dim N%, LB&
   If Not IsArray(Quoi) Then Exit Function
   On Error Resume Next
   Do: N = N + 1: LB = LBound(Quoi, N): If Err Then Exit Function
      CasTab = CasTab * 8 + 4 - 2 * (LB <> 0) - (UBound(Quoi, N) > LB)
      Loop
   End Function
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Eh bien adapte selon ce que tu veux, qu'est ce que tu veux que je te dises.
Il y a plus de cas possible que ça, il peut y avoir notamment plus de 2 dimensions, en même déjà à la fois plusieurs lignes et plusieurs colonnes.
 

patricktoulon

XLDnaute Barbatruc
non ce qu'il y aura d'injecté c'est soit array soit 2 dim vertival ou horizontal mais toujours qu'un ligne ou colonne

regarde le test ligne ça va pas
VB:
Sub testy7()    'test tableau ligne  renvoie 11 ou 15( pas bon )
    Dim liste
    a = [A1:j1].Value
    MsgBox WhatIsIt(a)
    ReDim liste(1, 0 To 5)
    MsgBox WhatIsIt(liste)
    ReDim liste(0, 1 To 5)
    MsgBox WhatIsIt(liste)
End Sub

Sub testy3()    ' test tableau colonne renvoi 14 partout ( c'est bon)
    Dim liste As Variant
    liste = [A1:A10].Value
    MsgBox WhatIsIt(liste)
    ReDim liste(0 To 5, 1 To 1)
    MsgBox WhatIsIt(liste)
    ReDim liste(0 To 5, 0)
    MsgBox WhatIsIt(liste)
End Sub

Sub testy1() 'test array renvoie 3 partout ( c'est bon)
    Dim liste As Variant
    liste = Array(1, 2, 3, 4, 5, 6)
    MsgBox WhatIsIt(liste)
  ReDim liste(1 To 10)
  MsgBox WhatIsIt(liste)
 End Sub

Function WhatIsIt(ByVal quoi As Variant)
    Dim N%, LB&
    If Not IsArray(quoi) Then Exit Function
    On Error Resume Next
    Do: N = N + 1: LB = LBound(quoi, N): If Err > 0 Then Exit Function
        WhatIsIt = WhatIsIt * 4 + 2 - (UBound(quoi, N) > LB)
    Loop
End Function
 

job75

XLDnaute Barbatruc
Bonjour à 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
A part se triturer le cerveau à quoi sert réellement ce fil ?

Il suffit de savoir lire des formules Excel et le code VBA créant le tableau pour avoir la réponse.

A+
 

patricktoulon

XLDnaute Barbatruc
Bonjour à tous,


A part se triturer le cerveau à quoi sert réellement ce fil ?

Il suffit de savoir lire des formules Excel et le code VBA créant le tableau pour avoir la réponse.

A+
ce petit travail de détermination n'est qu'un bout de la fonction finale et le reste de cette fonction se fera en fonction de ce resulta justement
je dois pouvoir injecter n'importe quelle forme d'array 1 /2 dim base 0/1 pour ligne ou colonne
 

dysorthographie

XLDnaute Accro
Bonjour,
si ça peut donner un indication!
VB:
Sub test()
Dim R(2, 1, 7) As Integer, i As Integer
For Each c In R
i = i + 1
Next
Debug.Print UBound(R), i, TypeName(R)
End Sub
Il est égal à la somme des ubound
R(2, 1, 7) = 3*2*8=48=I
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Excel ne tient pas compte des LBound pour affecter un tableau à une Value de Range. MSForms non plus pour les .List. Excel tolère en écriture les array 1 dimension en tant que valeur de Range sur 1 ligne, mais dans l'autre sens, restitue toujours un tableau 2D basé 1.
 

Discussions similaires

Réponses
7
Affichages
377

Statistiques des forums

Discussions
312 370
Messages
2 087 688
Membres
103 639
dernier inscrit
NIEMASAFI