Selectionner plusieurs plages de cellules en VBA

Bonjours à tous.

Je dispose du code ci-dessous qui met permet de supprimer les données de cette plage de cellules.

J'aimerai uniquement pouvoir sélectionner cette plage de cellules sans faire rien d'autre.

je ne trouve pas la formule. pourriez- vous m'aider? merci

Sub Effacer_Tableau_DP_service()

  Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual

  rep = MsgBox("ATTENTION!!    Cette action supprimera toutes les attributions de service de la réunion de week-end de l'année?     Veux-tu poursuivre?", vbDefaultButton2 + vbQuestion + vbYesNo, "ATTENTION")
If rep = vbNo Then
Exit Sub
End If

For a = 6 To 58
For b = 57 To 75 Step 2

Cells(a, b).ClearContents
Next b
Next a

 Range("d1").Select

Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic
End Sub

Bonjour,

Voici un essai, bien que je vois peu d'intérêt à sélectionner une plage par macro, où je suppose que la plage en question est nommée, en l'occurrence "Nomdemaplage" dans le code. Sinon, il faut remplacer ce nom par la référence :

Sub Effacer_Tableau_DP_service()

dim t(1 to 3), r as range
t(1) = "Attention !!"
t(2) = "Cette action..."
t(3) = "Veux-tu poursuivre ?"
msg = join(t, vblf)

if MsgBox(msg, vbDefaultButton2 + vbQuestion + vbYesNo, "ATTENTION") <> vbyes then Exit Sub

with range("Nomdemaplage")
    for k = 1 to .columns.count step 2
        if r is nothing then set r = .columns(k) else set r = union(r, .columns(k))
    next k
end with

r.select

End Sub

Cdlt,

Lobjectif est seulement de sélectionner ces 100 ene de cellules pour pouvoir alors nommer cette plage et protéger la saisie de données dans ces cellule par un code.

ensuite, la macro ne me servira plus à rien. C'est uniquent pour ne pas me tromper dans la sélection de toutes ces cellules.

Je testerai demain ton code, mais n'y aurait-il pas beaucoup plus simple?.

En tout cas merci pour ton aide.

Re,

D'accord, je comprends mieux. Dans ce cas, ce code devrait nommer la plage sans la sélectionner, à condition de l'exécuter depuis la feuille contenant les cellules.

Sub Effacer_Tableau_DP_service()

dim t(1 to 3), r as range
t(1) = "Attention !!"
t(2) = "Cette action..."
t(3) = "Veux-tu poursuivre ?"
msg = join(t, vblf)

if MsgBox(msg, vbDefaultButton2 + vbQuestion + vbYesNo, "ATTENTION") <> vbyes then Exit Sub

with range("Nomdemaplage")
    for k = 1 to .columns.count step 2
        if r is nothing then set r = .columns(k) else set r = union(r, .columns(k))
    next k
end with

thisworkbook.Names.Add Name:="MonNom", RefersTo:="=" & r.address '<<< remplacer "monnom" par le nom souhaité

End Sub

Non, je doute qu'il y ait plus simple parce qu'il faut prendre une colonne sur 2... Donc on fait une union de cellules, toutes les 2 colonnes (avec une initialisation quand r est vide).

Ne fais pas attention au début du code, c'est une petite liberté que j'ai prise mais ça ne sert à rien au problème principal.

Cdlt,

Merci 3GB, j'avance.

Déjà merci pour cette astuce dans la Msgbox. Insérer plusieurs titres de cette façon, c'est propre. Tu m'as appris quelque chose c'est cool.

La macro bloque sur cette ligne

image

C'est normal il me semble car ma plage de cellules n'ait pas encore nommée. Je veux lui donner un nom, mais d'abord il faut pouvoir sélectionner l'ensemble de ces cellules. C'est ce travail que j'attends de la macro.

Je ne comprend pas les lignes suivantes:

image

k représente les colonnes? Mais à partir de ou? Et r les lignes?

Ne peut on pas utiliser la référence déjà connue à savoir les lignes de mon code pour ne changer que .Cells(a, b).ClearContents par un truc du genre Cells(a, b).Select Comme si je laissais la touche Ctrl du clavier enfoncée pour sélectionner l'ensemble des cellules?

Sub selectionner_Tableau_ecole()

Application.ScreenUpdating = False
  Application.Calculation = xlCalculationManual

Dim t(1 To 3), r As Range
t(1) = "Attention !!"
t(2) = "Cette action supprimera toutes les données."
t(3) = "Veux-tu poursuivre ?"
msg = Join(t, vbLf)

If MsgBox(msg, vbDefaultButton2 + vbQuestion + vbYesNo, "ATTENTION") <> vbYes Then Exit Sub

