Microsoft 365 Indices Tableau à 2 dimensions ( VBA )

Pounet95

XLDnaute Occasionnel
Bonjour tout le monde,
Je pensais que c'était "basique", ben non, ou, une fois encore le "neuneu" qui dort en moi a sévi !

A partir d'un 1er tableau de 4 lignes et 10 colonnes dans lequel toutes les cellules ne sont pas renseignées, je créé des "sous-tableaux" de façon à avoir pour chaque ligne, le nombre de cellules utilisées
1601387686037.png

Ce qui donne 4 sous-tableaux
Tbl(1,5) avec Tbl(1,1)=1 , Tbl(1,2)=3, .... ,Tbl(1,5)=8
......
Tbl(4,6) avec Tbl(4,1)=1,???, Tbl(4,4)=6, ...,etc

Ma question : comment connaitre le nombre max d'indices Y quand on connait X dans Tbl(X,Y) ?
J'ai essayé avec UBound(Tbl( X,2)) mais j'ai une erreur

Merci de vos réponses
Claude alias Pounet95
 
Solution
Bonjour Pounet95,

La notion de "sous-tableau" n'existe ni sur Excel ni en VBA.

Mais j'ai bien compris le problème, voyez le fichier joint et cette macro :
VB:
Sub Resultat()
Dim tablo, ncol%, nlig&, i&, n%, j%, ncolmax%, resu()
With [A1].CurrentRegion
    ncol = .Columns.Count
    If ncol = 1 Then ncol = 2
    tablo = .Resize(, ncol) 'matrice, plus rapide, au moins 2 éléments
End With
nlig = UBound(tablo) - 1
For i = 2 To nlig + 1
    n = 0
    For j = 2 To ncol
        If tablo(i, j) <> "" Then
             n = n + 1
             If n > ncolmax Then ncolmax = n: ReDim Preserve resu(1 To nlig, 1 To ncolmax)
             resu(i - 1, n) = tablo(i, j)
        End If
Next j, i
'---restitution---
With [B8] '1ère cellule de restitution, à...

Pounet95

