Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

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
 
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+
 
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:
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
 
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+
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
4
Affichages
645
Réponses
10
Affichages
580
Réponses
5
Affichages
779
Réponses
8
Affichages
315
Réponses
9
Affichages
286
Réponses
2
Affichages
357
Réponses
4
Affichages
708
Retour