Macro : Copier/Coller Dynamique

Salut à tous !

Suite à mon dernier post @ddetp88 m'a donné envie de me lancer dans les macros, du coup j'ai commencé le cours VBA sur ce site, j'en remercie chaleureusement les concepteurs et un grand merci à cette équipe formidable d'Excel-Pratique, j'espère que les modérateurs liront mon message.

Voici notre défi :

Feuille Export_Access

Comme vous l'aurez compris, ce sont des données que j'exporte depuis Access, et donc je n'ai pas la main pour changer quoi que ce soit, les données arriveront tels que vous les voyez dans le tableau. Les cellules avec le fond bleu c'est un copier-coller en valeur de mon export Access. Les cellules avec fond gris, j'en ai besoin pour vérifier que les prix sont bons. Il y a des lignes vides car parfois, j'ai un peu plus de produits vendus. Chaque semaine c'est différent, mais on garde une moyenne assez étroite.

Feuille Vente

Chaque semaine je reporte les ventes sur la feuille vente qui provient de la feuille Export_Access je procède comme ce qui suit :

Chaque semaine j'ai 4 colonnes. Unités / Unités vendues exprimées en € / Retour / Retours exprimés en €

Prenons la semaine S18

Colonne E4 : je colle la formule A

Colonne F4 : je colle la formule B

Colonne G4 : pas pertinent pour cet exemple

Colonne H4 : pas pertinent pour cet exemple

Je copie mes formules de E4 à E32 - pareil pour la colonne F

Puis, je sélection de E4 à F32 et je copie et colle en valeurs

Je recommence chaque semaine cette manip en changeant de semaine.

Je voudrais une macro qui me permette de faire cette manip et qui automatiquement répétera ces actions sur les colonnes de la semaine suivante.

J'ai des notions et je suis débutant et j'ai soif d'apprentissage.

Merci à tous

11macro.xlsx (96.32 Ko)

Salut,

Je suis surpris par la date de ton export : toutes les lignes sont du 01/01/2020 je serais donc tenté de les mettre en S1 non ? comment je peux deviner (et donc indiquer dans le code) que ces données sont celles de la semaine 18 ?

Autre interrogation, Pour toi quelles sont les bornes de la Semaine 1 ? (cela varie selon les façons de faire) Pour moi c'est du 1er janvier jusqu'au premier dimanche. Pour toi aussi ?

Girodo,

Hey Girodo,

J'apporte encore plus de précision, la date n'est ici pas pertinente à mon sens. La date du 01/01/2020 c'est la date da fabrication en cuisine et ensuite on envoie au magasin, donc la date va change de semaine en semaine, typiquement les lundis. Cette date, je l'ai mise pour l'exemple sans trop réfléchir.

Je ne comprends pas très bien la question des bornes.

Question très naïve : ne peut-on pas se passer de la date et demander à VBA de juste d'insérer une formule dans une cellule X puis copier-coller en valeur et de passer 4 cellules à droite ?

Hum dans ce cas le plus simple que je puisse te proposer est un double clic sur le numéro de semaine en ligne 1,

Exemple si j'ai les données de la S20 en export, je double clic sur la cellule fusionné de M1 à P1 et ça m'importe les données ?

ça irait pour toi ?

Girodo,

Oui ça me conviendrait, mon plan original était qu'une fois j'ai la macro je l'affecte à un bouton, qui serait toujours à la même place et visuellement c'est plus claire

Après si c'est plus compliqué, on va pour ta solution

Merci

Salut,

Voilà ma proposition,

Le code rattaché à la feuille Vente est le suivant :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If ActiveCell.Column > 4 And ActiveCell.Row = 1 Then
Colonne = ActiveCell.Column
'Pour Chaque Cellule de la ligne 4 à la ligbe 32
For i = 4 To 32
'Effecture la rechercheV pour la colonne UW
Cells(i, Colonne).Formula = "=IFERROR(VLOOKUP(B" & i & ", Access, 2, FALSE),"""")"
'Effecture la rechercheV pour la colonne SW
Cells(i, Colonne + 1).Formula = "=IFERROR(VLOOKUP(B" & i & ", Access, 3, FALSE),"""")"
'Supprime les formules pour ne garder que des valeurs
Cells(i, Colonne).Value = Cells(i, Colonne).Value
Cells(i, Colonne + 1).Value = Cells(i, Colonne + 1).Value
Next i
End If
End Sub

Attention par contre j'ai foiré tes données de la S18 en testant.

Bonne journée,

9macro.xlsm (81.06 Ko)

Salut Girodo,

Merci beaucoup ça répond parfaitement. Ja'i fait quelques tests sur mon fichier de prod où j'ai plus de 100 lignes.

J'ai adapté For i = 4 to 32 au nombre de lignes que j'ai besoin.

Trois petites questions :

- Est-ce normal d'avoir une latence lorsque je double-clique sur la cellule S19, tout se rempli mais en deux ou trois temps, peut-être c'est normal quand on exécute un code ?

- Pourquoi as-tu placé le code dans la feuille dans la "feuille" dans VB et pas dans un module ?

- Enfin, serait-il compliquer de faire un bouton pour exécuter le code ? J'ai essayé de créer un bouton et je n'ai pas vu la possibilité de rattacher la macro que tu as si bien créé

Merci pour ton temps

Hey !

Concernant mon dernier message, ne te prends pas trop la tête...

Juste une encore question, penses-tu qu'il serait simple (qui ne prenne pas beaucoup de temps) pour que la boucle soit dynamique.

Je m'explique, dans la feuille Vente, la première colonne contient le code produit. La boucle actuelle For i 4 to 32, peut-on demander à VBA For i tant qu'il y a un code produit inscrit dans cette colonne, de sorte que si j'ajoute ou supprime une ligne s'execute correctement ?

Salut, je reprend tes différents points dans l'ordre,

Trois petites questions :

- Est-ce normal d'avoir une latence lorsque je double-clique sur la cellule S19, tout se rempli mais en deux ou trois temps, peut-être c'est normal quand on exécute un code ? Non chez moi c'est instantané... Mais cela dépend d'une part de la puissance de calcul de ton ordi et du nombre de calculs que tu demande. Si tu rajoute des lignes, tu demande plus de calculs à ton ordi, donc ça peu prendre un peu plus de temps

- Pourquoi as-tu placé le code dans la feuille dans la "feuille" dans VB et pas dans un module ? Pour pouvoir la lancer via un évènement, ici le double clic : Private Sub Worksheet_BeforeDoubleClick. Chaque fois qu'il y a un double clic dans cette feuille le code se lance.

- Enfin, serait-il compliquer de faire un bouton pour exécuter le code ? J'ai essayé de créer un bouton et je n'ai pas vu la possibilité de rattacher la macro que tu as si bien créé.Tel que j'ai imaginé mon code ça serait plus embêtant oui, en fait je pars de l'endroit où tu as double cliqué pour savoir dans quelle colonne importer les données. Si tu pars d'un bouton, je ne sais pas dans quelle colonne de semaine tu souhaites mettre tes données.

- Juste une encore question, penses-tu qu'il serait simple (qui ne prenne pas beaucoup de temps) pour que la boucle soit dynamique. Je m'explique, dans la feuille Vente, la première colonne contient le code produit. La boucle actuelle For i 4 to 32, peut-on demander à VBA For i tant qu'il y a un code produit inscrit dans cette colonne, de sorte que si j'ajoute ou supprime une ligne s'execute correctement ? ça peut être fait assez facilement en comptant le nombre de cellules non vides dans la colonne B (l'équivalent de la formule =NBVAL(B:B) ) par contre il faudrait être sûr que tu ne viennent rien modifier sous le tableau dans ce cas là... dans ton exemple imagine tu viens supprimer ce que tu as mis en B35 et B36, tu vas "vider" deux cellules et donc tout décaler de 2)

Girodo,

Merci infiniment, pour ton aide et la clarté de tes explications.

Problème résolu avec succès

Avec plaisir

Bonne journée !!

Salut Girodo,

J'ai essayé de recopier le code que tu m'as fourni pour un autre classeur.

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
Dim nb_lignes%

If ActiveCell.Column = 1 And ActiveCell.Row = 1 Then

Colonne = ActiveCell.Column

'Fonction NBVAL
nb_lignes = WorksheetFunction.CountA(Range("C:C"))

'Pour Chaque Cellule de la ligne 4 a la derniere ligne remplie de la colonne B
For i = 3 To nb_lignes

'Effecture la rechercheV pour la colonne UW
Cells(i, Colonne).Formula = "=IFERROR(VLOOKUP(C" & i & ", Report, 2, FALSE),"""")"

'Effecture la rechercheV pour la colonne SW
'Cells(i, Colonne + 1).Formula = "=IFERROR(VLOOKUP(B" & i & ", Access, 3, FALSE),"""")"

'Supprime les formules pour ne garder que des valeurs
Cells(i, Colonne).Value = Cells(i, Colonne).Value
'Cells(i, Colonne + 1).Value = Cells(i, Colonne + 1).Value

Next i
End If
End Sub

Je l'ai un peu adapté, je pense que tu le comprends mieux que moi

Ma question, dans mon précédent cas il fallait double cliquer sur une cellule fusionnée qui composée de 4 colonnes

Il me semble qu'en VBA ça devait donner ça

If ActiveCell.Column > 4 And ActiveCell.Row = 1 Then

Dans mon cas actuel, je ne dois double cliqué que sur une cellule unique, mais toujours le même principe

J'ai donc commencé par supprimé cette ligne, puis je me suis dit, peut-être ça

If ActiveCell.Column = 1 And ActiveCell.Row = 1 Then

Mais ça ne fonctionne pas

Merci

Salut,

Voilà ma proposition,

Le code rattaché à la feuille Vente est le suivant :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If ActiveCell.Column > 4 And ActiveCell.Row = 1 Then
Colonne = ActiveCell.Column
'Pour Chaque Cellule de la ligne 4 à la ligbe 32
For i = 4 To 32
'Effecture la rechercheV pour la colonne UW
Cells(i, Colonne).Formula = "=IFERROR(VLOOKUP(B" & i & ", Access, 2, FALSE),"""")"
'Effecture la rechercheV pour la colonne SW
Cells(i, Colonne + 1).Formula = "=IFERROR(VLOOKUP(B" & i & ", Access, 3, FALSE),"""")"
'Supprime les formules pour ne garder que des valeurs
Cells(i, Colonne).Value = Cells(i, Colonne).Value
Cells(i, Colonne + 1).Value = Cells(i, Colonne + 1).Value
Next i
End If
End Sub

Attention par contre j'ai foiré tes données de la S18 en testant.

Bonne journée,

Salut Dani,

ça fait plaisir de voir quelqu'un qui cherche à comprendre et faire par lui même, donc pour t'aider :

Avec la commande :

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

La macro va se lancer dès qu'il y a un double clic (peu importe où dans la feuille)

Moi j'ai souhaité qu'il ne se passe quelque chose QUE si je n'étais pas dans les colonnes A B C ou D car il s'agissait de tes en-têtes que je ne voulais surtout pas écraser ET QUE j'étais sur la première ligne (Celle avec ton numéro de semaine)

D'où ma ligne de code :

If ActiveCell.Column > 4 And ActiveCell.Row = 1 Then

Rien à voir donc avec celle que tu as tapé :

If ActiveCell.Column = 1 And ActiveCell.Row = 1 Then

qui elle consiste à n'éxécuter le code QUE si tu es dans la colonne 1 ET sur la ligne 1 donc en A1

Avec un IF si la ou les conditions ne sont pas remplies on va directement au END IF donc dans notre cas => directement à la fin sans rien faire.

En espérant avoir été explicite

Girodo,

Hey Girodo,

Merci pour ton commentaire et espère devenir un grand chêne plus tard

J'ai très bien compris ce que tu as dit, et j'ai adapté. Dans mon nouveau cas, mes numéros de semaines commencent en D1

C'est tout bon

Rechercher des sujets similaires à "macro copier coller dynamique"