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 :

Comment modifier la plage utilisé par le code en renseignant une ou plusieurs cellule d'une feuille [XL-2010]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    responsable d'équipe
    Inscrit en
    Décembre 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : responsable d'équipe
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2017
    Messages : 51
    Par défaut Comment modifier la plage utilisé par le code en renseignant une ou plusieurs cellule d'une feuille
    Bonjour

    Dans mon code il y a une référence à une plage, je souhaiterais pouvoir changer cette plage en renseignant une cellule (ex sur la feuille congé dans la cellule en N23 en y inscrivant C9:M52) ou deux cellules (ex:sur la feuille congé dans la cellule N23 en y inscrivant C9 et dans la cellule N24 en y inscrivant M52).
    Ainsi je n'aurai pas à aller changer la plage dans le code de chaque plage au risque d'en oublier car mon tableau évolue en insérant des lignes au cours de l'année.

    Voila en rouge ce que je souhaite changer dans mon code

    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
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    Public Flag As Boolean
    
    Dim nABSSOGJ&, nABSINC2J&, nABSINC1J&, nABSSOGN&, nABSINC2N&, nABSINC1N&, n12h&, nCA&, nCAJ&, nCAN&, nRPM&
    
    Private Sub Worksheet_Change(ByVal Target As Range)
    Dim PW As String
    Dim nABSSOGJ As Double
    Dim nABSINC2J As Double
    Dim nABSINC1J As Double
    Dim nABSSOGN As Double
    Dim nABSINC2N As Double
    Dim nABSINC1N As Double
    If Intersect([C9:M52], Target) Is Nothing Then Exit Sub
    Col = Chr(Target.Column + 64)
    [Q2] = Col & [C67] & ":" & Col & [D67] ' Nombre absence jour sur plage des SOG
    [R2] = Col & [C68] & ":" & Col & [D68] 'Nombre absence jour sur plage des INC2
    [S2] = Col & [C69] & ":" & Col & [D69] 'Nombre absence jour sur plage des INC1
    [U2] = Col & [C67] & ":" & Col & [D67] 'Nombre absence nuit sur plage des SOG
    [V2] = Col & [C68] & ":" & Col & [D68] 'Nombre absence nuit sur plage des INC2
    [W2] = Col & [C69] & ":" & Col & [D69] 'Nombre absence nuit sur plage des INC1
    
    nABSSOGJ = Range("Q1")
    nABSINC2J = Range("R1")
    nABSINC1J = Range("S1")
    nABSSOGN = Range("U1")
    nABSINC2N = Range("V1")
    nABSINC1N = Range("W1")
    
    If nABSSOGJ > [D73] Or nABSSOGN > [D73] Then
        MsgBox "Le nombre maximal de SOG absent est atteint !", vbCritical, "Absence SOG"
        Target.Interior.Color = RGB(255, 255, 255)
        Application.EnableEvents = False
        Target.ClearContents
        Application.EnableEvents = True
    End If
    
    If nABSINC2J > [D74] Or nABSINC2N > [D74] Then
        MsgBox "Le nombre maximal d'INC2 absent est atteint !", vbCritical, "Absence INC2"
        Target.Interior.Color = RGB(255, 255, 255)
        Application.EnableEvents = False
        Target.ClearContents
        Application.EnableEvents = True
    End If
    
    If nABSINC1J > [D75] Or nABSINC1N > [D75] Then
        MsgBox "Le nombre maximal d'INC1 est atteint !", vbCritical, "Absence INC1"
        Target.Interior.Color = RGB(255, 255, 255)
        Application.EnableEvents = False
        Target.ClearContents
        Application.EnableEvents = True
    End If
    
    If Intersect([C9:M52], Target) Is Nothing Then Exit Sub
    nCA = Application.CountIf(Intersect([9:52], Target.EntireColumn), "CA")
    nRPM = Application.CountIf(Intersect([9:52], Target.EntireColumn), "RPM")
    nCAJ = Application.CountIf(Intersect([9:52], Target.EntireColumn), "CAJ*")
    nCAN = Application.CountIf(Intersect([9:52], Target.EntireColumn), "*CAN")
     
    If (nCA + nCAJ + nRPM) > [C70] Or (nCA + nCAN + nRPM) > [C70] Then
        MsgBox "Le nombre maximal de 12 CA total est déjà atteint !", vbCritical, "Saisie CA"
        Target.Interior.Color = RGB(255, 255, 255)
        Application.EnableEvents = False
        Target.ClearContents
        Application.EnableEvents = True
    End If
    
    If Intersect([C9:M52], Target) Is Nothing Then Exit Sub
    n12h = Application.CountIf(Intersect([9:52], Target.EntireColumn), "12h")
        
        If n12h > [C71] Then
        MsgBox "Le nombre maximal de 12h pour ce jour est déjà atteint !", vbCritical, "Saisie 12h"
        Target.Interior.Color = RGB(255, 255, 255)
        Application.EnableEvents = False
        Target.ClearContents
        Application.EnableEvents = True
    
    End If
    End Sub
    Merci bien
    Fichiers attachés Fichiers attachés

  2. #2
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Bonjour,
    Pour utiliser les données inscrites dans une cellule, il faut jouer avec Value. Par exemple, supposons qu'en cellule A1, j'ai écrit le chiffre 3. Je veux effacer le contenue de la cellule B3. J'écris :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B" & Range("A1").Value).ClearContents
    La partie en orange va retourner 3, car c'est la valeur de la cellule A1. Donc, ce code est équivalent à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("B3").ClearContentes

  3. #3
    Membre confirmé
    Homme Profil pro
    responsable d'équipe
    Inscrit en
    Décembre 2017
    Messages
    51
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : responsable d'équipe
    Secteur : Service public

    Informations forums :
    Inscription : Décembre 2017
    Messages : 51
    Par défaut
    par exemple sur mon code d'avril

    À la place de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Intersect([C9:M52], Target) Is Nothing Then Exit Sub
    J'ai mis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Intersect([Range("C76"):Range("D76")], Target) Is Nothing Then Exit Sub
    Mais ça ne fonctionne pas

    Je souhaiterais trouver quelque chose qui donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Intersect([ce qui est inscrit en C76:ce qui est inscrit en C77], Target) Is Nothing Then Exit Sub
    ainsi quand je changerai la plage en C76 et en C77, la plage dans mon code sera mise à jour

    fichier joint mis à jour

    merci
    Fichiers attachés Fichiers attachés

  4. #4
    Membre expérimenté
    Profil pro
    au repos
    Inscrit en
    Février 2013
    Messages
    161
    Détails du profil
    Informations personnelles :
    Localisation : Saint-Pierre-Et-Miq.

    Informations professionnelles :
    Activité : au repos

    Informations forums :
    Inscription : Février 2013
    Messages : 161
    Par défaut
    Salut,
    on pourrait aussi utiliser des plages nommées (par feuille) :

    Nom : ZoneUtile.PNG
