Optimisation macro VBA

  • Initiateur de la discussion Initiateur de la discussion suistrop
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

suistrop

XLDnaute Impliqué
Bonjour,

Maintenant que j arrive a me dépatouiller sous VBA, un autre probleme se pose, je n'optimise pas mon code .... au début ca allait mais j'utilise des copy d onglet dans nouveau classeur a tire larigot et je voudrais connaitre le code optimisé pour traiter cela.

Voila je vous met un tout petit exemple de ce que je cherche a optimiser, vous pouvez faire tourner la macro , ca creer un dossier essai a chaque fois.


Merci d avance
 

Pièces jointes

Re : Optimisation macro VBA

Bonjour


Tu peux remplacer
Code:
Cells.Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False

Par
Code:
With Cells
.Copy
.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks:= _
        False, Transpose:=False
End with

ou par
'adapter le nom de la feuille
Code:
With Sheets(1).Usedrange
.Value=.Value
End With
 
Re : Optimisation macro VBA

bonjour tuestrop

une possibilité

changer
Code:
Workbooks.Add.SaveAs _
        dossier_essai & fichier_foot

par
Code:
Workbooks.Add(xlWBATWorksheet).SaveAs _
        dossier_essai & fichier_foot

et supprimer:

Code:
'Windows(fichier_foot).Activate
    'Sheets(Array("Feuil1", "Feuil2", "Feuil3")).Delete

ps: je ne sais pas si tu veux une copie conforme ou non de ton fichier d'origine (Feuil1 ?)
 
Re : Optimisation macro VBA

Hello Pierrejean & crumble au vba

je veux juste exporter des onglets une fois que ces derniers son alimenté avec les bonne valeurs, le probleme je peux pas faire de "gros copier coller" du classeur initial vers le nouveau car ca ne rend pas pareil...

edit : apres ajout de vos modification, je gagne un peu mais ce n est pas suffisant... j aurais voulu savoir si vous connaissez pas des methode pour ecrire dans des nouveau classeurs sans les ouvrir et des méthodes de sauvegardes pipeline, ne pas attendre qu un fichier soit sauvegarder pour commencer la tache apres en VBA.
Sinon je n'aurai qu a me montrer patient !!
 
Dernière édition:
Re : Optimisation macro VBA

Bonjour,

Voici votre code que j'ai beaucoup remanié.
Sur ma machine et avec votre code j'obtiens 7.32 secondes alors qu'avec le mien j'obtiens 2.25 secondes
soit un temps divisé par un peu plus de 3. Qu'en est-il chez vous ?

ATTENTION : ce code nécessite une référence à Microsoft ActiveX Data Objects 2.x Library

Code:
'################################################################
'###      Nécessite une référence à Library ADODB             ###
'### C:\Program Files\Fichiers communs\System\ado\msado15.dll ###
###    Microsoft ActiveX Data Objects 2.x Library            ###
'################################################################

Sub test_pmo()
Dim WB1 As Workbook
Dim WB2 As Workbook
Dim S As Worksheet
Dim S2 As Worksheet
Dim fichier_outil As String
Dim essai As String
Dim dossier_base As String
Dim dossier_essai As String
Dim fichier_foot As String
Dim i&
Dim temps
Dim oConn As ADODB.Connection
Dim oCmd As ADODB.Command
Dim oRS As ADODB.Recordset

temps = Timer
Application.DisplayAlerts = False
Application.ScreenUpdating = False
Set WB1 = ThisWorkbook
'recupération du nom du fichier courant
fichier_outil = WB1.Name
'Pour plus de clarté je vais noté mon chemin de base de mon dossier
essai = "essai du " & Format(Now, "dd-mm-yyyy") & " à " & Format(Time$, "hh.mm.ss")
dossier_base = WB1.Path & "\"
dossier_essai = dossier_base & essai & "\"
'CREATION DU DOSSIER ESSAI
If Len(Dir(dossier_essai, vbDirectory)) = 0 Then MkDir dossier_essai
Set S = WB1.Sheets("football")
S.Copy after:=Sheets(S.Index)
Set S2 = ActiveSheet
With S2.Cells
  .Copy
  .PasteSpecial Paste:=xlPasteValues
