XL 2016 Variables tableau

knaekes

XLDnaute Occasionnel
Bonjour,

Je souhaite réaliser une synthèse de données à l'aide de variables tableaux.
Je suis parvenu à remplir une partie du tableau mais les sommes des chiffres ne correspondent pas encore au tableau que je veux obtenir

→ Fichier exemple en pièce jointe

Est-ce que quelqu'un saurait comment faire? Merci d'avance pour votre aide.
 

Pièces jointes

  • synthèse d'un tableau de données 2.xlsm
    21 KB · Affichages: 10

vgendron

XLDnaute Barbatruc
Hello

en PJ une solution avec quelques prérequis
1) nommer les tableaux Version 1 2 3 4 comme des plages nommées (voir gestionnaire de nom)
2) dans la feuille Synthèse: en ligne 2 : mettre les noms Version4 3 2 1 avec la meme syntaxe que le nom des plages nommées (sans espace)
3) formule dans le tableau

note: pour la version 1: ton résultat attendu n'est pas bon pour NT4: tu mets 35 (qui est la somme de NT4 + NT5)
 

Pièces jointes

  • synthèse d'un tableau de données 2.xlsm
    23.6 KB · Affichages: 3

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonsoir Knaekes, Vgendron,
Un essai avec la fonction perso suivante :
VB:
Function ValNT(Version$, NT$)
Dim Ligne%, Colonne%, L%
With Sheets("données")
    Ligne = 1
    ' Recherche ligne où figure les N° de versions
    While Application.CountIf(.Range(Ligne & ":" & Ligne), "Version*") = 0
        Ligne = Ligne + 1
        If Ligne = 100 Then Exit Function       ' On part du principe que le tableau sera avant la ligne 100
    Wend
    ' Recherche colonne où figure la version demandée
    If Application.CountIf(.Range(Ligne & ":" & Ligne), Version) = 0 Then
        ValNT = "": Exit Function               ' On sort car Version non trouvée
    Else
        Colonne = Application.Match(Version, .Range(Ligne & ":" & Ligne), 0) + 2 ' Les NT se trouvent 2 colonnes après Version
    End If
    ' Fait la somme des bons NT trouvés dans la bonne colonne
    For L = 1 To 100
        If .Cells(L, Colonne) = NT Then
            ValNT = ValNT + .Cells(L, Colonne - 1)
        End If
    Next L
    If ValNT = 0 Then ValNT = ""
End With
End Function
 

Pièces jointes

  • synthèse d'un tableau de données 2.xlsm
    27.6 KB · Affichages: 5

vgendron

XLDnaute Barbatruc
pardon; je n'avais pas vu la macro et le fait qu'un NTx pouvait apparaitre plusieurs fois sur une meme version

Avant de pouruivre.. peux tu expliquer la gestion des versions?
peut il y avoir plus de 4 versions?
La version vide.. peut elle etre mise ailleurs? Version Total: est elle utile dans la feuille Données?

le tableau à gauche avec Colonnes NTA NTB NTC NTD: a quoi sert il? est ce un tableau de données d'entrées ?
peut il etre mis ailleurs?
au sujet des NTx: pas de NT3 ==> ca veut dire qu'on ne sait pas à l'avance combien de NTx peuvent etre trouvés?: ca peut aller jusqu'à un nombre défini ?
 

knaekes

XLDnaute Occasionnel
pardon; je n'avais pas vu la macro et le fait qu'un NTx pouvait apparaitre plusieurs fois sur une meme version

Avant de pouruivre.. peux tu expliquer la gestion des versions?
peut il y avoir plus de 4 versions?
La version vide.. peut elle etre mise ailleurs? Version Total: est elle utile dans la feuille Données?

le tableau à gauche avec Colonnes NTA NTB NTC NTD: a quoi sert il? est ce un tableau de données d'entrées ?
peut il etre mis ailleurs?
au sujet des NTx: pas de NT3 ==> ca veut dire qu'on ne sait pas à l'avance combien de NTx peuvent etre trouvés?: ca peut aller jusqu'à un nombre défini ?
- oui il peut y avoir bien plus de "versions" et dans mon tableau actuel j'en ai déjà 95
- le tableau de gauche avec les colonnes ne peut pas être déplacé et est effectivement un tableau qui contient des entrées.
- oui le nombre de NT n'est pas défini et est variable
 

knaekes

