XL 2013 Méthode de sélection alternative

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 :
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
 
Solution
Bonjour Stage_Ferrit, et bienvenu pour votre premier message sur XLD,
Alors quelques pistes en vrac :
1- Si vous touchez aux cellules, pour accélérer les choses mettez juste après Sub en première ligne instructions : Application.ScreenUpdating = false
ce qui va figer le rafraîchissement d'affichage et accélérer les choses. ( le true en sortant pour cette instruction est inutile elle est automatique )
2- Vous pouvez remplacer :
VB:
   For row = 1 To i
        For col = 10 To 15
            Cells(row, col).NumberFormat = "#,##0.00 $"
        Next
    Next
par
Code:
Range(Cells(1, 10), Cells(i, 15)).NumberFormat = "#,##0.00 $"
3- Mais le plus efficace est de passer :
Code:
Range("A1").Select
Selection.CurrentRegion.Select
dans un array ...

sylvanu

XLDnaute Barbatruc
Supporter XLD
Bonjour Stage_Ferrit, et bienvenu pour votre premier message sur XLD,
Alors quelques pistes en vrac :
1- Si vous touchez aux cellules, pour accélérer les choses mettez juste après Sub en première ligne instructions : Application.ScreenUpdating = false
ce qui va figer le rafraîchissement d'affichage et accélérer les choses. ( le true en sortant pour cette instruction est inutile elle est automatique )
2- Vous pouvez remplacer :
VB:
   For row = 1 To i
        For col = 10 To 15
            Cells(row, col).NumberFormat = "#,##0.00 $"
        Next
    Next
par
Code:
Range(Cells(1, 10), Cells(i, 15)).NumberFormat = "#,##0.00 $"
3- Mais le plus efficace est de passer :
Code:
Range("A1").Select
Selection.CurrentRegion.Select
dans un array :
Code:
tablo=Range("A1").CurrentRegion
et ensuite de ne travailler la recherche que dans ce tableau. On gagne énormément de temps.
4- Quand au quadrillage, s'il s'agit de faire un quadrillage classique on peut faire par ex :
Code:
Range("A1:H30").Borders.Weight = xlThin

et je pense qu'il y en a d'autres.
 

stage_ferrit

XLDnaute Nouveau
Merci Sylvanu pour votre réponse,

Je viens d'effectuer toutes les modifications et effectivement c'est bien plus rapide merci bien.

Je viens d'avoir un problème après avoir fait ces modifications, chaque fois que je clique sur le bouton "Calculer" qui lance la macro, le texte s'agrandit jusqu'à ce qu'il disparaisse.

Pour le remettre correctement je suis obligé d'activer le mode édition, puis de l'agrandir et le remettre comme avant.

Je trouve cela vraiment bizarre d'autant plus que je n'agit pas sur le bouton dans mon code.

Merci d'avance
 

sylvanu

XLDnaute Barbatruc
Supporter XLD
Euh ... " le texte s'agrandit jusqu'à ce qu'il disparaisse "
Quel texte ? Il disparaît comment ? La taille diminue ?
Je ne vois pas dans les modifs ce qui pourrait provoquer ça.
Les modifs étant simples, il suffit de reprendre l'original et de mettre modif par modif pour trouver le coupable.
Possible qu'il y est interaction avec tout le reste des macros que je ne connais pas.
 

stage_ferrit

XLDnaute Nouveau
Bonjour,

Après plusieurs essais, il me semble que c'est un bug d'excel car je ne vois pas d'autres solutions.
La taille du bouton reste identique, mais à chaque fois que je clique la taille de texte dans le bouton augmente et au bout d'un certain moment il est tellement grand qu'on ne voit plus aucun texte, cependant merci pour votre réponse précedente qui m'a permis d'avancer.
 
Dernière édition:

Discussions similaires

Réponses
8
Affichages
640

Statistiques des forums

Discussions
312 074
Messages
2 085 066
Membres
102 770
dernier inscrit
mathieu.lemaitre