End With
S2.[a1].Select
Application.CutCopyMode = False
' Creation du nouveau fichier
fichier_foot = "2_foot.xls"
Set WB2 = Workbooks.Add(xlWBATWorksheet)
'--- On ne copie l'onglet qu'une seule fois ---
S2.Copy after:=WB2.Sheets(1)
With WB2
  .Sheets(1).Delete
  .Sheets(1).Name = S.Name
  .SaveAs dossier_essai & fichier_foot
  .Close
End With
Set WB2 = Nothing
S2.Delete
Set S2 = Nothing
'--- On duplique, à l'identique, le fichier 18 fois (seule l'incrémentation du nom change) ---
For i = 3 To 20
  FileCopy dossier_essai & fichier_foot, dossier_essai & i & "_foot.xls"
Next i
'--- On utilise ADO pour accéder à chaque classeur fermé et y changer la valeur en C1 ---
For i = 2 To 20
  Set oConn = New ADODB.Connection
  oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
      "Data Source=" & dossier_essai & i & "_foot.xls" & ";" & _
      "Extended Properties=""Excel 8.0;HDR=No;"";"
  Set oCmd = New ADODB.Command
  With oCmd
    .ActiveConnection = oConn
    .CommandText = "SELECT * from " & Chr(96) & S.Name & "$" & "c1:c1" & Chr(96)
  End With
  Set oRS = New ADODB.Recordset
  With oRS
    .Open oCmd, , adOpenKeyset, adLockOptimistic
    oRS(0).Value = i
    .Update
  End With
  oConn.Close
  Set oConn = Nothing
  Set oCmd = Nothing
  Set oRS = Nothing
Next i
Application.DisplayAlerts = True
Application.ScreenUpdating = True
MsgBox Timer - temps & " secondes"
End Sub

Cordialement.

PMO
Patrick Morange
 
Re : Optimisation macro VBA

Merci PMO d avoir pris le tps de te pencher sur mon probleme,

Je n arrive pas a executer le code erreur ici ...
Code:
  oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
      "Data Source=" & dossier_essai & i & "_foot.xls" & ";" & _
      "Extended Properties=""Excel 8.0;HDR=No;"";"

Mais ce n est pas primordiale.

En effet le fichier que j ai donné en exemple a du te tromper car trop simplifier.

la case en C1 me permet de mettre a jour les formules de la feuille.De plus je ne peux pas dans un premier temps creer mes fichier puis y coller les onglets car en faite dans les fichier ce sont différent onglet qui vont etre colle a chaque fois en fct de critere.il y aura "football" mais aussi peut etre championnnat.... j'étais tomber sur ce genre de programmation sur le forum developez.com mais j ai vite abandonner car cela ne semble pas pratique pour ce que je cherche a sortir :/

Toujours est il que je vais garder ce code, car c est un excellent exemple d'ecriture dans fichier fermé.

Merci !!!
 
Re : Optimisation macro VBA

Bonjour,

En ce qui concerne l'erreur, je pense qu'elle est causée par une différence de version d'Excel (chez moi 2003, chez vous 2007).
Essayez de changer la portion de code incriminée par le code suivant

Code:
  oConn.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _
      "Data Source=" & dossier_essai & i & "_foot.xls" & ";" & _
      "Extended Properties=""Excel 12.0;HDR=No;"";"

où Excel 12.0 remplace Excel 8.0

Est-ce que cela fonctionne sur votre version Excel 2007 ?

Cordialement.

PMO
Patrick Morange
 
Re : Optimisation macro VBA

Bonjour,

Une dernière tentative avec le code suivant dans lequel le Provider a été modifié

Code:
  oConn.Open "Provider=Microsoft.ACE.OLEDB.12.0;" & _
      "Data Source=" & dossier_essai & i & "_foot.xls" & ";" & _
      "Extended Properties=""Excel 12.0;HDR=No;"";"

N'ayant pas Excel 2007 je n'ai pu testé.
Cela va-t-il enfin fonctionner !!!

PMO
Patrick Morange
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
10
Affichages
645
Réponses
10
Affichages
1 K
Réponses
1
Affichages
553
Réponses
18
Affichages
2 K
Réponses
7
Affichages
840
Réponses
19
Affichages
1 K
Retour