Bonjour les amis, je pensais savoir faire une question aussi simple, visiblement non.
Je fais une copie en automatique d'une base de donnée sur un tableau excel vers un autre tableau excel et je procède logiquement comme ceci:
Itération sur les colonnes, puis sur les lignes
contrôle que la cellule n'est pas vide, sinon je saute
copie de la cellule du fichier origine de la feuille concernée de wbk2 vers celle de wbk2, classeurs définis sur mon réseau.
Premier souci.
Cette copie sert à mettre à jour des données dedans, puis sera ensuite recopiée, dans la base d'origine qui évolue ainisi, uniquement si des cellules sont modifiées (mises en rouge).
Il s'agit d'une base d'articles assez lourde, 125 colonnes et 1617 lignes (extensible à davantage à l'avenir) qui comporte des descriptions de produits en plusieurs langues; aussi faut il souvent mettre à jour et jugeant que c'est dangereux de faire les modifs dans la base elle-même et afin de s'y retrouver, je préfère faire une copie, la modifier, puis réinjecter les modifs dans la base initiale.
voila pour l'explication de la logique.
Lorsque la copie est faite, le traducteur intervient et, à l'aide d'une Private sub worksheet_change, toutes les cellules "touchées" passent en gras rouge:
Cette procéure est placée au niveau de la feuille concernée. elle fonctionne sauf pour la dernière ligne; si je ne mets pas l'offset, elle ne fonctionne pas pour la première, détail pas compris.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6 Private Sub Worksheet_Change(ByVal Target As Range) With Selection.Offset(-1, 0).Font .ColorIndex = 3 .Bold = True End With End Sub
Le second problème, c'est qu'il faudrait "arrêter cette routine" le temps de la copie, sinon bien sûr, elle est "rouge" !
Ce que j'ai fait en la desactivant au début du run de la procédure de copie et en la réactivant après.
Mais ça ne fonctionen pas, elle reste rouge, cette copie.
Second souci donc.
Maintenant que vos avez les explications, vous allez me montrer ou j'ai pêché....
Ce module est placé au niveau du classeur.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 Sub rafraichir() 'RAFRAICHI LA COPIE DE GRANDE BASE - MODULE 7 Dim wbk1 As Workbook Dim wbk2 As Workbook Set wbk1 = ThisWorkbook Set wbk2 = Workbooks.Open(Filename:="C:\Users\Christophe\Documents\PHOTOS & FT FOURNISSEURS\..CATALOGUE\CATALOGUE KZ\GRANDE BASE 1108O1108.xlsm") Dim l As Integer Dim c As Integer ' Désactivation de la macro évènement Application.EnableEvents = False If MsgBox("Voulez-vous mettre à jour la copie avec le contenu réel de la base article ?", vbYesNo, "Confirmation de la demande") = vbYes Then For c = 1 To 125 For l = 8 To 1617 If wbk2.Worksheets("Epicerie").cells(l, c) <> "" Then wbk1.Worksheets("Epicerie").cells(l, c) = wbk2.Worksheets("Epicerie").cells(l, c) Else End If Next l Next c Else End If ' Réactivation de la macro évènement Application.EnableEvents = True End Sub
Alors,
1/Comment faire pour l'accélérer ? 10 minutes de calcul actuellement.
A noter que j'avais mis une condition de cellule vide non copiée pour gagner du temps...
2/Comment neutraliser la procédure worksheet_change ?
a la fin, j'ai essayé autre chose: laisser la worksheet_change fonctionner et TOUT repasser en noir en fin du programme de copie:
Mais je vois bien que c'est lourd...
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 'Remise en noir wbk1.Range("A8:DP1617").Select Selection.ColorIndex = 1 Selection.Bold = False
Je pense que je vais prendre une claque, non ?
Partager