VBA Affichage et modification de donnés

Bonjour,

Je m'appel Cédric, je suis nouveau dans le monde du VBA! je me lance depuis un certain temps dans un petit "programme" Excel en VBA. J'ai réussi a faire a peu près ce que je veux, mais le problème c'est que c'est anormalement long. Voila pourquoi je viens vers vous.

Voila mon problème: j'ai créé un bouton qui lorsque je clic dessus me lance un userform qui doit me retranscrire, dans beaucoup de texte box, toute une ligne d'un tableau de donnée. Quand j'ouvre pour la première fois mon fichier, tout est normal. Par contre, une fois un nouveau champ de recherche, la c'est anormalement long. Etant débutant, j'ai mis un code qui, je pens, est juste, mais peut certainement être amélioré!!

Pour être plus clair, voici mon code:

Private Sub UserForm_activate()
Application.ScreenUpdating = False ' désactive le rafraichissement de l'ecrant. Permet de gagner du temps. a remettre a la fin.
Application.Calculation = xlCalculationManual ' augmente la vitesse de recherche en désactivant le calcul auto des cellules. a remettre a la fin.
Dim lig As Integer
With Sheets("DM") ' feuille ou sont mes infos d'avance
lig = .Columns("A").Find(What:=Sheets("Recherche").Range("cel_symbole"), after:=Range("A4"), Lookat:=xlWhole).Row ' chercher dans la colonne a , mon élément de référence
TBox_DM_1 = .Cells(lig, "B")  ' va porter les infos sur la bonne ligne
TBox_DM_2 = .Cells(lig, "I")
TBox_DM_3 = .Cells(lig, "P")
TBox_DM_4 = .Cells(lig, "W")
TBox_DM_5 = .Cells(lig, "AD")
TBox_DM_6 = .Cells(lig, "AK")
TBox_DM_7 = .Cells(lig, "AR")
TBox_DM_8 = .Cells(lig, "AY")
TBox_DM_9 = .Cells(lig, "BF")
TBox_DM_10 = .Cells(lig, "BM")
TBox_cor_1 = .Cells(lig, "C")
TBox_cor_2 = .Cells(lig, "J")
TBox_cor_3 = .Cells(lig, "Q")
TBox_cor_4 = .Cells(lig, "X")
TBox_cor_5 = .Cells(lig, "AE")
TBox_cor_6 = .Cells(lig, "AL")
TBox_cor_7 = .Cells(lig, "AS")
TBox_cor_8 = .Cells(lig, "AZ")
TBox_cor_9 = .Cells(lig, "BG")
TBox_cor_10 = .Cells(lig, "BN")
TBox_dateDM_1 = .Cells(lig, "D")
TBox_dateDM_2 = .Cells(lig, "K")
TBox_dateDM_3 = .Cells(lig, "R")
TBox_dateDM_4 = .Cells(lig, "Y")
TBox_dateDM_5 = .Cells(lig, "AF")
TBox_dateDM_6 = .Cells(lig, "AM")
TBox_dateDM_7 = .Cells(lig, "AT")
TBox_dateDM_8 = .Cells(lig, "BA")
TBox_dateDM_9 = .Cells(lig, "BH")
TBox_dateDM_10 = .Cells(lig, "BO")
TBox_QtéDM_1 = .Cells(lig, "E")
TBox_QtéDM_2 = .Cells(lig, "L")
TBox_QtéDM_3 = .Cells(lig, "S")
TBox_QtéDM_4 = .Cells(lig, "Z")
TBox_QtéDM_5 = .Cells(lig, "AG")
TBox_QtéDM_6 = .Cells(lig, "AN")
TBox_QtéDM_7 = .Cells(lig, "AU")
TBox_QtéDM_8 = .Cells(lig, "BB")
TBox_QtéDM_9 = .Cells(lig, "BI")
TBox_QtéDM_10 = .Cells(lig, "BP")
TBox_statut_1 = .Cells(lig, "F")
TBox_statut_2 = .Cells(lig, "M")
TBox_statut_3 = .Cells(lig, "T")
TBox_statut_4 = .Cells(lig, "AA")
TBox_statut_5 = .Cells(lig, "AH")
TBox_statut_6 = .Cells(lig, "AO")
TBox_statut_7 = .Cells(lig, "AV")
TBox_statut_8 = .Cells(lig, "BC")
TBox_statut_9 = .Cells(lig, "BJ")
TBox_statut_10 = .Cells(lig, "BQ")
TBox_Com_1 = .Cells(lig, "G")
TBox_Com_2 = .Cells(lig, "N")
TBox_Com_3 = .Cells(lig, "U")
TBox_Com_4 = .Cells(lig, "AB")
TBox_Com_5 = .Cells(lig, "AI")
TBox_Com_6 = .Cells(lig, "AP")
TBox_Com_7 = .Cells(lig, "AW")
TBox_Com_8 = .Cells(lig, "BD")
TBox_Com_9 = .Cells(lig, "BK")
TBox_Com_10 = .Cells(lig, "BR")
TBox_divers_1 = .Cells(lig, "H")
TBox_divers_2 = .Cells(lig, "O")
TBox_divers_3 = .Cells(lig, "V")
TBox_divers_4 = .Cells(lig, "AC")
TBox_divers_5 = .Cells(lig, "AJ")
TBox_divers_6 = .Cells(lig, "AQ")
TBox_divers_7 = .Cells(lig, "AX")
TBox_divers_8 = .Cells(lig, "BE")
TBox_divers_9 = .Cells(lig, "BL")
TBox_divers_10 = .Cells(lig, "BS")
End With
Application.Calculation = xlCalculationAutomatic 'remet en automatique "calcul cellule". permet de gagner du temps.
Application.ScreenUpdating = True 'remet le rafraichissement de l'ecran.
End Sub

