fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr en fr fr fr fr fr fr fr fr fr fr cs fr fr fr fr fr fr fr fr fr fr fr fr fr fr en en fr fr fr fr fr en fr nl fr fr fr fr fr fr fr fr en fr en fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr oc en en fr de fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr fr en fr es fr fr ru en fr fr de fr fr fr eo fr fr fr fr oc en en fr de eo fr fr fr fr es fr fr ru en fr fr de fr fr fr eo fr fr fr fr oc en en fr de fr fr fr fr es fr fr ru en fr fr de fr fr fr fr fr fr en fr fr fr fr oc en en fr de eo fr fr fr fr fr fr fr fr fr fr fr oc en en fr de fr fr fr fr fr es fr fr ru en fr fr de fr fr fr fr fr fr eo fr fr fr fr oc en en fr de fr fr fr es fr fr ru en fr fr de fr fr fr fr fr fr oc en en fr de eo fr fr fr fr fr en fr fr en fr fr fr fr fr fr fr fr fr fr es fr fr ru en fr fr de it fr fr en fr fr fr en fr en fr fr fr eo fr fr fr fr oc en en fr de eo fr fr fr fr fr fr en en fr en fr fr en en en fr
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.
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.
Chaque semaine je reporte les ventes sur la feuille vente qui provient de la feuille Export_Access je procède comme ce qui suit :
Colonne E4 : je colle la formule A
Colonne G4 : 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.
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 ?
Le 11/05/2020 à 13:49
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 ?
Le 11/05/2020 à 13:59
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 ?
Le 11/05/2020 à 14:29
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
Le 11/05/2020 à 17:13
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.
Le 11/05/2020 à 19:52
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
Le 12/05/2020 à 11:51
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 ?
Le 12/05/2020 à 13:30
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)
Le 12/05/2020 à 13:51
Merci infiniment, pour ton aide et la clarté de tes explications.
Problème résolu avec succès
Le 12/05/2020 à 16:23
Le 13/05/2020 à 19:27
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
Girodo a écrit :
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.
Le 14/05/2020 à 13:21
ç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
Le 14/05/2020 à 13:56
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