VBA Excel selectionner un plage

Résolu
Lila_35 -  
coco_rico Messages postés 32 Statut Membre -
Bonjour,

Lors d'un choix dans une combobox d'un certain domaine [ Range("Q4:Q63") ] on souhaite sélectionner une plage plus réduite d'autre données.
La procédure pour la sélection des plages plus réduite fonctionne bien mais pour le choix dans la première combobox, je ne peux le faire que pour une cellule ( dans mon cas "Q4").

Le code parlera plus.

Voici l'appel de la macro lors des changements dans les combobox :
Private Sub Worksheet_Change(ByVal Target As Range)
   Select Case Target.Address

        Case Range("Q4").Address  ' ou Case Range("Q4").ends(xldown).adress  
          
                Application.Run "'" & Excel.ActiveWorkbook.Path & "\MaMacro.xls'!MacrosChange"
     
   End Select
                
End Sub


Et voilà la macro ( qui rempli son rôle mais que pour un case...) :
Public Sub MacrosChange()
'
' Selection des codes projets en fonction du nom du domaine
' Macro enregistrée le 18/06/2009 par odaxys
'
    
    If Range("Q4").Text = "Domaine1" Then
    
        With Selection.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=CdPr1"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
        End With
        
    ElseIf Range("Q4").Text = "Domaine2" Then
    
        With Selection.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=CdPr2"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
        End With
    
    ElseIf Range("Q4").Text = "Domaine3" Then
        
        With Selection.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=CdPr3"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
        End With
        
    Else
    
        With Selection.Validation
            .Delete
            .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
            xlBetween, Formula1:="=CdPr"
            .IgnoreBlank = True
            .InCellDropdown = True
            .InputTitle = ""
            .ErrorTitle = ""
            .InputMessage = ""
            .ErrorMessage = ""
            .ShowInput = True
            .ShowError = True
        End With
    End If
End Sub

J'ai déjà essayé :
   Select Case Target.Address

        Case Range("Q4").Address  ' ou Case Range("Q4").ends(xldown).adress  

Mais ça ne rentre pas dans le Case.

Je suis si près du but.

Merci
Configuration: Windows XP
Firefox 3.0.11

