Pb Macro

spi

XLDnaute Nouveau
Bonjour à tous,

J'ai besoin de créer une interface utilisateur (cf pj).
Sur l'onglet "step 1", l'utilisateur clique sur les devises qui le concerne.
La macro associée permet de créer des tableaux de saisie pour chaque devise selectionnée, sur l'onglet "step 2".
Il y a un hic avec la macro: si je clique sur EUR et USD, puis dé-clique EUR, et enfin re-selectionne EUR, les tableaux en "step 2"ne sont pas corrects car je ne vois pas les 2 tableaux attendus (cad EUR et USD) mais il semble qu'ils se sont superposés.
Est-ce que qlq'un peut m'aider à corriger la macro?
Merci,
 

Pièces jointes

  • Macro test.xlsm
    98.4 KB · Affichages: 31

Lone-wolf

XLDnaute Barbatruc
Bonjour spi :), le Forum :)

Avec tous les modules qu'il y a dans ton fichier, personnellement je m'y perd un peu. Si tu n'a besoin que du module 1, supprime les autres. Si tu as besoin de certaines macros des modules 2 et 3, copie-les dans le module 1. Quand tu fait appel à une macro pas besoin d'écrire Module1.Macro2, Call Macro2 suffit.

Pour revenir à ta demande, dans macro1 il y a DEST.Resize(19, 1).Replace "EUR", D.

Vu que D est déclaré comme String et non comme un Objet ou Range, il faut ajouter D = Range(Me.CheckBox11.LinkedCell).Offset(0, 1).Value. Sinon Public D as Range

Set D = Range(Me.CheckBox11.LinkedCell).Offset(0, 1)
DEST.Resize(19, 1).Replace "EUR", D.Value
 

spi

XLDnaute Nouveau
Bonjour à tous,

J'ai besoin de créer une interface utilisateur (cf pj).
Sur l'onglet "step 1", l'utilisateur clique sur les devises qui le concerne.
La macro associée permet de créer des tableaux de saisie pour chaque devise selectionnée, sur l'onglet "step 2".
Il y a un hic avec la macro: si je clique sur EUR et USD, puis dé-clique EUR, et enfin re-selectionne EUR, les tableaux en "step 2"ne sont pas corrects car je ne vois pas les 2 tableaux attendus (cad EUR et USD) mais il semble qu'ils se sont superposés.
Est-ce que qlq'un peut m'aider à corriger la macro?
Merci,

Bonjour,

Merci pour les infos. Oui, module 2 et 3 pourrait être supprimés.
Pour mon pb, j'ai modifié la macro1 comme suggéré (cf ci-dessous). Mais, je dois aussi modifier chaque Private Sub CheckBox_Click() aussi, non? Si oui, comment?

Public D As Range 'déclare la variable D (Devise)
Sub Macro1()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set OS = Worksheets("Model") 'définit l'onglet source OS (masqué)
Set OD = Worksheets("Step 2 - DSO&DPO S&P ") 'définit l'onglet destination OD
'définit la cellule de destination DEST (A1 si A3 est vide, sinon la troisième cellule vide de la colonne A de l'onglet OD)
Set DEST = IIf(OD.Range("A3").Value = "", OD.Range("A1"), OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(3, 0))
Set D = Range(Me.CheckBox11.LinkedCell).Offset(0, 1)
OS.Range("A1:AF19").Copy DEST 'copie le tableau de l'onglet OS (le modèle) et le colle dans DEST
DEST.Resize(19, 1).Replace "EUR", D.Value 'remplace "EUR" par la devise D
Application.ScreenUpdating = False 'affiche les rafraîchissements d'écran
End Sub
 

spi

XLDnaute Nouveau
Bonjour,

Merci pour les infos. Oui, module 2 et 3 pourrait être supprimés.
Pour mon pb, j'ai modifié la macro1 comme suggéré (cf ci-dessous). Mais, je dois aussi modifier chaque Private Sub CheckBox_Click() aussi, non? Si oui, comment?

Public D As Range 'déclare la variable D (Devise)
Sub Macro1()
Dim OS As Worksheet 'déclare la variable OS (Onglet Source)
Dim OD As Worksheet 'déclare la variable OD (Onglet Destination)
Dim DEST As Range 'déclare la variable DEST (cellule de DESTination)
Application.ScreenUpdating = False 'masque les rafraîchissements d'écran
Set OS = Worksheets("Model") 'définit l'onglet source OS (masqué)
Set OD = Worksheets("Step 2 - DSO&DPO S&P ") 'définit l'onglet destination OD
'définit la cellule de destination DEST (A1 si A3 est vide, sinon la troisième cellule vide de la colonne A de l'onglet OD)
Set DEST = IIf(OD.Range("A3").Value = "", OD.Range("A1"), OD.Cells(Application.Rows.Count, "A").End(xlUp).Offset(3, 0))
Set D = Range(Me.CheckBox11.LinkedCell).Offset(0, 1)
OS.Range("A1:AF19").Copy DEST 'copie le tableau de l'onglet OS (le modèle) et le colle dans DEST
DEST.Resize(19, 1).Replace "EUR", D.Value 'remplace "EUR" par la devise D
Application.ScreenUpdating = False 'affiche les rafraîchissements d'écran
End Sub

Suis débutante en VBA... d'où mes questions...
Je copie la boucle en Sheet1, sans modifier les Private Sub CheckBox_Click?
Il faut définir i, non?
Merci...
 

Iznogood1

XLDnaute Impliqué
Bonjour,

Evite de multiplier les codes identiques.
Comme toutes tes checkboxes déclenchent la même action, un module de classe permet de ne coder les actions q'une fois.

Le principe :
Un module de classe avec qui décrit ce qu doit faire une checkbox quand on la coche / décoche
A l'ouverture du fichier, on regarde toutes les checkboxes de la feuille "Currencies", on les assoicie à la classe ci-dessus et on les enregistre dans une collection

Enfin, un module standard contient le code de création / suppression des zones.

NB: dans l'exemple ci-dessous, la devise est détermniée en fonction de du "Caption" de la checkbox.
(Je l'ai ai mises à jours pour les 2 premières colonnes de devises, pas le courage de terminer la 3ème colonne).
 

Pièces jointes

  • demo.xlsm
    93.1 KB · Affichages: 45

spi

XLDnaute Nouveau
Bonjour,

Evite de multiplier les codes identiques.
Comme toutes tes checkboxes déclenchent la même action, un module de classe permet de ne coder les actions q'une fois.

Le principe :
Un module de classe avec qui décrit ce qu doit faire une checkbox quand on la coche / décoche
A l'ouverture du fichier, on regarde toutes les checkboxes de la feuille "Currencies", on les assoicie à la classe ci-dessus et on les enregistre dans une collection

Enfin, un module standard contient le code de création / suppression des zones.

NB: dans l'exemple ci-dessous, la devise est détermniée en fonction de du "Caption" de la checkbox.
(Je l'ai ai mises à jours pour les 2 premières colonnes de devises, pas le courage de terminer la 3ème colonne).
Merci, mais là, suis perdue... lost in translation...
Dans le fichier demo.xlsm, je fais comment pour voir le module de classe que vous avez créé? Et quand je vérifie le résultat dans l'onglet Step 2, ce n'est pas du tout le résultat attendu...
Pas sûre d'avoir tout compris...
 

spi

XLDnaute Nouveau
Merci, mais là, suis perdue... lost in translation...
Dans le fichier demo.xlsm, je fais comment pour voir le module de classe que vous avez créé? Et quand je vérifie le résultat dans l'onglet Step 2, ce n'est pas du tout le résultat attendu...
Pas sûre d'avoir tout compris...

Désolée, le résultat en onglet Step 2 est bien correct.
Mais je n'ai jamais utilisé de Module de Classe avant. Dans quel menu, je peux lire/modifier le code svp?
Merci encore
 

Lone-wolf

XLDnaute Barbatruc
Re spi

Ne modifie rien du tout au risque de tout faire foiré. Le classeur exemple d'Iznogood1 fontionne très bien.
Si tu veux lire, bein c'est simple comme bonjour, tu as le module standard et en dessous le module de classe.
J'ai ajouté la mise en forme des colonne.

VB:
Public Function CreateForm(devise As String)
  If Not DeviseExiste(devise) Is Nothing Then Exit Function
  'Application.ScreenUpdating = False
  Dim r As Range
  frmModel.Range("A1:AF19").Copy
  With frmOutput
    Set r = .Range("A" & 1 + 20 * (DevisesActives - 1))
    .Activate
    r.Select
    .Paste
    r.Range("A1:A19").Replace What:="EUR", Replacement:=devise
    r.Select
    .Range("A:A").ColumnWidth = 10
    .Range("C:D").ColumnWidth = 60
    .Range("E:AF").Columns.AutoFit
  End With
  Application.CutCopyMode = False
  frmCurrency.Activate
  'Application.ScreenUpdating = True
End Function
 

spi

XLDnaute Nouveau
Re spi

Ne modifie rien du tout au risque de tout faire foiré. Le classeur exemple d'Iznogood1 fontionne très bien.
Si tu veux lire, bein c'est simple comme bonjour, tu as le module standard et en dessous le module de classe.
J'ai ajouté la mise en forme des colonne.

VB:
Public Function CreateForm(devise As String)
  If Not DeviseExiste(devise) Is Nothing Then Exit Function
  'Application.ScreenUpdating = False
  Dim r As Range
  frmModel.Range("A1:AF19").Copy
  With frmOutput
    Set r = .Range("A" & 1 + 20 * (DevisesActives - 1))
    .Activate
    r.Select
    .Paste
    r.Range("A1:A19").Replace What:="EUR", Replacement:=devise
    r.Select
    .Range("A:A").ColumnWidth = 10
    .Range("C:D").ColumnWidth = 60
    .Range("E:AF").Columns.AutoFit
  End With
  Application.CutCopyMode = False
  frmCurrency.Activate
  'Application.ScreenUpdating = True
End Function

Merci, mais je ne vois tjs pas comment lire le code. Je dois aller ds quel menu Excel?
Habituellement, pour lire les macros, je vais dans Developer/Macros.
Mais dans le fichier d'Iznogoud, je ne vois pas de macro, ni de module...
Pouvez-vous m'expliquer comment accéder au code?
Merci, merci....
upload_2017-3-28_14-21-45.png
 

spi

XLDnaute Nouveau
Merci, mais je ne vois tjs pas comment lire le code. Je dois aller ds quel menu Excel?
Habituellement, pour lire les macros, je vais dans Developer/Macros.
Mais dans le fichier d'Iznogoud, je ne vois pas de macro, ni de module...
Pouvez-vous m'expliquer comment accéder au code?
Merci, merci....
Regarde la pièce jointe 986559

J'ai trouvé, je crois !
ALT + F11 , c'est bien ainsi que l'on peut lire le module de classe?
 

spi

XLDnaute Nouveau
Re spi

Ne modifie rien du tout au risque de tout faire foiré. Le classeur exemple d'Iznogood1 fontionne très bien.
Si tu veux lire, bein c'est simple comme bonjour, tu as le module standard et en dessous le module de classe.
J'ai ajouté la mise en forme des colonne.

VB:
Public Function CreateForm(devise As String)
  If Not DeviseExiste(devise) Is Nothing Then Exit Function
  'Application.ScreenUpdating = False
  Dim r As Range
  frmModel.Range("A1:AF19").Copy
  With frmOutput
    Set r = .Range("A" & 1 + 20 * (DevisesActives - 1))
    .Activate
    r.Select
    .Paste
    r.Range("A1:A19").Replace What:="EUR", Replacement:=devise
    r.Select
    .Range("A:A").ColumnWidth = 10
    .Range("C:D").ColumnWidth = 60
    .Range("E:AF").Columns.AutoFit
  End With
  Application.CutCopyMode = False
  frmCurrency.Activate
  'Application.ScreenUpdating = True
End Function

Encore une question, je rame pour comprendre... comment je dois faire pour ajouter la dernière colonne de devise en "caption"?
Merci,
 

Discussions similaires

Réponses
7
Affichages
521

Statistiques des forums

Discussions
312 183
Messages
2 086 005
Membres
103 087
dernier inscrit
sarah.caneri