Optimiser code vba
Résolu/Fermé
tobas
Messages postés
210
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
8 septembre 2014
-
Modifié par tobas le 24/07/2013 à 16:07
tobas Messages postés 210 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 8 septembre 2014 - 18 sept. 2013 à 13:32
tobas Messages postés 210 Date d'inscription jeudi 23 novembre 2000 Statut Membre Dernière intervention 8 septembre 2014 - 18 sept. 2013 à 13:32
A voir également:
- Optimiser code vba
- Optimiser son pc - Accueil - Utilitaires
- Code asci - Guide
- Code puk bloqué - Guide
- Optimiser windows 10 - Guide
- Code telephone oublié - Guide
2 réponses
tobas
Messages postés
210
Date d'inscription
jeudi 23 novembre 2000
Statut
Membre
Dernière intervention
8 septembre 2014
24
7 août 2013 à 10:25
7 août 2013 à 10:25
bonjour et merci d'avoir répondu,
pour le point 1
toutes les lignes sont remplies donc pas de vide
pour le point 2
je passe par une feuille ou je compare mes entêtes de mes deux fichiers (excel et csv) car les titres des colonnes sont différentes dans les fichiers
pour le csv c'est un fichier texte separe par ";" et des commentaires sont entre guillemet
j'ai déjà un peu optimiser le code en mettant la mise en page à la fin du code et en regroupant les mise en forme
encore merci d'avoir pris du temps pour moi
pour le point 1
toutes les lignes sont remplies donc pas de vide
pour le point 2
je passe par une feuille ou je compare mes entêtes de mes deux fichiers (excel et csv) car les titres des colonnes sont différentes dans les fichiers
pour le csv c'est un fichier texte separe par ";" et des commentaires sont entre guillemet
j'ai déjà un peu optimiser le code en mettant la mise en page à la fin du code et en regroupant les mise en forme
encore merci d'avoir pris du temps pour moi
philmtjn
Messages postés
59
Date d'inscription
mardi 3 août 2004
Statut
Membre
Dernière intervention
26 juillet 2017
4
Modifié par philmtjn le 6/08/2013 à 20:34
Modifié par philmtjn le 6/08/2013 à 20:34
Bonjour,
1/
déjà, le fait de repérer la dernière ligne non-vide ('*** repérage dernière ligne ), il faut être sûr qu'il n'y a pas de cellule vide en colonne A sur une ligne qui n'est pas la dernière... Il vaut mieux se placer en bas du tableau et chercher en remontant en prenant une colonne où l'on sait qu'il y a des valeurs sur toutes les lignes.
En admettant que la colonne A n'est jamais vide quelque soit la ligne, cela donne :
DerLigFichActif=[A65535].End(xlUp).row
à la place de tout le bloc qui s'intitule : '*** repérage dernière ligne dans l'Import des données.
2/
dans le "relevé des entêtes" ... il me semble que la récupération est à l'envers... il y a un entête par ligne ???
ne serait-ce pas plutot :
'***Relevé des entêtes de colonnes ******************************
ReDim ColCSV(44) As String
ReDim ColGlobal(44) As String
Sheets("Emplacement").Select 'on recupere les entetes des deux fichiers pour
For i = 1 To 44 'faire des comparaisons
ColCSV(i) = Cells(2,i+ 2)
ColGlobal(i) = Cells( 4,i+ 2)
Next i
Ca voudrait dire qu'il y a 44 cellules impactées de gauche a droite de la cellule B2 à AS2 qui seraient rangés dans le tableau ColCSV
et de B4 à AS4 pour le tableau ColGlobal
ou si je pense que les colonnes sont cote à cote (de B2 à AS2 et de AT2 à CK2 soit AT+44+1) :
For i = 1 To 44 'faire des comparaisons
ColCSV(i) = Cells(2,i+ 2)
ColGlobal(i) = Cells( 2,i+ (44+1)+2) 'j'ai mis le détail du calcul, mais on peut mettre i+47
Next i
...Si c'est dans deux fichiers différents, il faut préciser le nom de chaque fichier et de l'onglet...
Pour gagner du temps, il vaut mieux récupérer des valeurs que de faire des copier/coller ... donc évitons .copy et .paste et recopions plutôt les valeurs qui se trouvent a l'intérieur des tableaux.
For i=ligneDebut to ligneFin
For j=colonneDebut to colonneFin
workbooks(nom du fichier recevant les données).sheets(nom de l'onglet).cells(i,j)= _
workbboks(nom du fichier source).sheets(onglet source).cells(i+decalageLigne entre les deux onglets,j+decalagecolonne entre les deux onglets)
next
next
cela ira BEAAAAUUUUCOUP plus vite. Il sera toujours possible de sélectionner les cellules non-vides d'une zone avec une instruction Excel et de tracer les lignes par un
selection.borders.LineStyle = xlContinuous
selection.borders..Weight = xlThin
pour toucher les 4 cotés de chaque cellule sélectionnée en même temps
... Je ne comprend pas trop la façon que vous utilisez pour récupérer le CSV (en l'ouvrant en définissant chacune des 44 colonnes (heureusement qu'iln'y en a pas 256...)
Il faudrait peut etre que je vois 5 lignes des CSV que vous avez a mettre dans le Excel.... mais comme ça, je pense qu'on peut aussi faire quelque chose...
le fichier CSV... est un fichier texte ? A-t-il des séparateurs entre les champs (genre une tabulation [chr(9)] ou un ; ??? les champs sont-ils entre " ou pas ???
On pourrait peut-etre le traiter comme un fichier séquentiel...
A voir ....
J'espère que mes remarques vous aideront
1/
déjà, le fait de repérer la dernière ligne non-vide ('*** repérage dernière ligne ), il faut être sûr qu'il n'y a pas de cellule vide en colonne A sur une ligne qui n'est pas la dernière... Il vaut mieux se placer en bas du tableau et chercher en remontant en prenant une colonne où l'on sait qu'il y a des valeurs sur toutes les lignes.
En admettant que la colonne A n'est jamais vide quelque soit la ligne, cela donne :
DerLigFichActif=[A65535].End(xlUp).row
à la place de tout le bloc qui s'intitule : '*** repérage dernière ligne dans l'Import des données.
2/
dans le "relevé des entêtes" ... il me semble que la récupération est à l'envers... il y a un entête par ligne ???
ne serait-ce pas plutot :
'***Relevé des entêtes de colonnes ******************************
ReDim ColCSV(44) As String
ReDim ColGlobal(44) As String
Sheets("Emplacement").Select 'on recupere les entetes des deux fichiers pour
For i = 1 To 44 'faire des comparaisons
ColCSV(i) = Cells(2,i+ 2)
ColGlobal(i) = Cells( 4,i+ 2)
Next i
Ca voudrait dire qu'il y a 44 cellules impactées de gauche a droite de la cellule B2 à AS2 qui seraient rangés dans le tableau ColCSV
et de B4 à AS4 pour le tableau ColGlobal
ou si je pense que les colonnes sont cote à cote (de B2 à AS2 et de AT2 à CK2 soit AT+44+1) :
For i = 1 To 44 'faire des comparaisons
ColCSV(i) = Cells(2,i+ 2)
ColGlobal(i) = Cells( 2,i+ (44+1)+2) 'j'ai mis le détail du calcul, mais on peut mettre i+47
Next i
...Si c'est dans deux fichiers différents, il faut préciser le nom de chaque fichier et de l'onglet...
Pour gagner du temps, il vaut mieux récupérer des valeurs que de faire des copier/coller ... donc évitons .copy et .paste et recopions plutôt les valeurs qui se trouvent a l'intérieur des tableaux.
For i=ligneDebut to ligneFin
For j=colonneDebut to colonneFin
workbooks(nom du fichier recevant les données).sheets(nom de l'onglet).cells(i,j)= _
workbboks(nom du fichier source).sheets(onglet source).cells(i+decalageLigne entre les deux onglets,j+decalagecolonne entre les deux onglets)
next
next
cela ira BEAAAAUUUUCOUP plus vite. Il sera toujours possible de sélectionner les cellules non-vides d'une zone avec une instruction Excel et de tracer les lignes par un
selection.borders.LineStyle = xlContinuous
selection.borders..Weight = xlThin
pour toucher les 4 cotés de chaque cellule sélectionnée en même temps
... Je ne comprend pas trop la façon que vous utilisez pour récupérer le CSV (en l'ouvrant en définissant chacune des 44 colonnes (heureusement qu'iln'y en a pas 256...)
Il faudrait peut etre que je vois 5 lignes des CSV que vous avez a mettre dans le Excel.... mais comme ça, je pense qu'on peut aussi faire quelque chose...
le fichier CSV... est un fichier texte ? A-t-il des séparateurs entre les champs (genre une tabulation [chr(9)] ou un ; ??? les champs sont-ils entre " ou pas ???
On pourrait peut-etre le traiter comme un fichier séquentiel...
A voir ....
J'espère que mes remarques vous aideront
7 août 2013 à 14:25
il est des fois difficile de voir le but final... et optimiser est des fois dangereux sans savoir ce qui sert ou pas.
C'est pour cela que je t'ai donné ces pistes.
si les colonnes sont dans le même ordre, on peut aussi voir le fichier CSV comme un "bête" fichier texte et le traiter ligne a ligne et on met a la suite du fichier destination en comptant les ;
premier champs (0) =colonne initiale.... 1 ; de trouvé ..... champs 1.... 20 ; de trouvé =colonne U (qui est la 20e+1 lettre de l'alphabet.....)
Ca évite d'avoir toute la partie de conversion...
Celà peut paraître compliqué vu comme ça.
Il faudrait avoir les fichiers pour tester en "vrai"
bonne optimisation
7 août 2013 à 14:40
18 sept. 2013 à 09:55
avez-vous lu ce qui est en dessous ?
cela a-t-il servi ?
bonne journée
18 sept. 2013 à 13:32
oui je l ai lu et j ai modifie certaines ligne de code par rapport à tes remarques
encore merci de ton aide