13 réponses

  1. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    BonsoIr Lila, Coco_rico

    si j'ai compris ta demande
    ci dessus procédures pour créer des validations de données (et non combobox?) dans la plage Q7:Q63
    la macro macrosrange a été optimisée mais est à compléter:

    Private Sub Worksheet_Change(ByVal Target As Range)
    If Intersect(Target, Range("Q4:Q63")) Is Nothing Then: Exit Sub
    Application.Run ("macros.xls!MacrosChange")
    End Sub
    --


    ----------------------
    Option Explicit

    Sub MacrosChange()
     Dim liste As String
        Select Case ActiveCell
            Case Is = "domaine1"
                liste = "=cdpr1"
            Case Is = "domaine2"
                liste = "=cdpr2"
           '......autres cas dom3 &4&1....
            Case Else
                Exit Sub
                
        End Select
        
        With Range(ActiveCell.Address).Validation
                .Delete
                .Add Type:=xlValidateList, Formula1:=liste
        End With
    End Sub


    Ci joint tite démo avec uniquement liste pour "domaine1"
    https://www.cjoint.com/?gswJbrgMUA
    Cordialement, Michel
    1
  2. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    re lila, bjr coco_rico
    Pour éviter d'avoir à dé-sélectionner: ne pas utiliser "select"
    et un message pour indiquer que le boulot est fait...

    With Range("R4:R63").Validation
    .Delete
    .Add Type:=xlValidateList, Formula1:=liste
    End With
    Msgbox " Colonne R préparée avec succès."
    1
  3. coco_rico Messages postés 32 Statut Membre
     
    bonjour,
    j'avoue ne pas avoir tout compris ton pb mais sache que vba ne retient que le dernier événement change dans Worksheet_Change(). Essaie de lancer le débogueur pour piéger target.address pour te faire une idée de la ligne de code qui ne marche pas.

    si t'éclaires un peu plus ton pb, peut-être pourra-t-on faire autrement?

    bon courage.
    0
  4. Vous n’avez pas trouvé la réponse que vous recherchez ?

    Posez votre question
  5. Lila_35
     
    Désolé c'est pas facile à mettre sur le papier.

    Pour "essayé" de résumer,
    Private Sub Worksheet_Change(ByVal Target As Range)
       Select Case Target.Address
    
            Case Range("Q4").Address   
              
                    Application.Run "'" & Excel.ActiveWorkbook.Path & "\MaMacro.xls'!MacrosChange"
         
       End Select
                    
    End Sub
    

    ça fonctionne très bien mais uniquement pour Q4.

    Ce que je souhaiterai c'est:
    Private Sub Worksheet_Change(ByVal Target As Range)
       Select Case Target.Address
    
            Case Range("Q4:Q63").Address  ' ou Case Range("Q4").ends(xldown).adress  
              
                    Application.Run "'" & Excel.ActiveWorkbook.Path & "\MaMacro.xls'!MacrosChange"
         
       End Select
                    
    End Sub
    

    La macro se trouve sur un autre fichier que ma feuille de calcule

    Faut il passer un paramètre à la macro ? une adresse ?

    Merci pour le coup d'œil.
    0
  6. coco_rico Messages postés 32 Statut Membre
     
    je subodore que le pb vient de ta target.address, essaie de le piéger avec le débogueur. ceci dit, ta MacrosChange ne fait référence qu'à la valeur de "Q4"?
    Quant à lancer ta macro à distance, Application.Run "MaMacro.xls!MacrosChange" devrait suffire, par contre tu devra penser à refermer le classeur qui la contient après.

    Tu me diras si ça échoue?

    bon courage.
    0
  7. Lila_35
     
    Bonjour,

    Tu m'as mis sur une bonne voie michel_m.

    On rentre bien dans la macro très bien optimisée, merci beaucoup.
    Mon problème n'est toujours pas résolu car la validation des données doit servir pour la colonne suivante ("R"). Je ne sais pas si je suis bien clair.

    J'ai toute une liste d'incident ( clef primaire num_inc ) appartenant a 3 types de domaines (domaine1,domaine2,domaine3) trié d'abord par domaine puis par num_inc:

    1155 problem1 entrant J6081 domaine1
    9260 pb formatage J6081 domaine1
    11565 Abend transaction 36UG J6083 domaine1
    1453 Pb locatisation domaine2
    9100 VERIFdomaine domaine2
    2197 Mise à jour orga non effective domaine3
    3139 Livraison domaine3
    9261 pb ecriture domaine3

    Répartie en 3 validation de données cdpr1 cdpr2 et cdpr3 (respectivement domaine1,domaine2,domaine3) contenant les num_inc (domaine1:1155,9260,11565 ; domaine2:1453,9100 ; domaine3:2197,3139,9261)

    Sur des autre feuilles (janvier,fevrier,mars,...,decembre) lorsque l'on choisi un domaine ("Q"), cela affecte à la colonne des num_inc ("R") où on aura cdpr1 ou cdpr2 ou cdpr3.

    Actuellement, quand je choisi le domaine colonne "Q" il m'affecte les num_inc sur cette même colonne.

    J'ai un accès restreint à internet et je ne peux donc pas tester la tite demo michel_m mais merci pour l'attention portée.

    Cordialement.
    0
  8. Lila_35
     
    Coco_rico,

    Target.Adress = "$Q$i" i = numéro de la ligne
    0
  9. michel_m Messages postés 18903 Date d'inscription   Statut Contributeur Dernière intervention   3 320
     
    bonjour,

    c'était peut-être au départ qu'il fallait mettre ta description...
    Je jetterai un oeil cet aprem...
    0
  10. Lila_35
     
    Je pense m'en être sorti par un Select dans la macro :
    Sub MacrosChange()
     Dim liste As String
        Select Case ActiveCell
            Case Is = "domaine1"
                liste = "=CdPr1"
            Case Is = "domaine2"
                liste = "=CdPr2"
            Case Is = "domaine3L"
                liste = "=CdPr3"
            Case Else
                Exit Sub
                
        End Select
        Range("R4:R63").Select
        With Selection.Validation
                .Delete
                .Add Type:=xlValidateList, Formula1:=liste
        End With
    End Sub
    

    Après, je ne sais pas comment dé sélectionner mais ça n'est pas le souci majeur.

    Toutes mes salutations à michel_m pour ton aide très précieuse
    C'est le Intersect(Target, Range("Q4:Q63")) qui m'a sauvé.

    Cordialement.
    0
  11. coco_rico Messages postés 32 Statut Membre
     
    slt Lila, Michel,
    super. Lila ne peux dé sélectionner que par une autre sélection.

    bonne continuation à vous.
    0
  12. coco_rico Messages postés 32 Statut Membre
     
    effectivement. décidément, t'es super efficace michel.

    bonne journée à vous
    0