Une fois mon tableau affiché, je veux pouvoir modifier mes lignes en modifiant mon tableau!

Pour ce faire, j'ai mis ce code:

Private Sub CommandButton3_Click()
Application.ScreenUpdating = False ' désactive le rafraichissement de l'ecrant. Permet de gagner du temps. a remettre a la fin.
Application.Calculation = xlCalculationManual ' augmente la vitesse de recherche en désactivant le calcul auto des cellules. a remettre a la fin.
Dim lig As Integer
With Sheets("DM") ' feuille ou sont mes infos d'avance
lig = .Columns("A").Find(What:=Sheets("Recherche").Range("cel_symbole"), after:=Range("A4"), Lookat:=xlWhole).Row ' chercher dans la colonne a , mon élément de référence
.Cells(lig, "B") = TBox_DM_1 ' va porter les infos sur la bonne ligne
.Cells(lig, "C") = TBox_cor_1
.Cells(lig, "D") = TBox_dateDM_1
.Cells(lig, "E") = TBox_QtéDM_1
.Cells(lig, "F") = TBox_statut_1
.Cells(lig, "G") = TBox_Com_1
.Cells(lig, "H") = TBox_divers_1
.Cells(lig, "I") = TBox_DM_2
.Cells(lig, "J") = TBox_cor_2
.Cells(lig, "K") = TBox_dateDM_2
.Cells(lig, "L") = TBox_QtéDM_2
.Cells(lig, "M") = TBox_statut_2
.Cells(lig, "N") = TBox_Com_2
.Cells(lig, "O") = TBox_divers_2
.Cells(lig, "P") = TBox_DM_3
.Cells(lig, "Q") = TBox_cor_3
.Cells(lig, "R") = TBox_dateDM_3
.Cells(lig, "S") = TBox_QtéDM_3
.Cells(lig, "T") = TBox_statut_3
.Cells(lig, "U") = TBox_Com_3
.Cells(lig, "V") = TBox_divers_3
.Cells(lig, "W") = TBox_DM_4
.Cells(lig, "X") = TBox_cor_4
.Cells(lig, "Y") = TBox_dateDM_4
.Cells(lig, "Z") = TBox_QtéDM_4
.Cells(lig, "AA") = TBox_statut_4
.Cells(lig, "AB") = TBox_Com_4
.Cells(lig, "AC") = TBox_divers_4
.Cells(lig, "AD") = TBox_DM_5
.Cells(lig, "AE") = TBox_cor_5
.Cells(lig, "AF") = TBox_dateDM_5
.Cells(lig, "AG") = TBox_QtéDM_5
.Cells(lig, "AH") = TBox_statut_5
.Cells(lig, "AI") = TBox_Com_5
.Cells(lig, "AJ") = TBox_divers_5
.Cells(lig, "AK") = TBox_DM_6
.Cells(lig, "AL") = TBox_cor_6
.Cells(lig, "AM") = TBox_dateDM_6
.Cells(lig, "AN") = TBox_QtéDM_6
.Cells(lig, "AO") = TBox_statut_6
.Cells(lig, "AP") = TBox_Com_6
.Cells(lig, "AQ") = TBox_divers_6
.Cells(lig, "AR") = TBox_DM_7
.Cells(lig, "AS") = TBox_cor_7
.Cells(lig, "AT") = TBox_dateDM_7
.Cells(lig, "AU") = TBox_QtéDM_7
.Cells(lig, "AV") = TBox_statut_7
.Cells(lig, "AW") = TBox_Com_7
.Cells(lig, "AX") = TBox_divers_7
.Cells(lig, "AY") = TBox_DM_8
.Cells(lig, "AZ") = TBox_cor_8
.Cells(lig, "BA") = TBox_dateDM_8
.Cells(lig, "BB") = TBox_QtéDM_8
.Cells(lig, "BC") = TBox_statut_8
.Cells(lig, "BD") = TBox_Com_8
.Cells(lig, "BE") = TBox_divers_8
.Cells(lig, "BF") = TBox_DM_9
.Cells(lig, "BG") = TBox_cor_9
.Cells(lig, "BH") = TBox_dateDM_9
.Cells(lig, "BI") = TBox_QtéDM_9
.Cells(lig, "BJ") = TBox_statut_9
.Cells(lig, "BK") = TBox_Com_9
.Cells(lig, "BL") = TBox_divers_9
.Cells(lig, "BM") = TBox_DM_10
.Cells(lig, "BN") = TBox_cor_10
.Cells(lig, "BO") = TBox_dateDM_10
.Cells(lig, "BP") = TBox_QtéDM_10
.Cells(lig, "BQ") = TBox_statut_10
.Cells(lig, "BR") = TBox_Com_10
.Cells(lig, "BS") = TBox_divers_10
End With
Application.Calculation = xlCalculationAutomatic 'remet en automatique "calcul cellule". permet de gagner du temps.
Application.ScreenUpdating = True 'remet le rafraichissement de l'ecran.
MsgBox "Modification effectué "
Unload Tableau_DM
End Sub

