stage_ferrit
XLDnaute Nouveau
Bonjour à toutes et à tous,
Je suis actuellement en stage au sein d'une entreprise d'usinage et de traitement de surface dans laquelle j'ai été amené à faire un outil excel pour obtenir le prix de revient des pièces.
Je n'avais quasiment aucunes connaissances en vba je pense donc que le fonctionnement de mon programme peut-être largement amélioré.
Le programme actuel fonctionne mais il est un peu long (2-3 secondes) et je cherche des pistes pour l'améliorer.
Par soucis de confidentialité je n'ai pas le droit d'envoyer mon classeur et je dois mettre des noms de variables lambda, mais je vais essayer d'être le plus clair possible.
Explication :
Le classement est composé de plusieurs tables :
- "Formulaire" : table dans laquelle l'utilisateur est amené à rentrer les dimensions de la pièce et choisir quelques options
- "Matière 1" : table contenant les prix de la matière 1 choisie par l'utilisateur (différents tubes avec des épaisseurs différentes)
- "Matière 2" : table contenant les prix de la matière 1 choisie par l'utilisateur (différents tubes avec des épaisseurs différentes)
-" OP 1": table contenant les tarifs de sous traitance d'une opération spécifique sur la pièce
-" OP 2": table contenant les tarifs de sous traitance d'une opération spécifique sur la pièce
-"Usinage": table permettant de faire une approximation du coût d'usinage en interne
"Historique vente" : table dans laquelle les anciens chiffrages de pièce ont été rentré
"Historique chiffrage": table dans laquelle les chiffrages récents sont ajouté (supprimé à chaque ouverture du programme)
___
Je suis amené à plusieurs reprise à parcourir des tableaux, notamment pour les matières utilisées, je parcours chaque ligne jusqu'à trouver un tube correspondant aux dimensions de la pièce :
Éxiste-t-il une méthode plus rapide que celle-ci? parce que j'ai l'impression que le programme prend beaucoup de temps pour faire la sélection.
___
Étant donné que je vais chercher les données dans plusieurs tables différentes, existe-t-il une commande différencte de "Sheets("Formulaire").Select" qui n'afficherai pas la feuille du point de vue utilisateur mais qui permettrai de sélectionner des données dans celle-ci?
___
Pour ajouter le chiffrage dans la feuille "historique de chiffrage" et la mettre en forme , j'utilise ce code :
J'utilise la même méthode pour que les tubes de matière je sélectionne toutes les cellules avec CTRL+* et je compte le nombre de ligne de la sélection afin de pouvoir rajouter une nouvelle ligne à la suite, et ensuite je rajoute les bordures.
Dans mon vrai fichier de calcul j'ai plus de 10 tables au total car il y a de nombreux fournisseurs, et je n'ai pas utilisé d'userform, juste des boutons de commande avec des combos box et des cases à cocher. Dès que je clique sur le bouton "Calculer", on peut apercevoir tout les changements de tables c'est cela que je cherche à éviter, je cherche vraiment à remplacer les selects et activate mais je n'y arrive pas.
Merci d'avance à tous
Je suis actuellement en stage au sein d'une entreprise d'usinage et de traitement de surface dans laquelle j'ai été amené à faire un outil excel pour obtenir le prix de revient des pièces.
Je n'avais quasiment aucunes connaissances en vba je pense donc que le fonctionnement de mon programme peut-être largement amélioré.
Le programme actuel fonctionne mais il est un peu long (2-3 secondes) et je cherche des pistes pour l'améliorer.
Par soucis de confidentialité je n'ai pas le droit d'envoyer mon classeur et je dois mettre des noms de variables lambda, mais je vais essayer d'être le plus clair possible.
Explication :
Le classement est composé de plusieurs tables :
- "Formulaire" : table dans laquelle l'utilisateur est amené à rentrer les dimensions de la pièce et choisir quelques options
- "Matière 1" : table contenant les prix de la matière 1 choisie par l'utilisateur (différents tubes avec des épaisseurs différentes)
- "Matière 2" : table contenant les prix de la matière 1 choisie par l'utilisateur (différents tubes avec des épaisseurs différentes)
-" OP 1": table contenant les tarifs de sous traitance d'une opération spécifique sur la pièce
-" OP 2": table contenant les tarifs de sous traitance d'une opération spécifique sur la pièce
-"Usinage": table permettant de faire une approximation du coût d'usinage en interne
"Historique vente" : table dans laquelle les anciens chiffrages de pièce ont été rentré
"Historique chiffrage": table dans laquelle les chiffrages récents sont ajouté (supprimé à chaque ouverture du programme)
___
Je suis amené à plusieurs reprise à parcourir des tableaux, notamment pour les matières utilisées, je parcours chaque ligne jusqu'à trouver un tube correspondant aux dimensions de la pièce :
VB:
'recherche tube
Sheets(matiere).Select
'test dimensions maximales tube de la matière choisie
Range("A1").Select
Selection.CurrentRegion.Select
row_mat = Selection.Rows.Count 'nombre de ligne du tableau de tubes afin d'arrêter la boucle while de recherche de tube
i = 1
test_ok = 0
While test_ok = 0
If Cells(i, 1) > dext And Cells(i, 2) < dint Then 'test si le Dext du tube est supérieur au Dext de la pièce et si le Dint du tube est inférieur à celui de la pièce
test_ok = 1
'calcul et affichage prix matière dans le tableau
prix_matiere = Cells(i, 3) 'unité prix_matiere : €/m
prix_matiere = prix_matiere * longueur / 1000
dint_tube = Application.WorksheetFunction.Round(Cells(i, 2), 2)
dext_tube = Application.WorksheetFunction.Round(Cells(i, 1), 2)
ElseIf i > row_mat Then 'permet d'arrêter la boucle while si aucun tube n'est compatible
test_ok = 1
erreur = 1
MsgBox "Pas de tube disponible!"
Else
i = i + 1
End If
Wend
Éxiste-t-il une méthode plus rapide que celle-ci? parce que j'ai l'impression que le programme prend beaucoup de temps pour faire la sélection.
___
Étant donné que je vais chercher les données dans plusieurs tables différentes, existe-t-il une commande différencte de "Sheets("Formulaire").Select" qui n'afficherai pas la feuille du point de vue utilisateur mais qui permettrai de sélectionner des données dans celle-ci?
___
Pour ajouter le chiffrage dans la feuille "historique de chiffrage" et la mettre en forme , j'utilise ce code :
Code:
Sheets("HISTORIQUE CALCULS").Select
Range("A1").Select
Selection.CurrentRegion.Select
i = Selection.Rows.Count + 1
Cells(i, 1) = caracteristique1
Cells(i, 2) = caracteristique2
Cells(i, 3) = caracteristique3
Cells(i, 4) = caracteristique4
Cells(i, 5) = caracteristique5
Cells(i, 6) = caracteristique6
Cells(i, 7) = caracteristique7
Cells(i, 8) = caracteristique8
Cells(i, 9) = caracteristique9
Cells(i, 10) = caracteristique10
Cells(i, 11) = caracteristique11
Cells(i, 12) = caracteristique12
Cells(i, 13) = caracteristique13
Cells(i, 14) = caracteristique14
Cells(i, 15) = caracteristique15
For row = 1 To i
For col = 10 To 15
Cells(row, col).NumberFormat = "#,##0.00 $"
Next
Next
Cells(i, 1).Select
Range(Selection, Selection.End(xlToRight)).Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = 0
.TintAndShade = 0
.Weight = xlThin
End With
J'utilise la même méthode pour que les tubes de matière je sélectionne toutes les cellules avec CTRL+* et je compte le nombre de ligne de la sélection afin de pouvoir rajouter une nouvelle ligne à la suite, et ensuite je rajoute les bordures.
Dans mon vrai fichier de calcul j'ai plus de 10 tables au total car il y a de nombreux fournisseurs, et je n'ai pas utilisé d'userform, juste des boutons de commande avec des combos box et des cases à cocher. Dès que je clique sur le bouton "Calculer", on peut apercevoir tout les changements de tables c'est cela que je cherche à éviter, je cherche vraiment à remplacer les selects et activate mais je n'y arrive pas.
Merci d'avance à tous