Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Eviter "Select"

thierry.bayard

XLDnaute Junior
Bonjour,

Je tente d'améliorer mes codes VBA en supprimant un maximum les "select" et autres "Activate" mais je bloque certaines fois. Je vous donne un extrait de code (le fichier est trop lourd) qui ne fonctionne que si j'ajoute une ligne "Sheets("Activité").select

Code:
 Dim zone As Range
    Dim lig As Long
    Dim c As Range
    Dim i As Long
    Dim j As Long
    
    With Sheets("Activité")
        If OB_mois = True Then
            If Combo_mois1 = "" Then
                MsgBox "Merci de compléter le mois choisi"
                Exit Sub
            End If
            .Range("Somme_de").Value = Sheets("Calendrier").Range("K" & Combo_mois1.ListIndex + 2).Value + 5
            .Range("Somme_a").Value = .Range("Somme_de").Value
            Else
            If OB_moiss = True Then
                If Combo_mois2 = "" Or Combo_mois3 = "" Then
                    MsgBox "Merci de compléter le mois de début et le mois de fin."
                    Exit Sub
                End If
                If Sheets("Calendrier").Range("K" & Combo_mois2.ListIndex + 2).Value > Sheets("Calendrier").Range("K" & Combo_mois3.ListIndex + 2).Value Then
                    MsgBox "Le mois de fin doit être postérieur au mois de début."
                    Exit Sub
                End If
                .Range("Somme_de").Value = Sheets("Calendrier").Range("K" & Combo_mois2.ListIndex + 2).Value + 5
                .Range("Somme_a").Value = Sheets("Calendrier").Range("K" & Combo_mois3.ListIndex + 2).Value + 5
                Else
                .Range("Somme_de").Value = 7
                .Range("Somme_a").Value = 18
            End If
        End If
        Set zone = .Range("AK2:AK" & .Range("D1").End(xlDown).Row)
    End With
    
    i = Range("Somme_de").Value
    j = Range("Somme_a").Value
    

    For Each c In zone
        lig = c.Row
        c.Value = Application.WorksheetFunction.Sum(Range(Cells(lig, i), Cells(lig, j)))
    Next

Sans ce select, la somme demandée en fin de code ne s'effectue pas si la macro est lancée depuis une feuille autre que "Activité". Avez-vous une idée de ce qui bloque ?

Merci d'avance pour votre aide

Thierry
 

Paf

XLDnaute Barbatruc
Re : Eviter "Select"

Bonjour

c.Value = Application.WorksheetFunction.Sum(Range(Cells(lig, i), Cells(lig, j)))

Le Range fait référence à la feuille courante et non à la Sheets("Activité")

A essayer
Code:
    With Sheets("Activité")
    For Each c In zone
        lig = c.Row
        c.Value = Application.WorksheetFunction.Sum(.Range(Cells(lig, i), Cells(lig, j)))
    Next
    End With

A+
 

MJ13

XLDnaute Barbatruc
Re : Eviter "Select"

Bonjour Thierry, Paf

Faut arrêter d'écouter tout ce qu'on te dit .

Les select sont souvent très utiles, tant qu'ils ne ralentissent pas anormalement tes macros .
 

thierry.bayard

XLDnaute Junior
Re : Eviter "Select"

Bonjour Paf,

Merci pour ton conseil, visiblement, cela fonctionne. Je ne pensait pas qu'il était nécessaire de réouvrir un With Sheets("Activité") puisque nous avions déjà défini "zone".
Je retiens...

Merci encore et bon WE

Thierry
 

MJ13

XLDnaute Barbatruc
Re : Eviter "Select"

Re

Ok, c'est vrai que dans ce cas, c'est plus rapide .

Mais souvent, on doit aussi penser aux codes type Workbook().Sheets().cells() si on travaille sur plusieurs classeurs en même temps.
 

grisan29

XLDnaute Accro
Re : Eviter "Select"

bonsoir MJ13 ,paf, thierry_bayard et le forum

dans le code du 1er post le "end with" est mis trop haut ce qui fait que ce qu'il y a dessous fait référence à la feuille courante comme l'avais souligné Paf, il faudrait le mettre après le next sans savoir ce qui suit et mettre un point devant les range

Pascal
 
Dernière édition:

Staple1600

XLDnaute Barbatruc
Re : Eviter "Select"

Bonsoir


En ce vendredi soir, hommage a Jethro Gibbs avec une règle :
La numéro 5
5. You Rarely Need to Select or Activate any Objects to Change Their Properties or Access Their Methods. If you MUST Select a Range Object, Use GoTo.

Si ce genre de conseils se retrouve sur tous les forums dédiés à Excel quel que soit la langue qu'on y parle, c'est qu'il y a surement un motif valable de la suivre

Et c'est sans doute aussi pourquoi la plupart d'entre nous la distillent sur XLD

PS: Règle issue des VBA CODE GOLDEN RULES
 

Paf

XLDnaute Barbatruc
Re : Eviter "Select"

Bonsoir à tous

.... Je ne pensait pas qu'il était nécessaire de réouvrir un With Sheets("Activité") puisque nous avions déjà défini "zone".

Le réemploi de With Sheets("Activité") (ou le décalage de End With comme le préconise grisan29) n'a pas pour but de référencer c.Value puisque c'est une cellule de zone déjà référencée (par Set zone = .Range( ...), mais de référencer la plage dont on doit faire la somme.
Application.WorksheetFunction.Sum(.Range(Cells(lig, i), Cells(lig, j)))

A+
 

Discussions similaires

Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…