Affichages : 89
Taille : 13,8 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Intersect([ZoneUtile], Target) Is Nothing Then Exit Sub
    L'avantage d'une plage nommée c'est que si on rajoute une ligne ou on en supprime une , elle s'adapte.

    Nullosse, le plus nul des apprentis programmeur

  5. #5
    Membre Expert
    Femme Profil pro
    Ingénieur
    Inscrit en
    Octobre 2016
    Messages
    1 703
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2016
    Messages : 1 703
    Par défaut
    Il faut faire attention à l'endroit où tu places tes guillemets et tes :.
    Prenons par exemple une variable i :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim i As Integer
    i = 3
    MsgBox Range("A" & i).Value      'renvoie la valeur de la cellule A3
    Maintenant, on prend 2 variables :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Dim i As Integer
    Dim j as Integer
    i = 3
    j = 4
     
    Range("A" & i & ":B" & j).Value = "toto"        'inscrit toto dans la plage A3:B4
    '.....équivalent à .....
    Range("A3:B4").Value = "toto"
    Je ne sais pas utiliser la syntaxe [A1:B3], mais j'ai lu plusieurs fois sur ce forum qu'elle est à éviter. Je ne saurai donc pas te donner la syntaxe avec tes variables. Il serait plus facile que tu utilises Range :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Intersect(Range(Range("C76").Value & ":" & Range("D76").Value), Target) Is Nothing Then Exit Sub

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 19/12/2011, 23h55
  2. [OL-2003] Comment connaitre le certificat utilisé par IMAP ?
    Par ram-0000 dans le forum Outlook
    Réponses: 0
    Dernier message: 15/09/2009, 15h06
  3. Codeguard dans une DLL utilisé par du code managé
    Par Volfoni dans le forum C++Builder
    Réponses: 0
    Dernier message: 06/11/2008, 17h06
  4. Réponses: 3
    Dernier message: 18/02/2008, 14h05
  5. Réponses: 2
    Dernier message: 22/06/2006, 14h45

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