XLDnaute Occasionnel
Merci à tous vos retours, mais je souhaite vraiment trouver l'erreur dans la macro avec les variables tableaux du fichier original. J'ai l'impression de ne pas être loin de la solution mais je n'ai pas trouvé mon erreur. Si quelqu'un maîtrise les variables tableaux ce serait super de pourvoir jeter un coup d'oeil à mon fichier.
 

laurent950

XLDnaute Barbatruc
Bonsoir

Je vous laisse ajouter le Total :

VB:
Sub TotalTest()
Dim f1, f2 As Worksheet
  Set f1 = Worksheets("données")
  Set f2 = Worksheets("synthese")
 
' Feuille "données"
    lignefin = f1.Range("e65535").End(xlUp).Row
    ausmassfin = f1.Range("AAA3").End(xlToLeft).Column - 6
    colonnechapitre = 2
    finrecap = ausmassfin
    a = f1.Range(Cells(3, colonnechapitre).Address & ":" & Cells(lignefin, finrecap).Address)
 
    nbraussmass = 0
  Set d1 = CreateObject("Scripting.Dictionary"): j = 1
  Set d2 = CreateObject("Scripting.Dictionary"): jj = 1
  Set d3 = CreateObject("Scripting.Dictionary")
 
  'remplir d1 liste verticale
  For i = LBound(a, 1) + 6 To UBound(a, 1)
    If a(i, 9) = "x" Then
        For Z = LBound(a, 2) + 16 To UBound(a, 2) Step 4
            If Not d1.exists(a(i, Z)) And a(i, Z) Like "NT*" Then j = j + 1: d1.Add Key:=a(i, Z), Item:=a(i, Z) & "|" & j
            If Not d2.exists(a(1, Z - 2)) Then jj = jj + 1: d2.Add Key:=a(1, Z - 2), Item:=a(1, Z - 2) & "|" & jj
            If Not d3.exists(Z) Then nbraussmass = nbraussmass + 1: d3(Z) = nbraussmass
        Next Z
    End If
  Next i
 
  'definir taille b
  nbraussmass = d3.Count + 2
  Dim b(): ReDim b(1 To d1.Count + 2, 1 To nbraussmass)
  Clefd1 = d1.keys                 'Get the keys
  Clefd2 = d2.keys                 'Get the keys
 
  ' 2) Tri du tableau
For i = LBound(Clefd2) To UBound(Clefd2) - 1
    For j = i + 1 To UBound(Clefd2)
        If Clefd2(i) > Clefd2(j) Then
            OrdreTemporaire = Clefd2(j)
            Clefd2(j) = Clefd2(i)
            Clefd2(i) = OrdreTemporaire
        End If
    Next j
Next i

For i = LBound(Clefd1) To UBound(Clefd1) - 1
    For j = i + 1 To UBound(Clefd1)
        If Clefd1(i) > Clefd1(j) Then
            OrdreTemporaire = Clefd1(j)
            Clefd1(j) = Clefd1(i)
            Clefd1(i) = OrdreTemporaire
        End If
    Next j
Next i

  For i = LBound(b, 1) + 1 To UBound(b, 1) - 1
    For j = LBound(b, 2) + 1 To UBound(b, 2) - 1
        b(i, 1) = Clefd1(i - 2)
        b(1, j) = Clefd2(j - 2)
    Next j
 Next i
  
  'remplir b
  For ligne = LBound(a, 1) + 7 To UBound(a, 1)
    If a(ligne, 9) = "x" Then
        For Colonne = LBound(a, 1) + 16 To UBound(a, 2) Step 4
            If a(ligne, Colonne) Like "NT*" Then
                p = d1.Item(a(ligne, Colonne))
                Lg = CInt(Split(p, "|")(1))
                    For v = LBound(b, 2) + 1 To UBound(b, 2) - 1
                        If b(1, v) = a(1, Colonne - 2) Then
                            b(Lg, v) = b(Lg, v) + a(ligne, Colonne - 1)
                            b(UBound(b, 1), v) = b(UBound(b, 1), v) + b(Lg, v)
                            b(Lg, UBound(b, 2)) = b(UBound(b, 2), v) + b(Lg, v)
                            Exit For
                        End If
                    Next v
            End If
     Next Colonne
  End If
  Next ligne

  'positionner le tableau
  f2.[a15].Resize(UBound(b, 1), UBound(b, 2)) = b

End Sub
 

Discussions similaires

Réponses
16
Affichages
829
Réponses
19
Affichages
369
Réponses
18
Affichages
889

Statistiques des forums

Discussions
314 488
Messages
2 110 131
Membres
110 679
dernier inscrit
lpierr