XLDnaute Occasionnel
Bonsoir Job75,
Merci de répondre si vite.
Je pensais être simple en fabriquant le tableau pour illustrer ce que je veux. Loupé ?
Je cherche à récupérer le nombre d'éléments du tableau issu de la ligne x c'est à dire le nombre de colonnes non vides.
Ligne 2 par exemple :
- les colonnes 2,3,4,5,6 et 9 sont renseignées, soit un nombre de 6
- je créé donc un tableau Tbl(2,6) pour lequel les valeurs sont le numéro de la colonne non vide
Tbl(2,1)=2 Tbl(2,2)=3 Tbl(2,3)=4, etc.
- Ce que veux donc récupérer c'est le nombre d'éléments du 2ème indice du tableau connaissant le 1er soit avec mon exemple le 6 de Tbl((2,6)

Est-ce mieux ?
Merci en tous cas
Claude
 

job75

XLDnaute Barbatruc
Bonjour Pounet95,

La notion de "sous-tableau" n'existe ni sur Excel ni en VBA.

Mais j'ai bien compris le problème, voyez le fichier joint et cette macro :
VB:
Sub Resultat()
Dim tablo, ncol%, nlig&, i&, n%, j%, ncolmax%, resu()
With [A1].CurrentRegion
    ncol = .Columns.Count
    If ncol = 1 Then ncol = 2
    tablo = .Resize(, ncol) 'matrice, plus rapide, au moins 2 éléments
End With
nlig = UBound(tablo) - 1
For i = 2 To nlig + 1
    n = 0
    For j = 2 To ncol
        If tablo(i, j) <> "" Then
             n = n + 1
             If n > ncolmax Then ncolmax = n: ReDim Preserve resu(1 To nlig, 1 To ncolmax)
             resu(i - 1, n) = tablo(i, j)
        End If
Next j, i
'---restitution---
With [B8] '1ère cellule de restitution, à adapter
    If ncolmax Then .Resize(nlig, ncolmax) = resu
    If nlig Then .Offset(, ncolmax).Resize(nlig, Columns.Count - ncolmax - .Column + 1).ClearContents 'RAZ à droite
End With
MsgBox "Le résultat est un tableau de " & nlig & " lignes et " & ncolmax & " colonnes"
End Sub
A+
 

Pièces jointes

  • Tableau(1).xlsm
    18.7 KB · Affichages: 23

Pounet95

XLDnaute Occasionnel
Re,
Ok, j'ai fait la même chose, MAIS, c'est dans la façon de vouloir utiliser le résultat que je me plante.
Pour ce que je veux faire, il faut donc que je créé 4 tableaux Tbl1 à Tbl4 avec chacun le nombre d'éléments recherché dans ma question de départ et non plus un tableau à 2 dimensions.
Ainsi au lieu de TBL(2,4) j'aurais TBL2(4) et UBound(TBL2) me ramènera 4.

Ensuite, ayant peu de tableaux à utiliser, une structure comme ci-dessous devrait "le faire"

Select Case ndx
case 1
nb=ubound(TBL1)
case 2
nb=ubound(TBL2)
case else
end select

Merci
Bonne soirée
Claude
 

laurent950

XLDnaute Accro
Bonsoir,

VB:
Sub test()
Dim FD As Worksheet
    Set FD = Worksheets("Feuil1")
' tableau Base
Dim TbBase() As Variant
    TbBase = FD.Range("F6:O" & FD.Range("E999999").End(xlUp).Row).Value
' Tableau Temporaire
Dim Ttemp() As Variant
' Sous tableaux (4 sous tableaux)
Dim TbBis(1 To 4) As Variant
Dim i As Integer, j As Integer
    For i = LBound(TbBase, 1) To UBound(TbBase, 1)
        ReDim Ttemp(1 To 1)
            For j = LBound(TbBase, 2) To UBound(TbBase, 2)
                If TbBase(i, j) <> Empty Then
                    Ttemp(UBound(Ttemp)) = j
                    ReDim Preserve Ttemp(1 To UBound(Ttemp) + 1)
                End If
            Next j
        ReDim Preserve Ttemp(1 To UBound(Ttemp) - 1)
        TbBis(i) = Ttemp
        Erase Ttemp
    Next i
' Les Resultats des sous Tableaux : TbBis(1)/TbBis(2)/TbBis(3)/TbBis (4)
    For i = LBound(TbBis, 1) To UBound(TbBis, 1)
        For j = LBound(TbBis(i), 1) To UBound(TbBis(i), 1)
            Res = Res & vbLf & "TbBis(" & i & ")(" & i & "," & j & ")= " & "Tbl(" & i & "," & TbBis(i)(j) & ")"
        Next j
        Res = Res & vbLf & "--------------------"
    Next i
MsgBox Res
' Libére la mémoire
    i = Empty: j = Empty
    Erase TbBis, TbBase
    Set FD = Nothing
End Sub
 
Dernière édition:

job75

XLDnaute Barbatruc
Salut laurent950,

Il est évident que si l'on utilise 4 tableaux à une dimension c'est bien plus laborieux, fichier (2) :
VB:
Sub Resultat()
Dim nlig&, ncol%, tablo, resu1(), resu2(), resu3(), resu4(), n%, nmax%
nlig = 5 'à adapter
With [A1].CurrentRegion
    ncol = .Columns.Count
    If ncol = 1 Then ncol = 2
    tablo = .Resize(nlig, ncol) 'matrice, plus rapide, au moins 2 éléments
End With
Remplir nlig, ncol, tablo, 2, resu1, n: nmax = n
Remplir nlig, ncol, tablo, 3, resu2, n: If n > nmax Then nmax = n
Remplir nlig, ncol, tablo, 4, resu3, n: If n > nmax Then nmax = n
Remplir nlig, ncol, tablo, 5, resu4, n: If n > nmax Then nmax = n
MsgBox "Nombre maximum de colonnes : " & nmax, , "Résultat"
End Sub

Sub Remplir(nlig&, ncol%, tablo, i&, resu(), nmax%)
Dim j%, n%
nmax = 0
For j = 2 To ncol
    If tablo(i, j) <> "" Then
        n = n + 1
        ReDim Preserve resu(1 To n) 'tableau a une dimension (vecteur horizontal)
        resu(n) = tablo(i, j)
    End If
Next
'---restitution---
With Cells(i + nlig + 1, 2) 'à adapter
    If n Then .Resize(, n) = resu: nmax = n
    .Offset(, n).Resize(, Columns.Count - n - .Column + 1).ClearContents 'RAZ à droite
End With
End Sub
 

Pièces jointes

  • Tableau(2).xlsm
    19.5 KB · Affichages: 4
Dernière édition:

Statistiques des forums

Discussions
312 196
Messages
2 086 101
Membres
103 116
dernier inscrit
kutobi87