Excel

Zylott Messages postés 104 Date d'inscription jeudi 25 juillet 2002 Statut Membre Dernière intervention 28 septembre 2006 - 22 juin 2006 à 14:44
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 - 25 juin 2006 à 22:08
Bjr,

j'ai une application vb6 qui exporte des données sous Excel.
Mes tableau sont volumineux et l'export prend parfois 20 min car j'affecte cellule par cellule les valeurs.

MySheet.cells(1,1)="aaa"
MySheet.cells(1,2)="bbb"
...

N'y a t-il pas un moyen plus rapide ?
En affectant un tableau ?


Si vous avez un exemple , je suis preneur !


Merci




 

8 réponses

econs Messages postés 4030 Date d'inscription mardi 13 mai 2003 Statut Membre Dernière intervention 23 décembre 2008 24
22 juin 2006 à 14:54
Salut,

L'import dans Excel comme tu le fais prend beaucoup de temps. C'est normal.
Tu dois pouvoir gagner du temps en minimisant ta fenêtre Excel pendant l'opération (si ce n'est pas déjà fait).

Ensuite, il faudrait que l'on sache d'où proviennent tes données initiales. Peut-être ton algo n'est-il pas satisfaisant.

J'ai déjà fait ce genre d'import pour des ListView de plusieurs dizaines de milliers d'éléments dans Excel. J'ai fait pas mal de tests pour grapiller de précieuses minutes...
Par exemple, il ne faut pas sélectionner une cellule d'Excel, puis coller dans la sélection, mais faire Cells(i,j)="toto" comme tu le fais (on divise le temps d'exécution de beaucoup)...

Bref, avec ton code, on y verra sans doute plus clair.
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
22 juin 2006 à 15:15
Salut,

Je préciserai même que pour gagner du temps, rajoute ça :

objExcel.ScreenUpdating = False
' à placer avant écriture sur ton fichier excel




objExcel.ScreenUpdating = True

' à placer après écriture sur ton fichier excel














Bien entendu, remplace mon terme objExcel par ta déclaration. Ce code sert à enlever le rafraichissement d'excel et à le restaurer.

@++
<?xml:namespace prefix v ns "urn:schemas-microsoft-com:vml" /?><v:shapetype id="_x0000_t75" coordsize="21600,21600" o:spt="75" o:preferrelative="t" path="m@4@5l@4@11@9@11@9@5xe" filled="f" stroked="f"><v:stroke joinstyle="miter"></v:stroke><v:formulas><v:f eqn="if lineDrawn pixelLineWidth 0"></v:f><v:f eqn="sum @0 1 0"></v:f><v:f eqn="sum 0 0 @1"></v:f><v:f eqn="prod @2 1 2"></v:f><v:f eqn="prod @3 21600 pixelWidth"></v:f><v:f eqn="prod @3 21600 pixelHeight"></v:f><v:f eqn="sum @0 0 1"></v:f><v:f eqn="prod @6 1 2"></v:f><v:f eqn="prod @7 21600 pixelWidth"></v:f><v:f eqn="sum @8 21600 0"></v:f><v:f eqn="prod @7 21600 pixelHeight"></v:f><v:f eqn="sum @10 21600 0"></v:f></v:formulas><v:path o:extrusionok="f" gradientshapeok="t" o:connecttype="rect"></v:path><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" /?><o:lock v:ext="edit" aspectratio="t"></o:lock></v:shapetype>  Mortalino 

Le Mystérieux Chevalier "Provençal, le Gaulois"
N'oubliez pas de lire le règlement
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
23 juin 2006 à 00:43
bonsoir,

Dans le même esprit, il me semble qu'il faut également désactiver le recalcul automatique pendant le transfert. Et le rétablir ensuite.

Pour voir si cette option agit (comme il me semble), il suffit de faire un petit test manuellement... c'est à dire aller sous Excel et dans option>options>Calcul> et choisir sur ordre...
Bien sur on peut aussi le programmer... A adapter à ton cas tiré de mon site :

