Execution d'une macro (délais important)

bloomby

XLDnaute Occasionnel
Bonjour à tous,

J'ai une macro qui est à l'intérieur d'un userform
Cette macro à pour but d'enregistrer les données qui sont afficher dans les textboxs et combobox sur la feuille 1

Par contre, le délais me semble très important par rapport à la longueur de la boucle. (Plus de 60 secondes) Est-ce que le fait de déclarer la variable as Variant peu avoir un impact ?

Est-ce que je serais mieux d'inclure le code dans un module au lieu d'écrire Call ..... et faire rouler le code à l'intérieur du userform ?

Voici les deux partie de code que j"utilise au sein du userform

HTML:
Private Sub Record_P_1_Data_Click()
Label1.Caption = "Traitement en cours"
UserForm1.Repaint
Call Record_P1_data
Label1.Caption = "Traitement terminé"
End Sub

HTML:
Sub Record_P1_data()
Dim n As Variant
For n = 31 To 68
Sheets("P1").Cells(2, n - 28).Value = UserForm1.Controls("TextBox" & n).Value
Sheets("P1").Cells(4, n - 28).Value = UserForm1.Controls("ComboBox" & n).Value
Sheets("P1").Cells(3, n - 28).Value = UserForm1.Controls("TextBox" & 1000 + n).Value
Next n
End Sub

Merci Bloomby
 

soenda

XLDnaute Accro
Re : Execution d'une macro (délais important)

Bonjour le fil, tbft, bloomby

Charges les données de ton USF dans un tableau et appliques le code suivant
Code:
Range(maPlage) = tableau
Tu devrais gagner pas mal, en temps de traitement

A plus
 

bloomby

XLDnaute Occasionnel
Re : Execution d'une macro (délais important)

Bonjour Tbft,
Cela risque d'être long étant donnée que je dois renommer les multiple textbox et combobox,

Dans les faits, le problèmes est que la macro prend beaucoup de temps à s'exécuter
comparativement à mon code qui à pour but d'afficher les résulats dans le userform l'enregistrement est beaucoup plus long

Bloomby
 

nolich

XLDnaute Occasionnel
Re : Execution d'une macro (délais important)

Bonsoir bloomby, tbft et soenda, bonsoir à toutes et à tous :)

bloomby, en reprenant l'idée de soenda, mais à l'envers (c'est mieux, je pense) essaie ceci :

Code:
[COLOR="Blue"]Sub[/COLOR] Record_P1_data()
[COLOR="Green"]'
' Déclarations de variables[/COLOR]
[COLOR="Blue"]Dim[/COLOR] n [COLOR="blue"]As Variant[/COLOR], indice
[COLOR="blue"]Dim[/COLOR] Tableau

[COLOR="Green"]  ' on affecte les cellules C2 à BR4 de la feuille P1
  ' dans la variable Tableau[/COLOR]  
  Tableau = Sheets("P1").Range("C2:AN4")
  
[COLOR="green"]  ' puis la boucle pour alimenter les TextBoxes[/COLOR]
  [COLOR="Blue"]For[/COLOR] n = 31 To 68
  Tableau(1, n - 30) = UserForm1.Controls("TextBox" & n).Value
  Tableau(3, n - 30) = UserForm1.Controls("ComboBox" & n).Value
  Tableau(2, n - 30) = UserForm1.Controls("TextBox" & 1000 + n).Value
  [COLOR="blue"]Next[/COLOR] n
  
[COLOR="blue"]End Sub[/COLOR]

En vérifiant la plage de valeurs, of course !

Tiens-nous au courant :)

@+
 
Dernière édition:

bloomby

XLDnaute Occasionnel
Re : Execution d'une macro (délais important)

Bonjour tbft soenda et nolich,

J'ai tester le code de nolich, très interessant mais cependant
cela n'enregistre pas mes données.

je crois que cela provient de cette partie du code

HTML:
Tableau = Sheets("P1").Range("C2:AN4")
  
  Tableau(1, n - 30)....

Je continue de regarder les possibilités, mais je crois que nous sommes sur une bonne piste

merci Bloomby
 

soenda

XLDnaute Accro
Re : Execution d'une macro (délais important)

Bonjour à tous

@bloomby : Testes le code suivant, c'est ta Sub avec un tableau intermédiaire.
Code:
Sub Record_P1_data()
  Dim n As Integer
  Dim t(2,37) as String

  For n = 31 To 68
    t(0, n - 31) = UserForm1.Controls("TextBox" & n).Value
    t(1, n - 31) = UserForm1.Controls("TextBox" & 1000 + n).Value
    t([COLOR=Red][B]2[/B][/COLOR], n - 31) = UserForm1.Controls("ComboBox" & n).Value  
  Next n

 [FONT=monospace]Sheets("P1").[/FONT][[COLOR=Red][B]C[/B][/COLOR]2:AN4] = t

End Sub
A plus
 
Dernière édition:

bloomby

XLDnaute Occasionnel
Re : Execution d'une macro (délais important)

Bonjour Soenda,