La c'est pareil, c'est très long!!

Voila, j'espère avoir été clair! quelqu'un aurait il une idée pour améliorer tout ça??

PS: Soyez indulgents s'il vous plait, je suis novice.

Merci d'avance pour vos explications.

Cédric

Bonjour

cos81 a écrit :

La c'est pareil, c'est très long!!

Le code ou l'exécution

Dans les 2 cas ton fichier va être indispensable

Je suis dans le meme cas que toi si quelqu'un veut bien m'aider je lui envois en privé c'est vraiment urgeeent

Banzai64 a écrit :

Bonjour

cos81 a écrit :

La c'est pareil, c'est très long!!

Le code ou l'exécution

Dans les 2 cas ton fichier va être indispensable

Bonjour,

Merci pour ta réponse, mais c'est un fichier pro, et il y a des données que je ne peux pas mettre sur internet!

Est ce que on ne peut pas faire juste avec le code que j'ai mis?

Si non, il faut que j'enlève les données, puis je le mettrais en ligne!

Merci

Bonjour

Tu n'as pas précisé

Le code ou l'exécution ?

Si c'est l'exécution en plus de ce que tu fais déjà ( écran + calcul) je peux te proposer de bloquer les évènements, si tu as des procédures événementielles (macros dans les module de feuille ou le module ThisWorkbook)

Application.EnableEvents = False      ' Impératif à remettre à True
' .
' .
Application.EnableEvents = True
End Sub
Banzai64 a écrit :

Bonjour

Tu n'as pas précisé

Le code ou l'exécution ?

Si c'est l'exécution en plus de ce que tu fais déjà ( écran + calcul) je peux te proposer de bloquer les évènements, si tu as des procédures événementielles (macros dans les module de feuille ou le module ThisWorkbook)

Application.EnableEvents = False      ' Impératif à remettre à True
' .
' .
Application.EnableEvents = True
End Sub

Merci encore pour ta réponse!

En effet, je n'ai pas précisé! c'est l'exécution qui est très longue!! bien que le code le soit aussi, mais ca ne me dérange pas!!

J'ai essayer de rajouter ce que tu m'as dit au début et à la fin du code, mais sans résultat!!

Bonsoir

Désolé mais je n'ai pas d'autre idée

Et sans ton fichier pour tester je ne sais pas comment t'aider

Peut-être que quelqu'un autre a une solution

Banzai64 a écrit :

Bonsoir

Désolé mais je n'ai pas d'autre idée

Et sans ton fichier pour tester je ne sais pas comment t'aider

Peut-être que quelqu'un autre a une solution

Merci quand même, je vais voir pour remplacer les données de l'entreprise puis je le mettrais en ligne!

Bonne soirée et bon weekend.

Bonsoir tout le monde.

Donc voila mon problème:

A l'ouverture du fichier, je clic sur "Ajout ou modification tableau DM", tout va bien, le tableau s'affiche tout de suite.

Si je clic sur "rechercher un symbole" ensuite je rentre "88888" ou "99999" (numéro saisi pour le test du fichier), puis je double clic sur le résultat de la recherche, mes données s'affichent sans problème donc tout va bien.

Par contre, si je reclic maintenant sur "Ajout ou modification tableau DM" la le tableau met beaucoup de temps à s'afficher!!

D'où ma question: Peut on améliorer mon code ou autre chose afin que ce petit programme soit plus fluide.

Je précise encore une fois que je suis novice et que c'est mon premier fichier avec VBA, donc merci de m'expliquer si quelqu'un a une solution.

