‘Code pour ouvrir un fichier et lui attribuer un objet (et vérifier si il n'est pas déjà ouvert)
chemin = "D:\Repertoire"
nom_fic = "Traitement.xls"
deja_ouvert = False
For Each fichier In Workbooks 'vérfier dans les classeurs ouverts
If fichier.Name = nom_fic Then
deja_ouvert = True 'si il y est
Set fic_resultat = Workbooks(nom_fic)
End If
Next
If Not deja_ouvert Then 'si il ne l'est pas, l'ouvrir depuis le répertoire
Set fso = CreateObject("Scripting.filesystemobject")
Set dossier = fso.getfolder(chemin)
For Each fichier In dossier.Files
If fichier.Name = nom_fic Then
Set fic_resultat = Workbooks.Open(fichier)
End If
Next
End If
Sub Ext_BD()
'Ext bD
Range("_BD").AdvancedFilter Action:=xlFilterCopy, CriteriaRange:=Range( _
"_CR"), CopyToRange:=Range("_ZD"), Unique:=False
End Sub
‘Mettre à jour des TCD
For Each feuilleTCD In ActiveWorkbook.Sheets 'pour chaque feuille
For Each TCD In feuilleTCD.PivotTables 'pour chaque tableau présent
ActiveSheet.PivotTables(TCD.Name).PivotCache.Refresh 'rafraichir le TCD
Next TCD
Next feuilleTCD
Dim A As String
Dim B As Integer
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> A And Target.Count = B Then
Application.EnableEvents = False
Application.Undo
Application.EnableEvents = True
End If
End Sub
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Application.EnableEvents = False
A = T.Address
B = T.Count
Application.EnableEvents = True
End Sub
Bonjour à tous,
Ma préférée permet de nettoyer les valeurs qui n'existent plus dans tous les tcd d'un classeur.
Récupérée à partir de liens sur ce site. Evidemment je n'ai pas noté la source et je m'en excuse !
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
Sub TCD_Affiche_Valeurs_Distinctes()
'Extrait d'un TCD en page sur le champs Nom en nommant la colonne Nom: "DBNom"
Dim d As Object, Cell As Range
ActiveSheet.PivotTables(1).PivotCache.Refresh
Set d = CreateObject("Scripting.Dictionary")
For Each Cell In Range("BDNom")
If Cell.Value <> "" Then d(Cell.Value) = Cell.Value
Next
nbval = d.Count: MsgBox (nbval & " valeurs distinctes.")
For Each c In d.keys
ActiveSheet.PivotTables("Tableau croisé dynamique1").PivotFields("Nom"). _
CurrentPage = d(c)
Sleep 2000
Next c
End Sub
Il s'était tu assez rapidement puis soudain 6 ans plus tard, il ressurgit et sort de sa torpeur.
Êtes-vous d'accord avec tous les points évoqués?
Oui à 99.99%.....Êtes-vous d'accord avec tous les points évoqués?
Je pense également que c'est un très bonne habitude à prendre non seulement pour son impact en terme de vitesse mais également pour son impact en terme de fiabilité de la macro.Le point 14 est aussi très important pour accélérer.
Misange, aurais tu un exemple pour illustrer ton propos ? J'ai du mal à me représenter ce que tu suggères.Il manque aussi le fait d'éviter de lire à chaque passage de boucle la propriété d'un objet si celle-ci ne change pas en cours de route (la stocker dans une variable de type string)
For Each c In Range("truc")
If range("A1").Value > Machin Then
...
Next c
Machin = Range("A1").Value
For Each c In Range("truc")
If c.Value > Machin Then
...
Next c
Use Worksheet Functions rather developing own logic:
By using Application.WorkSheetFunction, we tell VBA processor to use native code rather than interpreted code as VBA understands the worksheet functions better than your algorithm. So, for example use
mProduct = Application.WorkSheetFunction.Product(Range("C5:C10"))
rather than defining your own logic like this:
mProduct = 1
For i = 5 to 10
mProduct = mProduct * Cells(3,i)
Next