Probleme nettoyage fichier Excel via VB6

tamereenstring Messages postés 5 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 9 avril 2009 - 8 avril 2009 à 16:13
tamereenstring Messages postés 5 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 9 avril 2009 - 9 avril 2009 à 09:08
Bonjour, j'ai trouvé pas mal de sources permettant de nettoyer des fichiers Excel (en supprimant les cellules à priori vides) par contre, les exemples que j'ai sont à placer directement dans le fichier excel que l'on veut nettoyer (sous forme de macro VBA)

Moi j'aimerais faire un executable en VB6 dans lequel je selectionnerai le fichier à nettoyer.
Tout fonctionne à une exception : c'est très lent au moment où le programme VB6 utilise la fonction "find" dans le fichier Excel.
En fait, quand je lance le code de "nettoyage" j'utilise dans mon programme VB6 la fonction "find" pour chercher la derniere ligne et derniere colonne non vides du fichier Excel.

Si je clique dans mon programme en cours d'execution, j'ai un message qui me dit que l'autre programme (excel) est occupé (busy) et j'ai 2 boutons "switch to" ou "retry"

Ou alors, si je patiente, au bout d'un moment le programme se termine correctement

Quelqu'un aurait une idée ?
merci !!!!!!

3 réponses

cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
8 avril 2009 à 18:30
Salut
Si tu perds le contrôle de ton programme, c'est surement qu'une boucle tourne en rond ET que tu n'as pas prévu de respiration permettant au système de travailler en parallèle.
--> Ajoute au moins un DoEvents dans tes boucles
--> Recherche quelle boucle peut tourner en rond

Vala
Jack, MVP VB
NB : Je ne répondrai pas aux messages privés

<hr />Le savoir est la seule matière qui s'accroit quand on la partage (Socrate)
0
cs_Jack Messages postés 14006 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
8 avril 2009 à 18:32
PS : Sous VBA, tu peux très bien créer un ensemble de macro qui agissent sur une feuille d'un autre classeur.
Il suffit de sélectionner cette feuille externe au début de la macro
0
tamereenstring Messages postés 5 Date d'inscription jeudi 5 juin 2003 Statut Membre Dernière intervention 9 avril 2009
9 avril 2009 à 09:08
Merci Jack, j'ai effectivement une boucle qui me permet de traiter chaque feuille du classeur que k'ai selectionné.
Par contre, quand je me mets en mode debug, je vois bien que mon programme "bloque pendant presque 1min" sur les 2 fonctions "find" que j'utilise sur la feuille active..alors que si ce code est directement inséré dans le classeur excel sous forme de macro, c'est super rapide.
Je mets en copie mon code, ça sera peut etre plus clair :

Sub Nettoie(cheminFichierExcel As String, nomFichierExcel As String)
Dim excelApp As Object

Dim Workbooks As excel.Workbooks
Dim Sht As excel.Worksheet
Dim DCell As excel.Range
Dim Calc As Long
Dim Rien As String, Avant As Double
Dim plage As excel.Range


'On Error Resume Next
'Set excelApp = CreateObject("Excel.Application")
Set excelApp = New excel.Application


excelApp.Workbooks.Open cheminFichierExcel
'excelApp.Application.Visible = True
excelApp.Worksheets("Feuil1").Activate

'Calc = Application.Calculation
Calc = excelApp.Workbooks(nomFichierExcel).Application.Calculation 'Mémorisation de l'État de recalcul


'--------------------------------------------------------

MsgBox "Pour le classeur actif : " _
& Chr(10) & excelApp.Workbooks(nomFichierExcel).FullName _
& Chr(10) & "dans chaque feuille de calcul" _
& Chr(10) & "recherche la zone contenant des données, " _
& Chr(10) & "réinitialise la dernière cellule utilisée" _
& Chr(10) & "et optimise la taille du fichier Excel ", _
vbInformation, "Information"
'---------------------------------------------------------

MsgBox "Taille initiale de ce classeur en octets" _
& Chr(10) & FileLen(excelApp.Workbooks(nomFichierExcel).FullName), _
vbInformation, excelApp.Workbooks(nomFichierExcel).FullName
'------------------------------------------------------

Screen.MousePointer = 11

With excelApp.Workbooks(nomFichierExcel).Application
.Calculation = xlCalculationManual
.StatusBar = "Nettoyage en cours..."
.EnableCancelKey = xlErrorHandler
.ScreenUpdating = True
End With
'-------------------- le traitement
For Each Sht In excelApp.Workbooks(nomFichierExcel).Worksheets
Sht.Activate
Sht.Cells(1, 1).Select

Avant = Sht.UsedRange.Cells.Count
excelApp.Workbooks(nomFichierExcel).Application.StatusBar = Sht.Name & "-" & Sht.UsedRange.Address
'-------------------Traitement de la zone trouvee
If Sht.UsedRange.Address <> "$A$1" Or Not IsEmpty(Sht.[A1]) Then
Set DCell = Sht.Cells.Find("*", , , , xlByRows, xlPrevious)(2)
DoEvents
'----------------Suppression des lignes inutilisees
If Not DCell Is Nothing Then
Sht.Range(DCell, Sht.Cells([A:A].Count, 1)).EntireRow.Delete
Set DCell = Nothing
Set DCell = Sht.Cells.Find("*", , , , xlByColumns, xlPrevious)(, 2)
DoEvents
'----------------Suppression des colonnes inutilisees
If Not DCell Is Nothing Then Sht.Range(DCell, Sht.[IV1]).EntireColumn.Delete
End If
Rien = Sht.UsedRange.Address
End If

excelApp.Workbooks(nomFichierExcel).Save

Screen.MousePointer = 0

'---------------------Message pour la feuille traitee
MsgBox "Nom de la feuille de calcul :" & vbCrLf & _
Chr(10) & Sht.Name & _
Chr(10) & Format(Sht.UsedRange.Cells.Count / Avant, "0.00%") & _
" de la taille initiale", _
vbInformation, excelApp.Workbooks(nomFichierExcel).FullName

Next Sht
'--------------------Message fin de traitement
'MsgBox "Taille optimis e de ce classeur en octets " & _
Chr(10) & FileLen(excelApp.Workbooks(nomFichierExcel).FullName), vbInformation, _
excelApp.Workbooks(nomFichierExcel).FullNameActive
'--------------------
excelApp.Workbooks(nomFichierExcel).Application.StatusBar = False
excelApp.Workbooks(nomFichierExcel).Application.Calculation = Calc

excelApp.ActiveWorkbook.Close True
Set excelApp = Nothing
End Sub
0
Rejoignez-nous