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 :

Variable tableau et transpose


Sujet :

Macros et VBA Excel

  1. #1
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut Variable tableau et transpose
    Bonsoir ou bonjour à tou(te)s

    J'ai une variable tableau à 1 dimension qui peut contenir plus de 700000 données

    En faisant des essais, je me suis rendu compte que la fonction "transpose" ne cause pas de soucis pour 10 000 données mais me génère une erreur à 690 000 données
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'nomf est une variable string, tbcol mon tableau
    Sheets(nomF).Range("A1").Resize(UBound(Tbcol), 1) = WorksheetFunction.Transpose(Tbcol)
    je ne veux pas passer par une boucle, solution qui fonctionne, bien sur, mais allonge énormément le temps de traitement, donc ma question : quelqu'un connaitrait une parade ?
    ci-dessous l'erreur générée sur la ligne
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Bonsoir Dominique

    En effet, il y a une limitation dans l'utilisation de Transpose

    Pour détourner cette limitation, utilise un tableau à 2 dimensions qui ne nécessite pas de Transpose

    Exemple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Test()
    Const N As Long = 700000
    Dim i As Long
    Dim Tb(1 To N, 1 To 1) As Long
     
    For i = 1 To N
        Tb(i, 1) = Rnd()
    Next i
     
    Feuil1.Range("A1").Resize(N, 1) = Tb
    End Sub

  3. #3
    Expert éminent
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Par défaut
    Bonsoir Dominique,

    pourrais-tu tester avec = Application.Transpose(Tbcol), sait-on jamais …


  4. #4
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonsoir mercatog,
    Merci pour ta réponse, pour tout te dire car je pense que tu connais le fichier de Sylkiroad que j'avais posté pour utiliser les GIF animés, j'essaie d'améliorer celui-ci, notamment en temps d'exécution.

    le problème, c'est que je ne connais pas d'avance, la taille du tableau et passes par "Redim Préserve". Comme on ne peux pas redimensionner le tableau à 2 dimensions, j'ai corrigé le code en fonction. Je pourrais d'office, comme tu me le propose mettre "1 to 700 000" mais les fichiers GIF pourrons dépasser cette limite. Je me suis basé sur les fameux drapeaux Benin et France, aucun problème pour le drapeau français mais celui du Benin fait + de 690000 données. Je joins ci-dessous le code que j'avais préparé
    Code : 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
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    Private Sub CommandButton1_Click()
        Dim S As String, Dl As Long, Dc As Long
        Dim Hauteur As Long, Largeur As Long
        Dim nomF As String, Tbcol(), t2()
        Dim Fichier As Variant, col As Long
        Dim i As Long, F As Long, j As Long
        Dim b As Byte, mes As String
        Dim Feuille As Worksheet
        'Affichage de la la boîte de dialogue standard "Ouvrir" pour sélectionner une image GIF
        'sur le disque dur.
        'GetOpenFilename permet de lire le nom du fichier sélectionné par l'utilisateur sans
        'réellement ouvrir le fichier.
        Fichier = Application.GetOpenFilename("Fichiers Images (*.gif),*.gif")
        
        'Vérifie si l'utilisateur a cliqué sur le bouton "Annuler" ou sur la croix de fermeture.
        If Fichier = False Then
            MsgBox "Opération Annulée"
            'pour sortir de la procédure
            Exit Sub
        End If
        col = 0
        '----------- message pendant le transfert ----
        'Permet de créer un message d'attente défilant dans le WebBrowser pendant le transfert
        'des données (au format binaire) dans les cellules de la nouvelle feuille.
        LeTexte = "Veuillez patienter... traitement en cours ..."
        LaCouleur = "#CC0000"
        
        WebBrowser1.Navigate _
        "about:<html><body BGCOLOR ='#CCCCCC' scroll='no'><font color= " & LaCouleur & _
        " size='5' face='Arial'>" & _
        "<marquee>" & LeTexte & "</marquee></font></body></html>"
        '----------------------------------------------
        'Boucle sur les données binaire du fichier sélectionné et alimente la variable tableau
        F = FreeFile
        Open Fichier For Binary Access Read As F
        
        While Not EOF(F)
            Get #F, , b
            'DoEvents
            col = col + 1
            ReDim Preserve Tbcol(1 To col)
            Tbcol(col) = b
        Wend
        Close F
        nomF = InputBox("Si vous voulez sauvegarder l'image dans le fichier" & Chr(10) & "Choisir un nom pour" & Chr(10) & "la feuille qui contiendra l'image")
        'Ajoute une feuille dans le claseur et la positionne à la fin.
        If nomF <> "" Then
          Set Feuille = ThisWorkbook.Worksheets.Add(After:=Sheets(Sheets.Count))
          'Renomme la feuille
          Feuille.Name = nomF
          'Masque la feuille
          Feuille.Visible = xlSheetHidden
            '--- transfert des données dans la feuille ----
            'Boucle sur la variable tableau et transfère les données dans les cellules de la feuille de calcul.
          Sheets(nomF).Range("A1").Resize(UBound(Tbcol), 1) = WorksheetFunction.Transpose(Tbcol)
          'For i = 1 To UBound(Tbcol)
            'Sheets(nomF).Range("A" & i) = Tbcol(i)
          'Next i
          End If
          mes = MsgBox("voulez-vous voir l'image, dès maintenant ?", vbYesNo)
          If mes = 6 Then
            '----- Création de l'image pour un affichage dans l'USF -----
            S = "C:\Users\Dominique\Documents\imageTemp.gif"
            F = FreeFile
            Open S For Binary Access Write As F
            For i = 1 To UBound(Tbcol)
              b = Tbcol(i)
              Put #F, , b
              DoEvents
            Next i
          Close F
          'Définit les dimensions d'affichage de l'image dans le WebBrowser.
          Largeur = WebBrowser1.Width * 96 / 72
          Hauteur = WebBrowser1.Height * 96 / 72
        
          'Affiche l'image dans le WebBrowser en supprimant les marges et les barres de défilement
          WebBrowser1.Navigate _
          "ABOUT:<HTML><CENTER><HEAD><body scroll='no' LEFTMARGIN=0 TOPMARGIN=0><IMG WIDTH=" & _
              Largeur & " HEIGHT=" & Hauteur & _
              " SRC='" & S & "'</IMG></BODY></CENTER></HTML>"
    
          ' Affiche une page blanche dans le webBrowser
          'WebBrowser1.Navigate "about:blank"
          Else
            MsgBox "Opération terminée"
            'Ferme et réouvre l'UserForm (permet une réinitialisation rapide)
            Unload Me
            UserForm1.Show
          End If
    End Sub
    Merci encore de t'intéresser à mon problème

    Bonne soirée
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  5. #5
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Bonsoir Marc,

    Je n'avais pas vu ta réponse, merci, je peux essayer mais je ne pense pas que ça change quelque chose

    PS : après essai je confirme, ça ne passe pas

    Bonne soirée
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  6. #6
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Et si tu passes par un tableau intermédiaire?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Dim Res()
    '....
    ReDim Res(1 To col, 1 To 1)
    For i = 1 To col
        Res(i, 1) = Tbcol(i)
    Next i
     
    '.....
    Sheets(nomF).Range("A1").Resize(col, 1) = Res

  7. #7
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    Je vais essayer dès demain car la fatigue me gagne sérieusement, je te tiendrai au courant, si le résultat est correct je joindrai le fichier en essayant de le vider des lignes de code inutiles ainsi que des variables qui ne servent plus

    Bonne nuit à toi et à Marc
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  8. #8
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    bonsoir,

    et si tu lisais avec une variable dimensionnée sur la taille du fichier
    La fonction LOF te donne la taille d'un fichier ouvert.

    Essaye:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    Dim tbcol() as Byte,taille as long
    ...
    taille = FileLen(Fichier)
    Redim tbcol (1 to taille)
    Open Fichier For Binary Access Read As F
    Get #1, 1, trans'devra te remplir ton tableau
    Sinon regarde du côté de l'api RtlMoveMemory.

  9. #9
    Expert confirmé Avatar de casefayere
    Homme Profil pro
    RETRAITE
    Inscrit en
    Décembre 2006
    Messages
    5 138
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 71
    Localisation : France, Ardennes (Champagne Ardenne)

    Informations professionnelles :
    Activité : RETRAITE
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Décembre 2006
    Messages : 5 138
    Par défaut
    re le forum, NVCfrm, mercatog, Marc

    D'abord, je remercie également NVCfrm de m'avoir donné son conseil
    Suite à une combinaison des propositions de mercatog et de NVCfrm, j'ai obtenu un fichier correct en l'état de mes essais. Je ne peux pas juger du temps d'execution sur une image gourmande car je n'en ai pas trouvé, le drapeau du Benin que je testais chez moi (là, je suis ailleurs) était beaucoup plus conséquent que celui présenté dans le fichier joint. Au cas où vous ne souhaitez pas consulter le fichier, voici le code transformé :
    Code : 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
    ...
    ReDim Tbcol(1 To FileLen(Fichier), 1 To 1) 'ici adaptation de NVCfrm et de mercatog
        '----------- message pendant le transfert ----
        'Permet de créer un message d'attente défilant dans le WebBrowser pendant le transfert
        'des données (au format binaire) dans les cellules de la nouvelle feuille.
        LeTexte = "Veuillez patienter... traitement en cours ..."
        LaCouleur = "#CC0000"
     
        WebBrowser1.Navigate _
        "about:<html><body BGCOLOR ='#CCCCCC' scroll='no'><font color= " & LaCouleur & _
        " size='5' face='Arial'>" & _
        "<marquee>" & LeTexte & "</marquee></font></body></html>"
        '----------------------------------------------
        'Boucle sur les données binaire du fichier sélectionné et alimente la variable tableau
        i = 0
        F = FreeFile
        Open Fichier For Binary Access Read As F
     
        While Not EOF(F)
            Get #F, , b
            DoEvents
            i = i + 1
            If i <= FileLen(Fichier) Then Tbcol(i, 1) = b
        Wend
        Close F
    ...
    Bonne journée
    Cordialement,
    Dom
    _____________________________________________
    Vous êtes nouveau ? pour baliser votre code, cliquer sur cet exemple : Anomaly
    pensez à cliquer sur :resolu: si votre problème l'est
    Par contre, il est désagréable de voir une discussion résolue sans message final du demandeur (satisfaction, désarroi, remerciement, conclusion...)

  10. #10
    Membre extrêmement actif
    Avatar de NVCfrm
    Homme Profil pro
    Administrateur Système/Réseaux - Developpeur - Consultant
    Inscrit en
    Décembre 2012
    Messages
    1 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations professionnelles :
    Activité : Administrateur Système/Réseaux - Developpeur - Consultant
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2012
    Messages : 1 037
    Billets dans le blog
    5
    Par défaut
    Salut,

    Un exemple de lecture de fichiers binaire que j'ai préféré posté dans les contributions.
    http://www.developpez.net/forums/d13...aire-avec-get/

Discussions similaires

  1. Programme de variables tableau
    Par Wilvart dans le forum C++
    Réponses: 3
    Dernier message: 24/04/2006, 21h30
  2. [Tableaux] récuperer une variable tableau passé par URL
    Par molesqualeux dans le forum Langage
    Réponses: 2
    Dernier message: 23/12/2005, 01h12
  3. variables tableau dans requettes mysql ... et affichage
    Par mulbek dans le forum Requêtes
    Réponses: 3
    Dernier message: 26/10/2005, 16h29
  4. Problème d'initialisation variable tableau
    Par HeZiX dans le forum Langage
    Réponses: 3
    Dernier message: 08/06/2005, 16h30
  5. Acces à une variable-tableau de PHP
    Par Erwan21 dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 09/02/2005, 13h55

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