Problème macro, plage discontinue ?

Bonjour à Tous,

Je fais une macro qui permet de copier/coller un tableau (version auto ou manuelle voir plus bas) dans un mail, cette copie marche très bien, meme avec plage discontinue, car je colle d'abord mon tableau ailleurs et le resélectionne pour enlever les trous avant de coller dans le mail puis l'envoyer ...

Mon problème viens de la fonction que je souhaiterais ajouter, en colonne "Q" quand l'envois est fait "fin de macro" la colonne Q indique OK pour dire que les numéros ont bien été envoyés.

J'ai trouvé sur le net une manière simple de faire c'est par rapport à la sélection qui s'étend de la plage "Ax:Lx" la réduire à la plage "Ax:Ax" puis faire un offset jusqu'à colonne "Q" de cette sélections.

Problème, ça marche pour une sélection de plage simple, une sélection de 1 plage qui s'étend sur une ligne, mais je n'arrive pas a le faire pour une sélection de plage discontinue.

Je vous ai fais une vidéo pour voir le principe de la macro:

il y a 2 possibilités pour l'utilisateur,

AUTOMATIQUE: l'utilisateur veut envoyer tous le tableau ou la suite du tableau si il a déjà envoyé la première partie, alors il se positionne sur la ligne souhaité qui correspond à la première ligne de tableau qu'il souhaite envoyé et la macro va chercher la dernière ligne et sélectionne le tableau entier pour envoyer.

MANUEL: l'utilisateur sélectionne par exemple le milieu du tableau mais doit alors sélectionner lui même jusqu'à la dernière colonne (faire sa sélection de tableau)

il peut aussi choisir d'envoyer qu'une seule ligne du tableau cela marche très bien.

Par contre sil il décide de sélectionner 2 plages distantes alors la copie va bien se faire mais la validation en colonne "Q" non, et va renvoyer une erreur.

Voici la vidéo https://www.youtube.com/watch?v=_rlFSwWlP_Y

Je vous joint aussi mon fichier, alors désolé d'avance pour le code, mais je bidouille donc ce n'est pas du tout optimisé, je suis sur que vous savez arriver au même résultat en 4 lignes de code

Merci d'avance pour vos réponses

Attention si vous voulais tester en manuel de bien sélectionner jusqu'à la colonne L sinon erreur ! et c'est voulu c'est pour s'assurer que l'utilisateur à bien sélectionner toutes les colonnes du tableau.

Bonjour,

Utilisez la propriété de Selection.Areas pour identifier chaque aire selectionnée puis la proriété Rows.Count de Selection.Areas afin de compter le nombre de ligne sélectionnées par ligne que vous réutilisez dans la propriété resize de votre objet cells. Ce qui donne :

For Each R In Selection.Areas
    Cells(R.Row, 16).Resize(R.Rows.Count).Value = "Ok"
Next R

'A la place de 
'For Each cell In Plage_Etat_Diff
'         cell.Offset(0, 16).Value = "Ok"
'Next cell

Cdlt,

Wow ça marche terriblement bien, et avec un si petit bout de code !!

Merci à toi Ergotamine ! c'est pas la première fois que tu me sort du pétrin et surement pas la dernière !

Par contre je n'arrive pas comprendre les instruction For Each, enfin si le principe oui mais ce que je comprend pas c'est la variable R qui n'est pas définit

par exemple R = .Range("A" & Rows.Count).End(xlUp).Row

du coup ici for each R, R correspond à quoi ?

Une cellule j'imagine, pour toutes cellule contenu dans l'aire de la sélection ... c'es ça? mais du coup le fait de mettre For Each, peut importe ce que je met derrière la variable deviendra une cellule?

Exemple for Each Pizza in selection

Pizza désigne la cellule?

Bonjour,

Pour les explications R correspond à un objet de la collection Selection.Areas. Donc en quelque sorte une des plages sélectionnées.

Dans votre exemple R = .Range("A" & Rows.Count).End(xlUp).Row alors R correspond au numéro de la dernière ligne de la colonne A. Ce que fait le code c'est qu'il compte le nombre de ligne de la colonne A (donc 1 048 576 via Rows.Count)), il s'y positionne et "simule" au clavier un CTRL + FLECHE DU HAUT, pour avoir la première ligne remplie, mais en partant de la fin de la colonne A.

Dans une boucle For Each la première variable on se fiche du nom, ça sera automatiquement converti en objet de la collection présente après le mot In.

Par exemple :

For Each R in Selection.Areas 'R = Cellule (type range)
For Each R in Range("A2:A5") 'R = Cellule (type range)
For Each R in Worksheets 'R = Feuille (type worksheet)
For Each R in Me.Controls 'R = Control d'un userform
For Each R in ActiveSheet.Shapes 'R = Forme de la feuille active (type shape)

Donc en résumé : R est l'un des éléments de la collection que vous définissez après "in", et du coup est converti en un objet du même type, avec les mêmes propriétés et méthodes qui vous permettent de le manipuler (comme R appartient a Selection.Area, alors c'est un objet de type range, donc il possède une propriété .Row, .Rows.Count, comme tout objet range).

PS : C'est mon interprétation subjective, elle n'est peut être pas exacte, mais m'aide à mieux comprendre les codes.

Cdlt

ha oui carrément !!

donc c'est encore plus poussé que ce que je pensais !

Je vais revoir les tutos du site sur les boucles, ça fait longtemps et je pense que j'en ai besoin

Rechercher des sujets similaires à "probleme macro plage discontinue"