Ce dernier n'est pas encore fini, j'ai encore beaucoup de chose que je veux faire dessus, mais une chose après l'autre.

Merci d'avance.

Bonsoir

A priori c'est la fonction Find qui prend du temps (j'aurai pas cru)

Une solution à mieux tester

Remplaces le début de ma macro par celle-ci

Private Sub UserForm_activate()
Dim Lig

Application.ScreenUpdating = False ' désactive le rafraichissement de l'ecrant. Permet de gagner du temps. a remettre a la fin.
Application.Calculation = xlCalculationManual ' augmente la vitesse de recherche en désactivant le calcul auto des cellules. a remettre a la fin.
With Sheets("DM") ' feuille ou sont mes infos d'avance
Lig = Application.Match(Range("cel_symbole"), .Columns("A"), 0)
If IsError(Lig) Then
  Exit Sub
End If
TBox_DM_1 = .Cells(Lig, "B")  ' va porter les infos sur la bonne ligne
TBox_DM_2 = .Cells(Lig, "I")
Banzai64 a écrit :

Bonsoir

A priori c'est la fonction Find qui prend du temps (j'aurai pas cru)

Une solution à mieux tester

Remplaces le début de ma macro par celle-ci

Private Sub UserForm_activate()
Dim Lig

Application.ScreenUpdating = False ' désactive le rafraichissement de l'ecrant. Permet de gagner du temps. a remettre a la fin.
Application.Calculation = xlCalculationManual ' augmente la vitesse de recherche en désactivant le calcul auto des cellules. a remettre a la fin.
With Sheets("DM") ' feuille ou sont mes infos d'avance
Lig = Application.Match(Range("cel_symbole"), .Columns("A"), 0)
If IsError(Lig) Then
  Exit Sub
End If
TBox_DM_1 = .Cells(Lig, "B")  ' va porter les infos sur la bonne ligne
TBox_DM_2 = .Cells(Lig, "I")

Ouaou!!! super, ca marche à merveille!!

c'était toi qui avait créé cette macro à la base??

Peux tu m'expliquer la différence entre les deux codes si tu veux bien?

Je pensais qu'il fallait toujours déclarer le type de variable?? ce n'est pas le cas dans ce code non?

Est ce qu'il est possible, comme pour cette exemple, d'accélérer la recherche "recherchetous"?

Merci encore pour tous c'est vraiment sympa!

Bonjour

La fonction Find est énormément utilisée et je n'avais pas remarqué cette durée

Find c'est ce que tu obtiens en faisant Ctrl f (Rechercher)

Match c'est la fonction Excel EQUIV()

cos81 a écrit :

Je pensais qu'il fallait toujours déclarer le type de variable?

La variable est déclarée en ...Variant qui est le type par défaut

Comme cette fonction peut retourner une erreur, si la recherche n'existe pas, il faut la déclarer en Variant( elle acceptera toutes sorte de données - Nombre, Chaine de caractère etc ....)

Une fois la recherche faite on teste le retour de la variable et si c'est une erreur on quitte le programme

cos81 a écrit :

Est ce qu'il est possible, comme pour cette exemple, d'accélérer la recherche "recherchetous"?

Bien sur tu peux t'en inspirer (c'est pas compliqué)

Évites le bouton "Citer" pour répondre, utilises le bouton "Répondre" en bas à gauche du dernier message

.

OK, merci beaucoup pour ton aide et tes explications!!

J'ai encore beaucoup de solution a trouver, mais la je vais essayer de me débrouiller seul maintenant.

Je classe en résolu!

Bonne continuation à toi.

Re bonjour, j'ai une dernière question qui concerne toujours ce même fichier, je n'ouvre donc pas un nouveau sujet!

J'ai un petit souci, lorsque je rempli mon tableau "ajout ou modification de tableau DM" puis je clic sur "valider les modifications" , toutes mes valeurs sont bien retranscrites a l'endroit désiré, mais mon problème est que mes valeurs "colonnes (Qté Cdé)" qui devraient être numérique sont interprété comme du texte!! Et donc mes calculs ne fonctionnent plus!

Cela fait quelques heures que je cherches, et j'ai trouvé le terme "CLng qu'il faut rajouter, ce qui donne par exemple:

.Cells(Lig, "E") = CLng(TBox_QtéDM_1)

Ce code fonctionne bien quand le textbox est rempli, par contre lorsque ce n'est pas rempli, j'ai le message d'erreur :

"erreur 13 incompatibilité de type"

Est ce que quelqu'un aurait une solution pour y remédier?

Ne pourrait on pas mettre un code directement dans les textbox concerné pour définir un format texte?

Merci d'avance.

Rechercher des sujets similaires à "vba affichage modification donnes"