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+
 

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

Réponses
11
Affichages
308

Statistiques des forums

Discussions
312 366
Messages
2 087 643
Membres
103 627
dernier inscrit
nabil