pas de message d'erreur
elle tourne ce matin 3h toujours rien
XLWING0.20.8
PYTHON 3.9
Office 365 E5
pas de message d'erreur
elle tourne ce matin 3h toujours rien
XLWING0.20.8
PYTHON 3.9
Office 365 E5
1 - Il faudrait vérifier dans le gestionnaire de tâche qu'il n' y a pas plein de sessions Excel qui tournent et les tuer.
2 - Rendre Excel Visible pendant le traitement
3 - faire un try finally pour fermer excel en cas de plantage
Bonjour
Je n'ai pas de message d'erreur
Il y que une session excel ouvert.
Il ouvre le fichier exécute son filtre.par contre il n'arrive pas à copier la selection
Il bloque durant des heures, sans possibilité d'aller au bout
Bonjour
excuse moi pour le long delais
tous passe bien jusque cette ligne
la console reste en rouge et rien ne ce passe durant des heures
j'ai la sensation que c'est l'API qui bloque certaine action
Code : Sélectionner tout - Visualiser dans une fenêtre à part ws.range('A1:C' + str(nb_row)).api.SpecialCells(12).copy
Bonjour jurassic
j'ai trouver l'erreur et corriger en temps que telle merci pour tout
je mets là solution fonctionnelle chez moi
Cordialement
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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63 import xlwings as xw from datetime import datetime, timedelta def tempsReserv(res,deltamax): print("res",res) arrTemps = res.split(';') cumuldelta = timedelta() for temps in arrTemps: t = datetime.strptime(temps,'%H:%M HEURES').time() delta = timedelta(hours=t.hour, minutes=t.minute) if delta >= deltamax: delta = delta - timedelta(hours=1) cumuldelta = cumuldelta + delta return cumuldelta wb_from = xw.Book(r"C:/Users/II1154/Downloads/BT/export_BT_20220425.xlsx") wb_to = xw.Book(r"C:/Users/II1154/Downloads/BT/classeur.xlsx") ws_from = wb_from.sheets['BT'] ws_to = wb_to.sheets['BT2'] # Copy the sheet BEFORE the sheet of another book. #ws_from.api.Copy(Before=ws_to.api) ws_from.range("A1:C1").api.AutoFilter(field:=1, Criteria1:="NO") ws_from.range("A1:C1").api.AutoFilter(field:=31, Criteria1:="<>") ws_from.range("A1:C1").api.AutoFilter(field:=7, Criteria1:="OUI") ws_from.range('A1').expand('table').api.Copy() wb_to.sheets['BT2'].select wb_to.sheets['BT2'].range('A1').paste() nb_row = wb_to.sheets['BT2'].range('A1').end('down').row # dernière ligne datain = wb_to.sheets['BT2'].range('AG2:AG' + str(nb_row)).value deltamax = timedelta(hours=4,minutes=0) tpslist = [] for x in datain: tps = tempsReserv(x, deltamax) hours, remainder = divmod(tps.seconds, 3600) minutes = remainder//60 tpslist.append('{:02}:{:02}'.format(tps.days*24 + hours,minutes)) wb_to.sheets['BT2'].range('BL2:BL' + str(nb_row)).number_format = '@' wb_to.sheets['BT2'].range('BL2').options(transpose=True).value = tpslist print(nb_row) #wb_to.sheets['BT2'].select print(tpslist) #"ws_to.range('A1').api.select print("3") print("4") # Copy the sheet AFTER the sheet of another book. ws_from.range('B8').api.Copy()
re-bonjour
Pas obligatoirement d'accord, car utiliser datetime est à priori plus lent qu'une fonction "maison". Ici c'est ton calcul lourd dans ta boucle donc il faut impérativement tester
Un rapide test (sans doute à affiner) donne la fonction avec datetime() 10 fois plus lente
ps: je n'ai aucune idée si cette fonction tempsReserv() est le goulot d'étranglement, une fonction 10 fois plus rapide peut n'avoir qu'un faible impact au final
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
35
36
37
38
39
40
41
42
43
44
45
46
47 import timeit from datetime import datetime, timedelta def tempsReserv(res,deltamax): #print("res",res) arrTemps = res.split(';') cumuldelta = timedelta() for temps in arrTemps: t = datetime.strptime(temps,'%H:%M HEURES').time() delta = timedelta(hours=t.hour, minutes=t.minute) if delta >= deltamax: delta = delta - timedelta(hours=1) cumuldelta = cumuldelta + delta return cumuldelta def tempsReserv2(res,deltamax): arrTemps = res.split(';') cumuldelta = 0 for temps in arrTemps: h,m = (int(x) for x in temps[:-7].split(":", 1)) # A voir si cela passe toujours ... hm = h * 60 if hm + m > deltamax: hm -= 60 cumuldelta += hm+m # plus simple/rapide de retourner directement au bon format texte ? # h = cumuldelta//60 # return f"{h:02d}:{cumuldelta-(h*60):02d}") return cumuldelta test = "04:31 HEURES;02:31 HEURES;" *10 # 7-1 == 6 heures (60 heures et 20 minutes) test = test[:-1] print(test) deltamax = timedelta(hours=4,minutes=0) ret = tempsReserv(test, deltamax) hours, remainder = divmod(ret.seconds, 3600) minutes = remainder//60 t = timeit.timeit(lambda: tempsReserv(test, deltamax), number=100000) print("tempsReserv", t, ret, f" ==> {ret.days*24+hours}:{minutes}") print() deltamax = 4*60 ret = tempsReserv2(test, deltamax) # juste pour voir si les 2 fonctions retournes bien la même valeur hours, remainder = divmod(ret*60, 3600) minutes = remainder//60 t = timeit.timeit(lambda: tempsReserv2(test, deltamax), number=100000) print("tempsReserv2", t, ret, f" ==> {hours}:{minutes}")
Partager