For a = 78 To 182 Step 2 'mes lignes a sélectionner
For b = 5 To 65 Step 3 'mes colonnes a sélectionner

Cells(a, b).Select ' ClearContents
Next b
Next a

Application.ScreenUpdating = True
  Application.Calculation = xlCalculationAutomatic
End Sub

Au final, ce code ne se place que sur la dernière cellule de la sélection; "BM182".

J'ai finalement sélectionner manuellement mes 1 113 cellules une par une en gardant la touche Ctrl enfoncé.

J'ai nommé cette sélection, mais le gestionnaire de noms n'a gardé qu'une infime partie de cette sélection car la plage dépasse largement les 250 caractères autorisés je crois dans la zone "Fait référence à".

image

Bonjour,

Ah, c'est dommage ça .

Comme je vous ai dit sur ma première réponse, il faut juste remplacer "nomdemaplage" par la référence de la plage ("A1:B2" par exemple). D'après votre premier code, et votre image, celle-ci est connue.

Je commente le code :

Sub Effacer_Tableau_DP_service()

dim t(1 to 3), r as range
t(1) = "Attention !!" 'ligne 1 du tableau t
t(2) = "Cette action..." '2
t(3) = "Veux-tu poursuivre ?" '3
msg = join(t, vblf) 'on joint les éléments du tableau par le délimiteur vblf, à savoir le retour à la ligne

if MsgBox(msg, vbDefaultButton2 + vbQuestion + vbYesNo, "ATTENTION") <> vbyes then Exit Sub 'si reponse <> oui (car cas fermer à prévoir), sortie

with range("Nomdemaplage") '<<<<<<<<<< A ADAPTER
    for k = 1 to .columns.count step 2 'pour k allant de 1 au nombre de colonnes de ma plage, avec un pas de 2 (une col sur 2)
        if r is nothing then 'si r, la variable de type range qui stockera les colonnes désirées, est vide
            set r = .columns(k) 'on lui affecte la colonne k (à savoir la colonne 1) [ca evite un bug qd r est vide]
        else
            set r = union(r, .columns(k)) 'sinon, la plage r est l'union de la précédente plage r et de la colonne k en cours (comme avec la touche ctrl mais en mémoire)
        end if
    next k
end with

thisworkbook.Names.Add Name:="MonNom", RefersTo:="=" & r.address 'ajoute un nom à la collection des noms du classeur

End Sub

Honnêtement, j'imaginais une colonne avec des saisies et une avec des formules mais j'ai l'impression que ce n'est pas le cas quand je vois l'image.

Ce qu'il faut avant tout, c'est revoir la structure du fichier car je pense qu'Excel n'est pas prévu pour ce genre de choses, et donc VBA non plus.

Cdlt,

Merci beaucoup pour ton travail. je n'aurai pas le temps ce soir de poursuivre la conversation, je reprendrai demain ou dans la semaine.

j'ai suivis tes conseils et apporté quelques modifs. Ca marche mieux. je comprend les lignes de codes.

Toutefois j'aimerais simplement que le code:

+ garde sélectionner les cellules à l'écran
+ 1colonne sur 3 mais aussi 1 ligne sur 2. de A78:BM182

pas la peine de créer un nom de plage. il me faut juste garder la sélection des cellule à l'écran.

A bientôt j'espère.

du genre

Sub Effacer_Tableau_DP_service()

with range("e78:bm182") '<<<<<<<<<< A ADAPTER
    for k = 1 to .columns.count step 3 'pour k allant de 1 au nombre de colonnes de ma plage, avec un pas de 2 (une col sur 3)
        if r is nothing then 'si r, la variable de type range qui stockera les colonnes désirées, est vide
            set r = .columns(k) 'on lui affecte la colonne k (à savoir la colonne 1) [ca evite un bug qd r est vide]
' je ne comprend pas pourquoi il faut s'assurer que les colonnes soit=ent vide??
' mais aussi sélectionner 1 cellule sur 2 en descendant sur chaque colonne
        else
            set r = union(r, .columns(k)) 'sinon, la plage r est l'union de la précédente plage r et de la colonne k en cours (comme avec la touche ctrl mais en mémoire)
        end if
    next k
end with

End Sub

Mais alors, quel est l'objectif finalement ? Tu ne les sélectionnes pas pour rien, j'imagine. Et sauf cas extrêmement rares, coder pour sélectionner est inutile (voire proscrit), on code pour agir, enchainer des actions qui produisent un résultat.

Je me sens quand même obligé de le signaler.

En tout cas, voici une tentative avec la référence :

Sub Effacer_Tableau_DP_service()
dim rSelect as range
with range("A78:BM182") 'avec ma plage
    for i = 1 to .rows.count step 2 'de la ligne 1 à la dernière avec un pas de 2
        for k = 1 to .columns.count step 3 'de la colonne 1 à la dernière avec un pas de 3
            if rSelect is nothing then 'si ma variable range de stockage des cellules est vide
                set rSelect = .cells(i, k) 'initialisation (cells(1, 1))
            else 'sinon
                set rSelect = union(rSelect, .cells(i, k)) 'rSelect incorpore la cellule (i, k) en cours
            end if
        next k
    next i
end with
rSelect.select
End Sub

Pour chaque ligne sur 2, chaque colonne sur 3 est traitée et incluse (via la fonction union) dans la variable rSelect. Quand toutes les colonnes d'une ligne ont été traitées, on passe à la ligne + 2 suivante, etc... L'ordre n'a pas d'importance de toute façon.

PS : j'ai enlevé le msgbox finalement, qui n'a pas vraiment d'utilité ici puisqu'aucune opération irréversible n'est à craindre.

Cdlt,

En faite je cherche juste à créer cette fameuse macro pour gagner du temps (C'est mal barré) afin de sélectionner ces plages de cellules de e87:bm182 pour pouvoir par la suite les protéger par un code afin que seul les personnes connaissant le code puissent écrire dans ces cases. (Révision - Modifications - Permettre la modification des plages).

Seulement je me suie rendue compte que même si j'arrive à sélectionner toutes ces cellules, manuellement ou avec une macro, je ne pourrais pas nommer cette plage car cette sélection représente un trop grand nombre de caractère dans "Fait référence à:".

merci pour le code, je l'aiserrai demain

Ah ok, voici une ébauche de code avec les lignes qui pourraient t'intéresser désactivées :

Sub Effacer_Tableau_DP_service()
dim rSelect as range
with activesheet 'ou préciser nom de la feuille >>> with sheets("nomfeuille")
    '.unprotect
    with .range("A78:BM182") 'avec ma plage
        for i = 1 to .rows.count step 2 'de la ligne 1 à la dernière avec un pas de 2
            for k = 1 to .columns.count step 3 'de la colonne 1 à la dernière avec un pas de 3
                if rSelect is nothing then 'si ma variable range de stockage des cellules est vide
                    set rSelect = .cells(i, k) 'initialisation (cells(1, 1))
                else 'sinon
                    set rSelect = union(rSelect, .cells(i, k)) 'rSelect incorpore la cellule (i, k) en cours
                end if
            next k
        next i
    end with
    'rSelect.locked = true 'pour verrouiller (par défaut)
    'rSelect.locked = false 'pour déverrouiller
    '.protect
end with
End Sub

Quand la feuille est protégée, il faut la déprotéger pour définir comme verrouillées les cellules. Sinon, les cellules sont en principe verrouillées d'office, par défaut...

Il faudrait donc plutôt chercher à déverrouiller celles qui doivent rester modifiables.

Bonne soirée,

Bonjour tout le monde !

J'allais dire la même chose que 3GB, sans avoir la gentillesse de fournir le code après.

Au final, je passe juste pour dire bonjour quoi... Et confirmer, si besoin était, qu'il faut écouter 3GB 😁

Salut JoyeuxNoel !

Merci de ta participation ! C'est très important de rappeler qu'il faut toujours m'écouter !

Bonne soirée à toi,

Bon Bein!!!... J'écoute !!!

Vous êtes trop drôle les gas!! 😃

Ou les filles je ne sais pas!!??

Je vous tiens au courant dès que possible.

Vous êtes trop drôle les gas!! 😃

Ou les filles je ne sais pas!!??

Comme tu le sens, on s'adapte !

Bonjour à tous,

Avec une signature comme la sienne, j'espère que JoyeuxNoel n'est pas une fille, ce serait assez prétentieux sinon, pour ne pas dire culotté^^.

Ahah,

Maintenant tout le monde pense que je m'appelle Fred et me dit salut Fred, merci Fred...

C'est génial.

C'est ce que j'allais dire !!! J'ai vu un sujet l'autre fois où le membre t'a appelé Fred tout le long de la discussion. C'est là que j'ai vu que tes capacités d'adaptation étaient sans limite.

Allez, salut Fred ! Car je ne me sens pas bien sans mon "Salut Fred"^^

Garçon ou fille, je vois que vous êtes en forme. C'est bien.

Alors!!!!! Je viens d' essayer ton code 3GB. Malheureusement je ne sais se qu'il me fait. Rien me semble t'il, hormis vérouiller ou déverrouiller les cellules.

Moi je souhaite juste qu'il me garde ces cellules en sélection sans rien faire d'autre.

C'est tout! Tout simple!! et rapide à faire!

Après, mois même je protégerai ces cellules par un code via le menu "Permettre la modification des plages".

Désolé j'ai du mal à vous l'expliquer.

Rechercher des sujets similaires à "selectionner plages vba"