IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Problème Transposée de Matrice sous vba


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Stagiaire
    Inscrit en
    Juin 2018
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2018
    Messages : 40
    Par défaut Problème Transposée de Matrice sous vba
    Bonjour à tous, J'ai un soucis avec la fonction transposé. Le problème est que quand je fais la transposée d'une matrice de 132000 lignes, il me retourne une la transposée mais pour seulement 1730 lignes au lieu de me retourner la transposée de ma matrice complète. J'ai mis en PJ une photo du problème. je mets aussi mon code.
    Code vba : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
     
    Sub joel()
     
    Dim T_colA, T_colB, T_colC, T_colD, N As Double, A As Worksheet, b
    Dim Tableau
    Dim Dico As Object, Cptr As Double, Nbre_uniq As Double, ref
    Dim T_uniq, T_outGrele, T_outTemp, T_outARC, filtre As Integer
    Dim Cptr_u As Double, Nbre_lig As Double, Nbre As Double, SommeGrele As Double, SommeTemp As Double, SommeARC As Double
    Dim Start As Single
    'Calcul du temps d'exécution de ma macro avec Start = Timer en début de macro, l'affichage se fera avec Msgbox en fin de macro
    Start = Timer
     
    'N = 14
    Set A = Worksheets("Test résultats")
    N = A.Cells(Rows.Count, 1).End(xlUp).Row
    ReDim T_colA(N), T_colB(N), T_colC(N)
    With A
    '     Derlig = .Columns(1).Find("*", , , , , xlPrevious).Row
     
         'variables tableaux source
    '     Tableau = .Range("A2:A" & N).Value
         T_colA = Application.WorksheetFunction.Transpose(.Range("A2:A" & N).Value)
         T_colB = Application.Transpose(.Range("B2:B" & N).Value)
         T_colC = Application.Transpose(.Range("C2:C" & N).Value)
         T_colD = Application.Transpose(.Range("D2:D" & N).Value)
         'liste des uniques
         Set Dico = CreateObject("scripting.dictionary")
         For Cptr = 1 To UBound(T_colA)
              ref = T_colA(Cptr)
              If Not Dico.exists(ref) Then
                   Dico.Add ref, 0
              End If
           Next
           Nbre_uniq = Dico.Count
           T_uniq = Dico.keys
           ReDim T_outGrele(0 To Nbre_uniq - 1)
           ReDim T_outTemp(0 To Nbre_uniq - 1)
           ReDim T_outARC(0 To Nbre_uniq - 1)
     
           For Cptr_u = 0 To UBound(T_uniq)
              'nombre de lignes ayant la valeur de T_uniq
    '          filtre = UBound(Filter(T_colA, T_uniq(Cptr_u), True))
              Nbre_lig = UBound(Filter(T_colA, T_uniq(Cptr_u), True)) + 1
              SommeGrele = 0
              SommeTemp = 0
              SommeARC = 0
              Nbre = 0
              For Cptr = 1 To UBound(T_colA)
     
                   If Nbre = Nbre_lig Then Exit For 'boucle que sur le nombre de ligne de l'unique en cours
                   If T_uniq(Cptr_u) = T_colA(Cptr) Then
                        SommeGrele = SommeGrele + T_colB(Cptr)
                        SommeTemp = SommeTemp + T_colC(Cptr)
                        SommeARC = SommeARC + T_colD(Cptr)
                        Nbre = Nbre + 1
                   End If
              Next Cptr
              T_outGrele(Cptr_u) = SommeGrele
              T_outTemp(Cptr_u) = SommeTemp
              T_outARC(Cptr_u) = SommeARC
           Next Cptr_u
    End With
     
    With A
         .Range("F2").Resize(Nbre_uniq, 1) = Application.Transpose(T_uniq)
         .Range("G2").Resize(Nbre_uniq, 1) = Application.Transpose(T_outGrele)
         .Range("H2").Resize(Nbre_uniq, 1) = Application.Transpose(T_outTemp)
         .Range("I2").Resize(Nbre_uniq, 1) = Application.Transpose(T_outARC)
         .Activate
    End With
    Application.ScreenUpdating = True
    MsgBox "Durée du traitement: " & Timer - Start & " secondes"
    End Sub

    Merci d'avance à ceux qui voudront m'aider.
    Images attachées Images attachées  

  2. #2
    Membre expérimenté

    Homme Profil pro
    Technical Account Manager
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technical Account Manager

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Billets dans le blog
    1
    Par défaut
    Bonjour ayudame_joel,

    As-tu des lignes masquées dans ton onglet "Test résultats" ?
    La fonction End(xlUp).Row ne prend pas en compte les lignes masquées.
    Ce qui fait que dans ta macro l'indice N = nombre de lignes de ton tableau - nombre de lignes masquées avec cette fonction.

    Je reste disponible pour plus d'explications sur ce sujet,

    Cordialement,
    BDA53

  3. #3
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Bonjour,

    Si la proposition de BDA53 ne suffit pas, peux tu mettre une capture d'écran de ta feuille à la ligne 1730 ?

  4. #4
    Membre averti
    Homme Profil pro
    Stagiaire
    Inscrit en
    Juin 2018
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2018
    Messages : 40
    Par défaut
    Citation Envoyé par BDA53 Voir le message
    Oui je confirme ce que halaster08 dit dans son post une ligne masquée n'est pas une ligne vide.

    D'ailleurs tu devrais répondre à sa question :


    Tes tableaux s'arrêtent tous à 1730 lorsque tu utilises ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    N = A.Cells(Rows.Count, 1).End(xlUp).Row
    Il doit se passer quelque-chose en ligne 1730, que contient-elle ?
    ah oui désole, j'ai oublié d'afficher.
    Images attachées Images attachées  

  5. #5
    Membre averti
    Homme Profil pro
    Stagiaire
    Inscrit en
    Juin 2018
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2018
    Messages : 40
    Par défaut
    je pense que le problème n'a rien à avoir avec la ligne 1730 car quand je prends un N=100 000 par exemple, il ne transpose que les 34 463 1ères données (donc jusqu'à la ligne 34 463). Je pense vraiment que le problème vient de la limite de la fonction transposé.

  6. #6
    Membre expérimenté

    Homme Profil pro
    Technical Account Manager
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technical Account Manager

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Billets dans le blog
    1
    Par défaut
    Bonjour ayudame_joel,

    ça donne quoi la solution que tu as trouvée, elle fonctionne pour ton programme ?

  7. #7
    Membre averti
    Homme Profil pro
    Stagiaire
    Inscrit en
    Juin 2018
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2018
    Messages : 40
    Par défaut
    Citation Envoyé par BDA53 Voir le message
    Bonjour ayudame_joel,

    As-tu des lignes masquées dans ton onglet "Test résultats" ?
    La fonction End(xlUp).Row ne prend pas en compte les lignes masquées.
    Ce qui fait que dans ta macro l'indice N = nombre de lignes de ton tableau - nombre de lignes masquées avec cette fonction.

    Je reste disponible pour plus d'explications sur ce sujet,

    Cordialement,
    BDA53
    Merci pour ta réponse. En parlant de lignes masquées, fais tu allusion à des cellules vides? Si oui, non j'ai pas de lignes masquées.
    Je me demande bien s'il n'y a pas une limite données prises en compte dans l'utilisation de la fonction transposé.

    Citation Envoyé par ayudame_joel Voir le message
    Merci pour ta réponse. En parlant de lignes masquées, fais tu allusion à des cellules vides? Si oui, non j'ai pas de lignes masquées.
    Je me demande bien s'il n'y a pas une limite données prises en compte dans l'utilisation de la fonction transposé.
    Je me demande cela parce que lorsque je lance ma macro en utilisant un N=20 000, il fait exactement la transposée de mes 20 000 données. Je vais essayer pour un N=65 537 car cette fonction sous Excel 2007 ne prends en compte que 65 536 lignes.

  8. #8
    Membre averti
    Homme Profil pro
    Stagiaire
    Inscrit en
    Juin 2018
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2018
    Messages : 40
    Par défaut
    Effectivement, c'est ce dont je m'en doutais. Cette fonction à une limite. J'ai essayé pour N=65 537 et il ne me transpose que les 65 536. Et en essayant pour N=65 538, la même il pète un cable mdr, il ne transpose qu'une seule valeur. Résultats en PJ. Auriez-vous une idée de comment contourner le problème?
    Images attachées Images attachées   

  9. #9
    Membre averti
    Homme Profil pro
    Stagiaire
    Inscrit en
    Juin 2018
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2018
    Messages : 40
    Par défaut
    J'ai trouvé une solution que je vais tester et vous en donner des nouvelles. A toutes
    https://www.commentcamarche.com/faq/...riable-tableau

  10. #10
    Expert confirmé
    Homme Profil pro
    Responsable des études
    Inscrit en
    Juillet 2014
    Messages
    2 680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Aude (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Responsable des études
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2014
    Messages : 2 680
    Par défaut
    Citation Envoyé par ayudame_joel Voir le message
    Merci pour ta réponse. En parlant de lignes masquées, fais tu allusion à des cellules vides? Si oui, non j'ai pas de lignes masquées.
    Je me demande bien s'il n'y a pas une limite données prises en compte dans l'utilisation de la fonction transposé.
    Non une ligne masqué ce n'est pas une ligne vide, tu peux en sélectionnant une ou plusieurs ligne les masquée via le clic droit -> Masquer

    A ma connaissance la seule limite à la transposition c'est le nombre de colonne soit 16384 pour Excel 2007 d'après ce lien:https://support.office.com/fr-fr/art...AA=Office*2007

  11. #11
    Membre averti
    Homme Profil pro
    Stagiaire
    Inscrit en
    Juin 2018
    Messages
    40
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Stagiaire
    Secteur : Finance

    Informations forums :
    Inscription : Juin 2018
    Messages : 40
    Par défaut
    Citation Envoyé par halaster08 Voir le message
    Non une ligne masqué ce n'est pas une ligne vide, tu peux en sélectionnant une ou plusieurs ligne les masquée via le clic droit -> Masquer

    A ma connaissance la seule limite à la transposition c'est le nombre de colonne soit 16384 pour Excel 2007 d'après ce lien:https://support.office.com/fr-fr/art...AA=Office*2007
    Ah je comprends ce que tu dis. Je n'ai pas de lignes masquées. Mais la limitation selon le nombre de lignes à pouvoir transposer est vraie je pense. Je ne suis pas le seul à avoir déjà eu ce genre de problème. Je vais tester la solution trouvée et vous tenir informer.

  12. #12
    Membre expérimenté

    Homme Profil pro
    Technical Account Manager
    Inscrit en
    Avril 2015
    Messages
    224
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Technical Account Manager

    Informations forums :
    Inscription : Avril 2015
    Messages : 224
    Billets dans le blog
    1
    Par défaut
    Merci pour ta réponse. En parlant de lignes masquées, fais tu allusion à des cellules vides? Si oui, non j'ai pas de lignes masquées.
    Je me demande bien s'il n'y a pas une limite données prises en compte dans l'utilisation de la fonction transposé.
    Oui je confirme ce que halaster08 dit dans son post une ligne masquée n'est pas une ligne vide.

    D'ailleurs tu devrais répondre à sa question :
    peux tu mettre une capture d'écran de ta feuille à la ligne 1730 ?
    Tes tableaux s'arrêtent tous à 1730 lorsque tu utilises ce code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    N = A.Cells(Rows.Count, 1).End(xlUp).Row
    Il doit se passer quelque-chose en ligne 1730, que contient-elle ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Problème d'execution javascript sous VBA Access
    Par lololebricoleur dans le forum VBA Access
    Réponses: 1
    Dernier message: 31/10/2013, 11h23
  2. [XL-2003] Problème fonction recherche / remplacer sous VBA
    Par DVano dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 01/04/2010, 12h13
  3. matrice sous VBA
    Par sash6 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 19/12/2007, 14h35
  4. dimension d'une matrice sous VBA
    Par galaguiloe dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 22/06/2007, 11h20
  5. Problème : modifier une matrice sous contraintes
    Par andjeo dans le forum Algorithmes et structures de données
    Réponses: 44
    Dernier message: 27/03/2006, 17h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo