Déclenchement macro

Aimy67

XLDnaute Nouveau
Bonjour,

J'ai besoin de votre aide car je suis débutante en macro et je ne parvient pas à trouver comment faire ce que je souhaite.

J'ai un fichier avec deux onglets.

Dans mon onglet 2 je colle des données exportées d'un logiciel et j'ai un bouton pour déclencher ma macro
Je souhaite que ma macro permette de déclencher une recherche V à partir de la cellule H2 de l'onglet 1 et pour toute la colonne H. Puis si je lance à nouveau cette même macro que cette même opération soit effectuée à partir de la cellule I2 pour la colonne I.

Les deux problématique que je rencontre sont que :

1- Mon bouton n'étant pas dans l'onglet ou se réalise la macro, ma recherche V est appliquée à partir de la cellule sélectionner de l'onglet 2 et pas comme souhaité en H2.

2- Je ne parvient pas à créer la boucle qui me permet en cliquant à nouveau sur le bouton de macro de créer cette même recherche V dans la colonne à côté. (j'ai en fait une colonne par mois et je souhaite compléter la première colonne, puis la seconde, ...)

Ci-dessous mon début de code
Code:
 Range("H2").Select
    ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-7],MOIS,4,0)"
    Range("H2").Select
    Selection.AutoFill Destination:=Range("H2:H606")
    Range("H2:H606").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("H2").Select
    Application.CutCopyMode = False
    Sheets("Données mensuelles").Select
End Sub

Merci d'avance à ceux qui prendront du temps sur ma demande et seront indulgent sur mon ignorance sur le sujet.
 

Dranreb

XLDnaute Barbatruc
Bonjour.
Voir ma réponse dans cette discussion.
Remarque: remplacé le bouton par une sélection d'un titre du bon mois de la feuille BASE.
Dans le module de son objet Worksheet Feuil1 :
VB:
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Dim Mois As Long, RngLR As Range, FDM As String, C As Long
   If Target.Row > 1 Or Target.Rows.Count > 1 Or Target.Columns.Count > 1 Then Exit Sub
   Mois = (Target.Column - 3) Mod 13 + 1: If Mois < 1 Or Mois > 12 Then Exit Sub
   If MsgBox("Voulez vous récupérer les """ & Feuil7.Name & """" & vbLf & "pour le mois " _
      & Replace(Replace("de " & Format(DateSerial(1900, Mois, 1), "mmmm"), "e a", "'a"), _
      "e o", "'o") & " ?", vbYesNo + vbQuestion, Me.Name) = vbNo Then Exit Sub
   Set RngLR = Me.Rows(2).Resize(Me.UsedRange.Rows.Count - 1)
   FDM = "'" & Feuil7.Name & "'!"
   RngLR.Columns("CE").FormulaR1C1 = "=MATCH(RC1," & FDM & "C1,0)"
   For C = 0 To 5
      With RngLR.Columns(2 + Mois + 13 * C)
         .FormulaR1C1 = "=INDEX(" & FDM & "C" & 4 + C & ",RC83)"
         .Value = .Value: End With
      RngLR.Columns(15 + 13 * C).FormulaR1C1 = "=RC[" & Mois - 13 & "]-RC[" & Mois - 14 & "]"
      Next C
   RngLR.Columns("CE").ClearContents
   End Sub
 
Dernière édition:

Aimy67

XLDnaute Nouveau
Bonjour,

Je vous remercie d'avoir pris le temps de me répondre par contre je me sent un peu bête mais je comprends pas bien comment employer le code donné.
Je dois ajouter celui-ci avant celui que j'ai crée pour ma recherche V ?
Vous me parler de remplacer le bouton par la sélection d'un titre du mois dans lequel je dois déclencher ma recherche V j'imagine. Par contre je ne sais pas comment faire.

Je vous remercie par je suis vraiment novice et j'aimerais comprendre pour pouvoir le réemployer par la suite dans d'autres fichiers au besoin.
 

Dranreb

XLDnaute Barbatruc
Ne le mettez pas dans un module standard de la rubrique Modules.
Sélectionnez le module Feuil1 (BASE) de la rubrique Microsoft Excel Objets, ou bien, depuis Excel, clic droit sur l'onglet BASE, Visualiser le code, et mettez y ça.
La macro se déclenchera automatiquement quand vous sélectionnerez une cellule de titre.
Elle vous demandera confirmation avant de procéder.
 
Dernière édition:

Dranreb

XLDnaute Barbatruc
Notez que si vous tenez à votre bouton vous pouvez lui affecter la macro Réimporter de ce code dans un module standard :
VB:
Option Explicit
Sub Réimporter()
   On Error Resume Next
   ImporterMois InputBox("Quel est le numéro du mois que vous voulez ajouter ou recommencer ?")
   End Sub
Sub ImporterMois(ByVal Mois As Long)
   Dim RngLR As Range, FDM As String, C As Long
   Set RngLR = Feuil1.Rows(2).Resize(Feuil1.UsedRange.Rows.Count - 1)
   FDM = "'" & Feuil7.Name & "'!"
   RngLR.Columns("CE").FormulaR1C1 = "=MATCH(RC1," & FDM & "C1,0)"
   For C = 0 To 5
      With RngLR.Columns(2 + Mois + 13 * C)
         .FormulaR1C1 = "=INDEX(" & FDM & "C" & 4 + C & ",RC83)"
         .Value = .Value: End With
      RngLR.Columns(15 + 13 * C).FormulaR1C1 = "=RC[" & Mois - 13 & "]-RC[" & Mois - 14 & "]"
      Next C
   With RngLR.Columns("CC")
      .FormulaR1C1 = "=IF(ISBLANK(INDEX(" & FDM & "C10,RC83)),"""",INDEX(" & FDM & "C10,RC83))"
      .Value = .Value
      End With
   With RngLR.Columns("CD")
      .FormulaR1C1 = "=IF(ISBLANK(INDEX(" & FDM & "C11,RC83)),"""",INDEX(" & FDM & "C11,RC83))"
      .Value = .Value: End With
   RngLR.Columns("CE").ClearContents
   End Sub
Et quand même garder l'automatisation à la sélection d'un titre, dans Feuil1 (BASE) :
VB:
Option Explicit
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
   Dim Mois As Long
   If Target.Row > 1 Or Target.Rows.Count > 1 Or Target.Columns.Count > 1 Then Exit Sub
   Mois = (Target.Column - 3) Mod 13 + 1: If Mois < 1 Or Mois > 12 Then Exit Sub
   If MsgBox("Voulez vous récupérer les """ & Feuil7.Name & """" & vbLf & "pour le mois " _
      & Replace(Replace("de " & Format(DateSerial(1900, Mois, 1), "mmmm"), "e a", "'a"), _
      "e o", "'o") & " ?", vbYesNo + vbQuestion, Me.Name) = vbNo Then Exit Sub
   ImporterMois Mois
   End Sub
Le tout c'est que soit bien défini, avec la meilleure sécurité possible, le numéro du mois à récupérer ou à ré-récupérer suite à erreurs constatées et corrigées.
 

Aimy67

XLDnaute Nouveau
Bonjour,

Je n'avais pas bien compris le fonctionnement avec vos explications c'est plus claire et marche parfaitement et cela est très bien en cliquant sur l'en tête de colonne.

Par contre, je ne suis pas certaine de réussir la reproduire. Je cherche à comprendre un peu mieux le code proposé pour pouvoir au besoin l'appliqué ultérieurement à d'autres fichiers.

Mois = (Target.Column - 3) Mod 13 + 1: If Mois < 1 Or Mois > 12 Then Exit Sub
Permet de définir que le mois est compris entre 1 et 12.

Je ne comprends pas bien à quoi correspond les lignes :
Set RngLR = Me.Rows(2).Resize(Me.UsedRange.Rows.Count - 1)
FDM = "'" & Feuil7.Name & "'!"
RngLR.Columns("CE").FormulaR1C1 = "=MATCH(RC1," & FDM & "C1,0)"
For C = 0 To 5

Il s'agit des éléments de formule :
With RngLR.Columns(2 + Mois + 13 * C)
.FormulaR1C1 = "=INDEX(" & FDM & "C" & 4 + C & ",RC83)"
.Value = .Value: End With
RngLR.Columns(15 + 13 * C).FormulaR1C1 = "=RC[" & Mois - 13 & "]-RC[" & Mois - 14 & "]"
Next C

Dans la première ligne, la valeur 13 correspond au décalage entre les différents indicateurs , à quoi correspond la valeur 2 et le *C ?

Merci
 

Dranreb

XLDnaute Barbatruc
Le mois est le reste de la division du n° de colonne diminué de 3 par 13 augmenté de 1. Cependant cela peut être < 1 si on a sélectionné un titre avant la colonne C et 13 si on a sélectionné une colonne ECART. Ce n'est pas parfait d'ailleurs: ça réagir à tort si on sélectionne au delà de la colonne CB.
Set RngLR = Me.Rows(2).Resize(Me.UsedRange.Rows.Count - 1) initialise la variable RngLR comme objet Range représentant la ligne 2 de la feuille représentée par l'objet Worksheet redimensionnée au nombre de ligne de sa plage utilisée diminué de 1 (forcément puisqu'on la fait commencer à la ligne 2)
FDM = "'" & Feuil7.Name & "'!" affecte à la variable FDM un préfixe de référence vers la feuille BASE par concaténation de parties fixes avec le nom de la feuille représentée par l'objet Worksheet Feuil7.
RngLR.Columns("CE").FormulaR1C1 = "=MATCH(RC1," & FDM & "C1,0)" affecte la formule en notation R1C1 à la colonne CE
For C = 0 To 5 veut dire boucler 6 fois en faisant varier C de 0 à 5
2 c'est le nombre de colonnes qui précèdent le 1er paquet de 13 colonnes. On multiplie par 13 pour obtenir la colonne du bon paquet.
 
Dernière édition:

Discussions similaires

Réponses
7
Affichages
318

Statistiques des forums

Discussions
312 177
Messages
2 085 972
Membres
103 073
dernier inscrit
MSCHOE16