IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Blocage/Deblocage cellules VBA - erreur [Toutes versions]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2015
    Messages : 59
    Par défaut Blocage/Deblocage cellules VBA - erreur
    Bonjour,
    J'aimerais pouvoir lorsqu'une procédure événementielle s'exécute débloquer temporairement la feuille pour que cela se passe sans encombre. J'ai écrit le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    Private Sub Worksheet_Change(ByVal Target As Range)
    'empêcher de faire scintiller l'écran pendant l'éxécution du programme
        Application.ScreenUpdating = False
        Dim plage As Range, C As Range, d As Range
     
        ActiveSheet.Protect Password:="test", DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFormattingCells:=True
        ActiveSheet.EnableSelection = xlUnlockedCells
     
    ' automatisation de la trame de base
    'masquage des lignes vides lorsque le service n'est pas pourvu en fonction (IDE nuit, ASD)
        Set plage = [a7: a100]
        For Each C In plage
     
            If C.Value = "0" Then
                C.EntireRow.Hidden = True
            Else
                C.EntireRow.Hidden = False
            End If
        Next C
        Set plage = Nothing
    'masquage de Colonnes pour respect de la longueur des mois (calendrier)
    '(doit être associé à une formule conditionnelle =SI(AD6<>"";SI(MOIS(AD6)=MOIS(AD6+1);AD6+1;"");"")
        Set plage = Range("AD5:AF5")
        For Each d In plage
            If d.Value = "" Then
                d.EntireColumn.Hidden = True
            Else
                d.EntireColumn.Hidden = False
            End If
        Next d
        Set plage = Nothing
        Columns("AG").EntireColumn.Hidden = True
        Sheets("TRAME").Protect
    End Sub
    Le problème est qu'un message "impossible de définir la propriété Hidden de la classe Range." qui apparaît pour le premier "entirecolumn.Hidden" à l'exécution seules certaines plages sont déverrouillées pour modification manuelle. Ce code en question fonctionne quand la feuille n'est pas bloquée.

    Merci pour votre aide!

  2. #2
    Membre Expert Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 904
    Par défaut
    Bonjour,

    D'un autre côté... ton code demande une protection de l'onglet actif...

    Ce code en question fonctionne quand la feuille n'est pas bloquée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     ActiveSheet.Protect Password:="test", DrawingObjects:=True, Contents:=True, Scenarios:=True, AllowFormattingCells:=True
        ActiveSheet.EnableSelection = xlUnlockedCells
    A mon avis, ton code et toi n'êtes pas synchro. Tu penses avoir une chose alors que ton code fait l'inverse.

    Cordialement,

  3. #3
    Membre averti
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2015
    Messages : 59
    Par défaut
    Effectivement apparemment le changement de ActiveSheet par sheets("NOM_Feuil") semble résoudre le problème.

    Merci

  4. #4
    Membre Expert Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 904
    Par défaut
    Ah ben oui ! Ce genre de truc est un vrai sac à erreurs.
    Pour ça, éviter au maximum les activesheets, activeworkbook, range("truc")...

  5. #5
    Membre averti
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Avril 2015
    Messages
    59
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ressources humaines
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2015
    Messages : 59
    Par défaut
    Il faut utiliser quoi comme alternative à range("truc")? parce que pour ActiveMachin j'ai Machin("nom")...

  6. #6
    Membre Expert Avatar de Gado2600
    Homme Profil pro
    Développeur Office VBA
    Inscrit en
    Mai 2013
    Messages
    904
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur Office VBA

    Informations forums :
    Inscription : Mai 2013
    Messages : 904
    Par défaut
    Bonjour,

    Le mieux c'est de définir ce dont tu as besoin.

    Par exemple, quand tu utilises :
    cela indique tu es sur la worksheet active. Or, quelle est la worksheet active ? Celle définit précédemment par un :

    En allant plus loin, la sheets(1) vient de quel workbook ? Bref, voilà comment, au début, on fait ses codes VBA Excel.
    Sauf que, pour une raison x ou y, durant le processus de ton code qui peut faire 15 000 lignes (avec tous ces .activate, .select...), la worksheet active change (exemple le plus simple mais tellement vrai : l'utilisateur est impatient et veut regarder un truc sur un autre fichier Excel que celui en cours d'exécution).
    Ton workbook actif peut changer, ce qui implique que ta sheets(1) n'est plus la même que celle que tu voulais utiliser et, par conséquence, ta Range("A1") n'est, encore par exemple, plus de type numérique mais de type texte. (pas de chance, tu te retrouves avec du "TOTO+1" au lieu de "4+1").

    Bref, ces petits événements de "pas de chance" font plantés ton code, ou pire, te retournent des résultats erronés, sans que tu tu le vois.

    Pour être certain des choses sur lesquelles tu pointes, en début de code, définit tes objets proprement.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    dim ExcelWkActive as workbook
    dim ExcelWSActive as worksheet
    dim rng as range
     
    set ExcelWKActive = activeworkbook ' ou Thisworkbook qui fonctionne bien aussi
    set ExcelWsActive = excelwkactive.sheets(1)
    set rng = excelwkactive.range("A1")
    Cela te permet de ne plus avoir besoin des .activates, .select, etc... etc..

    Cordialement,

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VBA] Erreur 52 lorsqu'il y a déconnexion au serveur
    Par banzaii dans le forum Général VBA
    Réponses: 6
    Dernier message: 27/06/2017, 22h49
  2. Aide VBA Programmer des alertes et des blocages de cellules
    Par Mokia34 dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 06/11/2012, 20h44
  3. [VBA] Erreur Sur Recopie De Cellule
    Par CIBOOX dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 09/01/2007, 10h48
  4. [VBA-E]contenu d'une cellule gestion erreur macro
    Par matou_aouh dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 21/03/2006, 10h18
  5. [VBA] Erreur dans une requête
    Par Damsou dans le forum Access
    Réponses: 31
    Dernier message: 21/06/2005, 17h04

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo