Questions Multiples

Bonjour ,

Ayant commencé le VBA il y a maintenant plusieurs mois je commence à me débrouiller mais il y a encore des choses « simples » que je n’arrive pas à faire fonctionner :

Le simple copier / coller :

Via le code ci-dessous j’ai systématiquement une erreur d’exécution 1004 sur la ligne en rouge quelqu’un pourrait m’expliquer pourquoi ? (l’erreur annonce une propriété ou méthode non géré par l’objet)

Voici le code, la ligne surlignée est celle qui coince :

Sub Mis_en_page()

Dim nbetab As Long

Dim C As Long

Dim L As Long

Dim D As Long

D = 6

nbetab = Worksheets("info").Cells(2, 3)

C = 30

For L = 2 To nbetab

Worksheets("Stats Générales").Range("A6 : I29").Copy

Worksheets("Stats Générales").Cells(C, 1).Paste

Application.CutCopyMode = False

C = C + 24

Next L

For L = 2 To nbetab + 1

Worksheets("Stats Générales").Cells(D, 9) = Worksheets("info").Cells(L, 1)

D = D + 24

Next L

End Sub

Envoi d’ e-mail:

Je n’ai pas de problème pour le programmer mais j’aimerai que ma liste des destinataires puissent être saisie dans une cellule au lieu de la saisir directement dans les lignes de code comme ci-dessous :

myItem.To = “XxX@gmail.com”

Deviendrait quelque chose du genre :

myItem.To = Worksheets("info").Cells(2, 5) ( et les adresses email seraient saisies dans cette cellule)

Est-ce possible ?

Ouvrir un fichier

La même problématique que pour l’email. J’ai rentré directement le chemin du fichier à ouvrir dans mes lignes de code :

Workbooks.Open Filename:= _

"U:\Public\FICHIER.xlsx

Est-il possible d’entrer le chemin dans une cellule et donc de ne pas rentrer le chemin directement dans le code ? Quelque chose comme :

Workbooks.Open Filename:= _ Worksheets("info").Cells(2, 5)

Merci d’ avance pour votre aide.

Salut,

Le simple copier / coller

Tu copies un range et tu paste sur une référence de cellule, je pense que c'est ce qui coince fait plutôt un :

Worksheets("Feuil1").Range("A1 : A9").Copy
Worksheets("Feuil1").Cells(C, 1).Select
ActiveSheet.Paste

il y a surement d'autre moyen mais cela devrait fonctionner comme cela.

Envoi d’ e-mail

Cela doit dépendre de la messagerie que tu utilises mais par exemple quand tu envoies à plusieurs personnes c'est délimité par un ";" donc ici tu fais la même chose dans ta cellule je dirais “XxX@gmail.com;toto@gmail.com;MisterBean@funny.net”

Après si tu as une grosse liste ça va vite être la mort, tu peux aussi faire une colonne ou ligne avec un contact par case et construire une string toi même avec une boucle en concaténant les valeurs avec ";" entre deux valeurs de cellule et tu affectes cette string à la fin myItem.To = MALISTE, tu peux du coup faire un formulaire qui ajoute/delete des noms etc en parallèle si vraiment tu veux

Ouvrir un fichier

Je dirais sans soucis, si tu sauvegarde en cellule B2 ton chemin d'accès "U:\Public" et que ton nom de fichier ne change jamais "TOTO" :

Workbooks.Open Filename:= cells(2,2).value & "\TOTO.xlsx"

A noter que tu enregistrer en xlsx ici, fait gaf à ça ^^

A noter que tu peux reprendre automatique le nom du fichier (pour l'incrémenter ou ajouter "_save" derrière ou que sais-je) ainsi que retrouver le dossier ou se trouve le fichier actuel (pour sauvegarder au même endroit ou si tu as une fonction de copie de rajouter "\SAVE" pour le mettre dans le dossier de sauvegarder qui se trouve ou tu as ton fichier en automatique) .

Test en macro (sur un nouveau fichier non enregistré tu n'as pas de path attention ^^) :

MsgBox ThisWorkbook.Path & "\" & ThisWorkbook.Name

ECG

Bonjour,

en premier lieu merci pour votre réponse claire et précise .

pas de soucis pour les parties envoi d' e-mail et ouvrir un fichier grâce à vos explications cela marche parfaitement.

Par contre je suis toujours coincé pour le "copier / coller" ( c'est dommage car c'est une action vraiment basique...)

En changeant le code comme tu me l' as conseillé l' erreur apparait sur la ligne suivante :

Worksheets("Feuil1").Cells(C, 1).Select

Si vous avez une idée de ce qui coince ?

Merci

Bonjour Prupri.

Bonjour ECG.

Essaye ainsi :

With ThisWorkbook.Sheets("Stats Générales")
    .Range("A6 : I29").Copy .Cells(C, 1)
End With

Bonjour Thebenoit59,

ta solution marche super ! D ' ailleurs je ne savais pas qu'il était possible d'écrire de cette façon

Un grand Merci à tous les deux.

je mets le sujet en résolu et vous souhaite une bonne fin de journée.

Bonjour,

Principales façons de copier et coller le contenu d'une plage de cellule :

    With Worksheets("Stats Générales")
        .Range("A6:I29").Copy .Cells(C, 1)
    End With

Méthode normale de copier-coller : on utilise la paramètre Destination de la méthode Copy pour indiquer la cellule supérieure gauche de la plage de destination.

Salut Benoît !

Si l'on dissocie copie et collage (ce qui peut surtout apparaître quand le collage se fait sur une autre feuille, mais ce n'est pas ton cas) :

    With Worksheets("Stats Générales")
        .Range("A6:I29").Copy
        .Paste .Cells(C, 1)
    End With

La méthode Paste n'est pas une méthode de l'objet Range, c'est une méthode de l'objet Worksheet. On l'applique donc à la feuille et on utilise le paramètre Destination de la méthode Paste pour passer la cellule de destination...

(En procédant ainsi on évite d'avoir à sélectionner la cellule destinataire, sélection que l'on retrouve toujours dans le code enregistré, car en manuel on est obligé de sélectionner la cible avant d'agir et l'enregistreur ne fait qu'enregistrer ce qui est fait manuellement.)

Si on a dissocié la copie du collage on peut utiliser la méthode PasteSpecial de l'objet Range :

    With Worksheets("Stats Générales")
        .Range("A6:I29").Copy
        .Cells(C, 1).PasteSpecial xlPasteAll
    End With

Ces trois méthodes aboutissent strictement au même résultat. On a indiqué en paramètre Paste de la méthode PasteSpecial que l'on collait la totalité du contenu.

Maintenant si l'on souhaite ne coller que les valeurs (on écrase les formules ou il n'y en a pas, on ne veut pas répercuter la mise en forme ou il n'y en a pas...) :

    With Worksheets("Stats Générales")
        .Range("A6:I29").Copy
        .Cells(C, 1).PasteSpecial xlPasteValues
    End With

Là on ne colle que les valeurs...

Une parenthèse sur :

    Application.CutCopyMode = False

Il faut savoir que cette commande a pour effet de vider le presse-papier de Windows. Son utilité à l'issue d'un copier-coller se limite exclusivement à éliminer le scintillement qui entoure la zone copiée (et qui peut être désagréable à l'oeil s'il persiste) et si l'on devait fermer immédiatement le classeur à éviter le message demandant si l'on veut conserver les données du press-papier après la fermeture...

Il faut savoir aussi que toute action sur la feuille qui interviendra ensuite aura pour effet de vider le presse-papier. Si donc l'on doit faire autre chose sur la feuille, inutile de s'en soucier...

On le vide également en pressant la touche Esc.

Cette ligne apparaît fréquemment dans du code enregistré, alors que l'on n'a fait aucune manipulation destinée explicitement à cet effet. C'est un sous-produit d'une manipulation qui l'a donc provoqué et a conduit à son enregistrement. Les mêmes causes produisant les mêmes effets, on peut en conclure que dans une macro enregistrée de copier-coller, si on trouve cette commande, on peut la supprimer, si on ne la trouve pas, il faudra peut-être l'y mettre !

Dans ton cas, cette commande est a-priori inutile, tu continues d'intervenir sur la feuille après ton copier-coller, le presse-papier devrait donc être vidé...

Mais si ce n'était pas le cas, inutile de toute façon de la répéter en boucle, une fois après la sortie de boucle suffit amplement.

Autre parenthèse : dans le cas d'un copier-coller Valeurs (cas relativement fréquent, sans doute autant que la copie "normale"), on peut alors tout bonnement ne pas copier (c'est à dire ne pas transiter par le presse-papier) et procéder par affectation directe de valeurs :

    With Worksheets("Stats Générales")
        .Cells(C, 1).Resize(24, 9).Value = .Range("A6:I29").Value
    End With

On affecte les valeurs de la plage source à la plage cible (redimensionnée s'il y a lieu à la même taille).

Cette méthode, proprement VBA (ne peut être réalisée manuellement) est incontestablement la plus rapide...

Cordialement.

Rechercher des sujets similaires à "questions multiples"