EN effet cela fonctionne parfaitement avec les dernière modification
par contre malgré le fait que l'on indique .Value

cette méthode n'enregistre pas les données comme des valeurs
de sorte que mes fonction sum(....), somme(....) ne fonctionne pas

Est-ce que tu y vois une solution ?

J'ai essayé:
t(0, n - 31).Value
mais sans succès

merci Bloomby
 
Dernière édition:

tbft

XLDnaute Accro
Re : Execution d'une macro (délais important)

Bonjour

de temps j'ai le même problème et je met value2 au lieu de value
et sa marche mais je ne sais pas pourquoi ....!!!!
si quelqu'un avait une explication, je suis preneur...

sinon as tu essayé de passer le calcul en manuel et de la repasee en automatique aprés ta bouucle de traitement. des fois ça aide bien

d'avance merci
 
Dernière édition:

soenda

XLDnaute Accro
Re : Execution d'une macro (délais important)

Bonsoir à tous, nolich, tbft, blomby

...malgré le fait que l'on indique .Value
Comme indiqué dans mon message précédent "...c'est ta Sub..."
personnellement dans ce cas de figure j'utiliserais quelque chose comme :
Code:
...
t(0, n - 31) = UserForm1.Controls("TextBox" & n).Text
...
Et ce, même si je considère qu'un code du genre
Code:
For début To fin
machin = .controls("textBox" & bidule + truc).ce que tu voudras (au point ou en est)
n'est pas à proprement parlé, bien pensé.

En effet si dans le code de ton USF tu avais déclaré un Tableau t global, tu pourrais écrire dans chaque textBoxN_change(...), un truc du genre:
t(les indices qui vont bien) = TextBoxN.Text

Et au final ton record_p1 se réduit à: Sheets("P1").[C2:AN4] = t, que tu peux laisser dans l'...USF (au vu de la longueur du code).

La différence entre le "For ...Controls..." et les TextBoxN_Change, pénibles à écrire, est la différence entre l'attente et l'instantanéité ...

En ce qui concerne le Value2, je n'ai qu'une chose à dire, pour le traitement des dates, c'est top.

A plus
 

soenda

XLDnaute Accro
Re : Execution d'une macro (délais important)

Re

Complément d'info
malgré le fait que l'on indique .Value... mes fonctions Somme(....) ne fonctionnent pas
Vois le test suivant
Code:
Sub b()
    Dim a$, b$
    
    a = "1"
    b = "2"
    
    [A1] = a
    [B1] = b
End Sub
C1 = A1 + B1 => 3 ' les 3 cellules sont au format "Standard"... ;)

Mais tu peux toujours essayer (s'il s'agit d'entiers) t(x,y) as Integer et ... t(x,y) = CInt(TextBoxN.Text) :rolleyes:

A plus :)
 

tbft

XLDnaute Accro
Re : Execution d'une macro (délais important)

bonjour.

il est possible d'augmenter la vitesse d'exécution des macros dans certains cas en suspendant le calcul automatique.

il suffit
1) d'enregistrer dans variable de type variant le contenue de
apllication.calculation

2) de le forcer en manuel

3) faire le traitement lourd

4) de restaure l'ancien mode de calcul

Bonne nuit
 

bloomby

XLDnaute Occasionnel
Re : Execution d'une macro (délais important)

Bonsoir à tous, nolich, tbft, blomby

J'essai une nouvelle façon de faire, parce que jusqu'à maintenant cela ne fonctionne pas
est-ce que ce serais possible selectionner le range suivant comme value

du type: ( Mais fonctionnelle ;) )
Range("C3:AO3").Select
Selection.Value

Merci bloomby
 

soenda

XLDnaute Accro
Re : Execution d'une macro (délais important)

Bonsoir à tous, bloomby

J'essai une nouvelle façon de faire, parce que jusqu'à maintenant cela ne fonctionne pas
La "Value" ou "Text" d'un textBox est une "String",
si tu veux mettre une "String" dans une variable "Integer" (par exemple),
tu dois faire un "Cast" (...)
Code:
Dim v As Integer
v = [COLOR=Blue][B]CInt[/B][/COLOR](UserForm1.Controls("TextBox" & n).Text)
J'espère que cela te sera utile.

Par contre, je ne sais pas ce que tu attends du code suivant :confused:
Range("C3:AO3").Select
Selection.Value
A plus
 

bloomby

XLDnaute Occasionnel
Re : Execution d'une macro (délais important)

Bonsoir Soenda,

Dans les faits c'est que je veux à la fin de ma macro ajouter un code
qui va défini le range Range("C3:AO3").Select
comme étant .Value

Est-ce possible ?

j"ai aussi testé
Dim v As Integer

v = t(1, n - 31)
For n = 31 To 68
v = CInt(UserForm1.Controls("TextBox" & 1000 + n).Value)

mais sans succès

merci Bloomby
 
Dernière édition:

Discussions similaires

Membres actuellement en ligne

Aucun membre en ligne actuellement.

Statistiques des forums

Discussions
312 584
Messages
2 089 991
Membres
104 330
dernier inscrit
joedal