Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1166 connectés 

  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Petite amélioration d'un algo

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Petite amélioration d'un algo

n°1432357
acorsa
Posté le 28-08-2006 à 10:08:34  profilanswer
 

Bonjour,
J'ai créé une fonction il y a maintenant quelques mois qui permet de griser des mots d'un document Word si ceux-ci sont présents dans un fichier Excel.  
 
Sub search()
Dim objexcel As Excel.Application
Dim wbExcel As Excel.Workbook
Dim wsExcel As Excel.Worksheet
 
Set objexcel = CreateObject("Excel.Application" )
 
On Error GoTo fin
 
  '*************************** Recherche du fichier **************************
    If pathFile <> "null" Then
        Set wbExcel = objexcel.Workbooks.Open(pathFile)
        Set wsExcel = wbExcel.Worksheets(1)
        wsExcel.name = nameFile
    Else
        Set wbExcel = objexcel.Workbooks.Add
        wbExcel.SaveAs ("C:\monDossier\terms.xls" )
        Set wsExcel = wbExcel.Worksheets(1)
        wsExcel.name = "terms"
        MsgBox "A file named terms.xls was created. Terms will be saved into C:\monDossier\terms.xls."
    End If
    '*************************************************************************
 
objexcel.ActiveWorkbook.ActiveSheet.Cells("1" ).Select
Set wsExcel = wbExcel.Worksheets(1)
Set sheet = objexcel.ActiveWorkbook.ActiveSheet
 
Selection.StartOf Unit:=wdStory
 
Selection.Find.ClearFormatting
Selection.Find.Replacement.ClearFormatting
 
 
'************ Recherche des termes déjà stockés ***************
While objexcel.ActiveCell.Offset(cpt, 0).Value <> ""
    With Selection.Find
            .ClearFormatting
            .text = objexcel.ActiveCell.Offset(cpt, 0).Value
             
    'On Error GoTo fin
        With .Replacement
            .ClearFormatting
            .text = objexcel.ActiveCell.Offset(cpt, 0).Value
            .Style = "Normal"
            .Font.Color = wdColorGray625
        End With
        .Execute Replace:=wdReplaceAll, Format:=True, MatchCase:=False, MatchWholeWord:=True, Wrap:=wdFindContinue
    End With
    cpt = cpt + 1
Wend
 
    MsgBox "The search is finished."
    wbExcel.Close SaveChanges:=True
    objexcel.Quit
    Set wsExcel = Nothing
    Set wbExcel = Nothing
    Set objexcel = Nothing
Exit Sub
 
fin:
MsgBox "A problem occur please contact the administrator of the system"
    wbExcel.Close SaveChanges:=True
    objexcel.Quit
    Set wsExcel = Nothing
    Set wbExcel = Nothing
    Set objexcel = Nothing
   
End Sub
 
Cette fonction marche bien mais étant donné que le volume de mots dans le fichier Excel grandit à vive allure,le temps de traitement des fichiers pour rechercher les mots déjà stockés devient assez long.
En tant que pros de la programmation, pouvez-vous me dire quel changement serait susceptible d'améliorer la complexité de mon algorithme?
 
Merci d'avance.

mood
Publicité
Posté le 28-08-2006 à 10:08:34  profilanswer
 

n°1432512
galopin01
Posté le 28-08-2006 à 14:24:38  profilanswer
 

bonjour,
 
Dans la partie 3 supprimer les set redondants (je crois)
objexcel.ActiveWorkbook.ActiveSheet.Cells("1" ).Select  
Set wsExcel = wbExcel.Worksheets(1)  
Set sheet = objexcel.ActiveWorkbook.ActiveSheet  
 
mettre à la place :
 
i = wsExcel.Cells(65535, 1).End(xlUp).Row
 
remplacet la boucle while par :
 
 
For k = 1 to i
...
.text = wsExcel.Cells(k,1)  
...
.text = wsExcel.Cells(k,1)
...  
Next
 
... l'important étant de virer tous les offset aussi consommateurs de temps que des select !
 
...Et croiser les doigts !  :D  
 
Sinon l'idéal serait de stocker le Range(Cells(1,1),Cells(i,1)) dans un Array et refermer le classeur : L'accès à un Array est au moins 100 x plus rapide que l'accès au Range.
Dim Tablo()
 
...
i = wsExcel.Cells(65535, 1).End(xlUp).Row
Tablo = Range(Cells(1,1),Cells(i,1))
 
For k = 1 to i
...
.text = Tablo(k,1)  
...
.text = Tablo(k,1)  
...
Next
 
...Et croiser les doigts encore plus fort !  :D   :D  
 
(je ne suis pas arrivé à faire fonctionner cette macro !  :pt1cable:  
 
A+


Message édité par galopin01 le 28-08-2006 à 14:29:04
n°1432660
acorsa
Posté le 28-08-2006 à 17:24:58  profilanswer
 

ok, je vais voir tout ça.
Merci beaucoup

n°1432877
galopin01
Posté le 29-08-2006 à 09:27:34  profilanswer
 

De manière plus générale voir aussi [url=http://fordom.free.fr/tuto/OPTIMISATION.htm[#0000ff]]ici[/url]


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  VB/VBA/VBS

  Petite amélioration d'un algo

 

Sujets relatifs
[Résolu] [Algo] Stabilisation et Système du premier ordreApache, MySQL PHP 5 et Windows ... petite galère à l'installation
Inserer une petite image entre 2 tables.Algo -> Langage : Choix du langage ?
algo convolution[algo] dll -------- merci d'avance pour l'aide -----------
Grand débutant a besoin de petite aide mysql_resultPetite question sur les .CAB
Petite questionAlgo de recursion sur une table ?
Plus de sujets relatifs à : Petite amélioration d'un algo


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR