Définir une plage de cellules non contigues (avec coordonnées variables)

barbenault

XLDnaute Nouveau
Bonjour,

Je cherche de l'aide pour comprendre comment définir une plage de cellulles non contigues dont les références sont variables :

Soit "Plage1"une plage de cellules non contigues à coordonnées fixes :
Plage1= Range("N11,Q11,T11,W11")

Soit "x", la référence de ligne active
x = ActiveCell.Row

... comment pourrais-je obtenir "Plage2" qui grossièrement écrit correspondrait à ceux-ci :

Plage2=Range("Nx,Qx,Tx,Wx)

Merci d'avance
 
Dernière édition:

DoubleZero

XLDnaute Barbatruc
Re : Définir une plage de cellules non contigues (avec coordonnées variables)

Bonjour, barbenault, le Forum

La définition du besoin :confused: me paraît floue...

Peut-être avec le code ci-après, à condition d'avoir nommé les plages :

- N11,Q11,T11,W11 "ici" ;
- les quatre cellules destinataires, "là".

Code:
Option Explicit
Sub Cellules_non_contiguës_dupliquer()
    Dim c As Range
    For Each c In Range("ici")
        c.Copy Destination:=Range("là")
    Next
End Sub

A bientôt :)
 

barbenault

XLDnaute Nouveau
Re : Définir une plage de cellules non contigues (avec coordonnées variables)

Merci DoulbeZero pour ta proposition,

Mon problème c'est bien de définir la plage de destination puisque celle-ci est composée de cellules dont la colonne est fixe, mais la ligne est variable.

Voici mon code actuelle :

Code:
Sub Auto_forecast()

' Cette macro permet de compléter l'onglet "2. ForecastedExp" de manière automatisée
' La commande peut être lancée dans une plage cible limitée et s'applique uniquement à la ligne active suivant des conditions spécifiques

' Définition des variables :

    ' "x" renvoie à la ligne active
    ' "t" renvoie à la celulle à l'intersection de la ligne active et de la colonne "7"
    ' "PlageRef" renvoie à une plage fixe (masquée) qui comporte les formules à copier vers la ligne active
    ' "PlageCible" renvoie à la plage de la ligne active vers laquelle sera copiée "PlageRef"
   
Dim x As Long
Dim t As String
Dim PlageRef As Range
Dim PlageCible As Range

x = ActiveCell.Row
t = Cells(x, 7)
Set PlageRef = Range("N11,Q11,T11,W11,Z11,AC11,AF11,AI11,AL11,AO11,AR11,AU11")
Set PlageCible = Range("N" & x, "Q" & x, "T" & x, "W" & x, "Z" & x, "AC" & x, "AF" & x, "AI" & x, "AL" & x, "AO" & x, "AR" & x, "AU" & x)

' Prevents screen refreshing.

Application.ScreenUpdating = False

' Plutôt que de définir une zone cible, nous avons recours à une condition pour autoriser ou non l'éxécution de la macro.
    
If Not (t = "Auto") Then
Exit Sub
End If

' Une fois la conditions validée, la commande est lancée
' Déprotection de la feuille dont le mot de passe est "msfbfu"
    
ActiveSheet.Unprotect Password:="msfbfu"


'PlageRef.Copy Destination:=PlageCible

 PlageRef.Select
 For Each cel In Selection
 cel.Copy
 PlageCible.Select
 ActiveSheet.Paste
 Next cel

  
' Protection de la feuille dont le mot de passe est "msfbfu"

ActiveSheet.Protect UserInterfaceOnly:=True, Password:="msfbfu", DrawingObjects:=True, Contents:=True, Scenarios:=True _
, AllowSorting:=True, AllowFiltering:=True, AllowFormattingCells:=False, AllowFormattingColumns:=False, _
AllowFormattingRows:=False

' Enables figures and allows screen refreshing

Calculate
Application.ScreenUpdating = True

End Sub
 

Modeste

XLDnaute Barbatruc
Re : Définir une plage de cellules non contigues (avec coordonnées variables)

Bonjour barbenault,
Salut 00 :D

Pour autant que j'aie bien compris, la manipulation (copier des cellules non-contigües et les coller dans d'autres cellules non-contigües) n'est pas possible "manuellement" non plus, si??

Donc, soit tu copies le "bloc" N11:W11, soit tu fais une boucle et tu copies une cellule à la fois. Tu peux essayer:
VB:
Sub toto()
Set Plage1 = Range("N11,Q11,T11,W11")
x = ActiveCell.Row
For Each a In Plage1.Areas
    Cells(x, a.Column) = a
Next a
End Sub

... à adapter à ton dernier exemple
 
Dernière édition:

barbenault

XLDnaute Nouveau
Re : Définir une plage de cellules non contigues (avec coordonnées variables)

Bonjour à Modeste et Mapomme pour vos propositions, je vais tester l'option de Mapomme, mais je vais aussi vous joindre un fichier qui décrit peut être mieux mon besoin.

L'idée est simple : ma plage de référence, c'est celle que je vais copier, elle est constituée des cellules (non contigües) jaunes. Elle ne changera jamais de coordonnées.

Ensuite, je dois définir une plage de destination qui peut varier selon l'endroit où l'utilisateur placera son curseur (d'où l'idée de définir la ligne active). Par conséquent, si l'utilisateur se place sur la ligne 14, la commande viendra coller ma plage de référence sur les cellules vertes (et seulement sur les cellules vertes), s'il se place sur la ligne 16, ce sera sur les cellules bleu... etc

Je crois vraiement que mon problème vient du fait que je n'arrive pas à intégrer "x" ma variable dans le range
 

Pièces jointes

  • test.xlsx
    10.9 KB · Affichages: 55
  • test.xlsx
    10.9 KB · Affichages: 66
  • test.xlsx
    10.9 KB · Affichages: 72
Dernière édition:

Modeste

XLDnaute Barbatruc
Re : Définir une plage de cellules non contigues (avec coordonnées variables)

Re,

@mapomme: comment copies-tu de l'une à l'autre?

Une erreur dans mon code: remplacer Cells(2, a.Column) = a par Cells(x, a.Column) = a


Je modifie dans mon message
 

barbenault

XLDnaute Nouveau
Re : Définir une plage de cellules non contigues (avec coordonnées variables)

Bonjour barbenault,

Une autre idée:
VB:
Set plage1 = Range("n11,q11,t11,w11").EntireColumn
Set plage2 = Intersect(plage1, ActiveCell.EntireRow)


Bien, c'est effectivement simple et efficace, ma macro fonctionne parfaitement ainsi. La première plage définit les colonnes de référence, la seconde se contente de trouver l'intersection de la première plage et de la ligne active.

Modeste, je t'avoue que je ne comprends pas ton code, je vais utiliser la proposition de mapomme.

Merci encore pour vos contributions.
 
Dernière édition:

Modeste

XLDnaute Barbatruc
Re : Définir une plage de cellules non contigues (avec coordonnées variables)

Modeste, je tavoue que je ne comprends pas ton code, je vais utiliser la proposition de mapomme.
Pas de souci pour la seconde moitié de ta phrase :)

Pour la postérité, donc (et la première partie de ta phrase): l'aide d'Excel dit
Objet Areas: Collection des zones ou de blocs contigus de cellules à l'intérieur d'une sélection.
Plage1 est donc "composée" d'une série de cellules. Chacune de celles-ci a une propriété .Column (correspondant à tes colonnes N, Q, T et W).
Le code permet d'affecter la valeur de chaque a (chaque zone de ta plage1) à une cellule à l'intersection de la ligne "active" et de chacune des colonnes.
 

Si...

XLDnaute Barbatruc
Re : Définir une plage de cellules non contigues (avec coordonnées variables)

salut

sans vouloir définir la plage cible, cela ne suffirait-il pas ?
Code:
Option Explicit
Sub Auto_forecast()
  Dim L As Long, R As Range
  L = ActiveCell.Row
  If Cells(L, 7) = "Auto" Then Exit Sub
  ActiveSheet.Unprotect "msfbfu"
  For Each R In Range("N11,Q11,T11,W11,Z11,AC11,AF11,AI11,AL11,AO11,AR11,AU11")
    R.Copy Cells(L, R.Column) 'pour copie avec format, sinon Cells(L, R.Column)=R
   Next
  ActiveSheet.Protect "msfbfu"
  Calculate
End Sub
 

barbenault

XLDnaute Nouveau
Re : Définir une plage de cellules non contigues (avec coordonnées variables)

salut

sans vouloir définir la plage cible, cela ne suffirait-il pas ?
Code:
Option Explicit
Sub Auto_forecast()
  Dim L As Long, R As Range
  L = ActiveCell.Row
  If Cells(L, 7) = "Auto" Then Exit Sub
  ActiveSheet.Unprotect "msfbfu"
  For Each R In Range("N11,Q11,T11,W11,Z11,AC11,AF11,AI11,AL11,AO11,AR11,AU11")
    R.Copy Cells(L, R.Column) 'pour copie avec format, sinon Cells(L, R.Column)=R
   Next
  ActiveSheet.Protect "msfbfu"
  Calculate
End Sub

Merci Si..., non seulement cela fonctionne mais en plus c'est beaucoup plus propre. J'ai juste remplacer "IF" par "IF NOT", c'est parfait.
 

Discussions similaires

Statistiques des forums

Discussions
312 347
Messages
2 087 501
Membres
103 563
dernier inscrit
samyezzehar