Module qui exécute frénétiquement un autre module
Bonsoir,
J'ai un tableur excel à faire et je m'arrache les cheveux depuis quelques heures dessus... Je tiens à préciser que je ne connaissais rien à VBA il y a encore quelques jours, mes macros ne sont donc pas super propres.
Donc j'ai un bouton qui exécute la macro suivante :
Sub Clearcells()
Application.ScreenUpdating = False
Range("C13", "D22").ClearContents
Range("E13", "H22").Value = "OUI"
Range("C5:D5:E5").ClearContents
Range("C6:D6:E6").ClearContents
Range("C7:D7:E7").ClearContents
Range("C8:D8:E8").ClearContents
Range("C27", "H36").ClearContents
Range("C40", "H49").ClearContents
Range("C50", "H50").Value = 12
Range("C54", "H57").ClearContents
'AssociŽ 1 ou individuel
Range("C62", "H65").ClearContents
Range("C66", "H66").Value = "NON"
Range("C67", "H67").ClearContents
Range("B70:C70:D70:E70:F70:G70:H70:B71:C71:D71:E71:F71:G71:H71").ClearContents
'AssociŽ 2
Range("C76", "H79").ClearContents
Range("C80", "H80").Value = "NON"
Range("C81", "H81").ClearContents
Range("B84:C84:D84:E84:F84:G84:H84:B85:C85:D85:E85:F85:G85:H85").ClearContents
'AssociŽ 3
Range("C90", "H93").ClearContents
Range("C94", "H94").Value = "NON"
Range("C95", "H95").ClearContents
Range("B98:C98:D98:E98:F98:G98:H98:B99:C99:D99:E99:F99:G99:H99").ClearContents
'AssociŽ 4
Range("C104", "H107").ClearContents
Range("C108", "H108").Value = "NON"
Range("C109", "H109").ClearContents
Range("B112:C112:D112:E112:F112:G112:H112:B113:C113:D113:E113:F113:G113:H113").ClearContents
'AssociŽ 5
Range("C118", "H121").ClearContents
Range("C122", "H122").Value = "NON"
Range("C123", "H123").ClearContents
Range("B126:C126:D126:E126:F126:G126:H126:B127:C127:D127:E127:F127:G127:H127").ClearContents
'AssociŽ 6
Range("C132", "H135").ClearContents
Range("C136", "H136").Value = "NON"
Range("C137", "H137").ClearContents
Range("B140:C140:D140:E140:F140:G140:H140:B141:C141:D141:E141:F141:G141:H141").ClearContents
'AssociŽ 7
Range("C146", "H149").ClearContents
Range("C150", "H150").Value = "NON"
Range("C151", "H151").ClearContents
Range("B154:C154:D154:E154:F154:G154:H154:B155:C155:D155:E155:F155:G155:H155").ClearContents
'AssociŽ 8
Range("C160", "H163").ClearContents
Range("C164", "H164").Value = "NON"
Range("C165", "H165").ClearContents
Range("B168:C168:D168:E168:F168:G168:H168:B169:C169:D169:E169:F169:G169:H169").ClearContents
'AssociŽ 9
Range("C174", "H177").ClearContents
Range("C178", "H178").Value = "NON"
Range("C179", "H179").ClearContents
Range("B182:C182:D182:E182:F182:G182:H182:B183:C183:D183:E183:F183:G183:H183").ClearContents
'AssociŽ 10
Range("C188", "H191").ClearContents
Range("C192", "H192").Value = "NON"
Range("C193", "H193").ClearContents
Range("B196:C196:D196:E196:F196:G196:H196:B197:C197:D197:E197:F197:G197:H197").ClearContents
Application.ScreenUpdating = True
End Sub
J'ai mis les Application.screenUpdating pour que la macro s'exécute plus rapidement.
Ensuite j'ai récupéré sur un site une fonction améliorée de rechercheV qui permet de gérer plusieurs occurences. Seulement, j'ai l'impression que cette fonction recalcule après chaque modification du classeur.
Dès lors que j'exécute la macro ci-dessus, cette fonction s'exécute à chaque ligne de la macro, ce qui l'utilisation du tableur très lente.
Voici la fonction en question :
Option Explicit
'RD =cellule où commencer la recherche
'RC = cellule critère
'RDT = cellule où chercher la donnée
'Ligne rechercher jusque ligne... (optional) si 0 cherche jusqu'au bout de la ligne
Public Function RechercheVmulti(RD As Range, RC As Range, RDT As Range, _
Optional Ligne As Long = 0)
Dim i As Integer, e As Integer, Txt As String
Dim LigE As Long, ColE As Long 'où écrire résultats
Dim Col As Integer
Dim Lig As Long, Occ As Long
Dim FeuilE As String, FeuilRD As String, FeuilRDT As String
On Error GoTo sortie
LigE = Application.Caller.Row
ColE = Application.Caller.Column
FeuilE = Application.Caller.Parent.Name
Application.Volatile
Lig = RD.Row ' Ligne où commencer la recherche
Col = RD.Column 'Colonne où commencer la recherche
FeuilRD = RD.Parent.Name
FeuilRDT = RDT.Parent.Name
If Ligne = 0 Then
Ligne = Range(Sheets(FeuilRD).Cells(65536, Col), Sheets(FeuilRD).Cells(65536, Col)).End(xlUp).Row
End If
'Recherche le numéro de l'occurrence à trouver
For Occ = LigE - 1 To 1 Step -1
Txt = Sheets(FeuilE).Cells(Occ, ColE).Formula
If Txt = Sheets(FeuilE).Cells(LigE, ColE).Formula Then
e = e + 1
End If
Next Occ
For i = Lig To Ligne
If Sheets(FeuilRD).Cells(i, Col) = RC Then
If e <> 0 Then
e = e - 1
Else
RechercheVmulti = Sheets(FeuilRDT).Cells(i, RDT.Column)
Exit Function
End If
End If
Next i
'Si plus trouvé de concordance
RechercheVmulti = ""
Exit Function
sortie:
'si erreur dans la formule, non détectée par Excel.
RechercheVmulti = "#FAUTE!"
End Function
Comment faire pour que la deuxième fonction ne s'exécute pas à chaque ligne de première macro ?
Je vous remercie par avance de votre aide, mon cerveau va exploser là
Bonjour et bienvenue,
Un petit conseil, joins un classeur à ta demande.
Cdlt.
Bonjour,
Voici le fichier Excel correspondant.
Lors de l'exécution de la macro ClearCells, la macro appelle la fonction RechercheVmulti à chaque ligne et je ne comprend pas pourquoi.
Les cellules utilisant la fonction RechercheVmulti se trouve sur la feuille "Associe".
Je vous remercie de votre aide !