'Désactive la mise à jour des recalculs
Application.Calculation = xlCalculationManual
'code modifiant les cellules

For x = 1 To 4000
ActiveSheet.Cells(x, 1) = x
Next x

'Ré-activations
Application.Calculation = xlCalculationAutomatic

Amicalement,
Us.
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 juin 2006 à 20:20
Salut US,

il me semble que le fait de mettre "objExcel.ScreenUpdating = True" désactive dans tous les cas le recalcul d'excel.

@++

--Mortalino--
Le Mystérieux Chevalier "Provençal, le Gaulois"
N'oubliez pas de lire le règlement !
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
23 juin 2006 à 22:31
Bonsoir Mortalino,

Ah ?... JE ne pense pas que cela soit juste... mais je vérifierai demain... (je serai plus en forme)...

Amicalement,
Us.
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
23 juin 2006 à 22:58
Sans problème !! C'est pareil, je suis à la masse vu l'heure...

c'est juste que je suis utilisateur de VBA excel et voici un extrait de l'aide :
__________________________________________
Cette propriété a la valeur True si la mise à jour de l'écran est activée. Type de données Boolean en lecture-écriture.

Notes
Désactivez la mise à jour de l'écran pour accélérer l'exécution du code de votre macro. Vous ne pourrez suivre le déroulement de la macro mais en revanche celle-ci sera exécutée plus rapidement.

N'oubliez pas d'affecter de nouveau la valeur True à la propriété ScreenUpdating à la fin de la macro.
__________________________________________

Peut-être que depuis VB6 ça le fait pas !

@++

--Mortalino--
Le Mystérieux Chevalier "Provençal, le Gaulois"
N'oubliez pas de lire le règlement !
0
us_30 Messages postés 2065 Date d'inscription lundi 11 avril 2005 Statut Membre Dernière intervention 14 mars 2016 10
24 juin 2006 à 19:44
Salut,


donc après vérification, je confirme mes propos par un test : voici ce test (tiré de mon modeste site)




sub test





temps = Timer


'Désactive la mise à jour de l'affichage




Application.ScreenUpdating = False


'Désactive la mise à jour des recalculs






Application.Calculation = xlCalculationManual


'code modifiant les cellules






For x = 1 To 4000
ActiveSheet.Cells(x, 1) = x
Next x


'Ré-activations






Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True


MsgBox Timer – temps




end sub



IL suffit de mettre les lignes en REM pour vérifier les influences des options.

Optimisé par les deux options (ScreenUpdating et Calculation) j'ai environ un temps d'exécution de 1,4 s

Sans l'option Calculation (donc juste avec ScreenUpdating) : 2,1 secondes

Juste Calculation (sans ScreenUpdating) : 1,6 seconde

Sans aucune option : 1,9 seconde

On en conclut que ScreenUpdating n'empêche pas le recalcul automatique ! (il faut bien le mettre pour en profiter)

Notons aussi qu'ici ScreenUpdating a peu d'influence. Ceci s'explique facilement par le fait que le test n'emploi pas la propriété ".select" pour écrire dans les cellules...

Enfin, voilà...

Amicalement,
Us.
0
mortalino Messages postés 6786 Date d'inscription vendredi 16 décembre 2005 Statut Membre Dernière intervention 21 décembre 2011 18
25 juin 2006 à 22:08
Salut US,

Et bien merci pour ces test, et effectivement ça prouve que ton raisonnement est plus que bon. Pour ma part, jer n'utilisais que ScreenUpdating .. et bien maintenant j'emploierai les deux.

Merci pour les détails avec le Timer !

Bonne soirée à toi.

@++

--Mortalino--
Le Mystérieux Chevalier "Provençal, le Gaulois"
N'oubliez pas de lire le règlement !
0
Rejoignez-nous