XL 2021 VBA - Copies de données entre deux tableaux structurés avec plusieurs conditions

Drapela

XLDnaute Nouveau
Bonjour le forum,
Je suis nouveau venu sur le forum et novice en VBA.
Dans un fichier pour la gestion de comptes bancaires, j'ai un onglet "Echéances" pour les opérations récurrentes.
Je voudrais qu'à l'ouverture du fichier :
- vérifier que la date de l'échéance est atteinte ou dépassée,
- si oui, les informations soit copiées vers la feuille du compte concerné,
- après copie, la date de l'opération (dans l'onglet Echéances) soit actualisée en fonction de sa périodicité.
Je pense avoir trouvé pour le premier point, mais je bloque à partir du second, malgré la consultation de nombreux forum. Je n'ai pas de message d'erreur mais rien ne se passe quand je lance la macro.

L'ébauche du code concerné est dans le module 2 du fichier joint.
Je serai ravi d'avoir votre aide pour résoudre ou du moins avancer sur la problème.

Merci d'avance,
Drapela.
 

Pièces jointes

  • GestComptes.xlsm
    494.4 KB · Affichages: 7
Solution
Salut


Je déconseille du mettre du code (style module2 ) dans les modules de Feuille ou du classeur mais faire appel comme à l'ouverture du classeur(workbook_open)où tu as déjà date_expir, on peut faire pareil pour MaJ_Eche etTri_date.

Worksheet_activate, cela se produit à chaque fois qu'on clique sur la feuille en question.

Rien à voir avec XL, blindes tes LEP à 7700€ , ils rapportent 1% de plus que le livret A.

Zon

XLDnaute Impliqué
Salut ,

Tu as en colonne K et L les noms de feuilles où mettre tes échéances que tu as déjà identifiées par une alerte. Toutefois moi je les marque Saisie pour éviter de les saisir à chaque fois. d'où le test F.Cells(i, "P").Value <> "saisie"

Je te propose une solution avec une nouvelle variable T , voir ma signature pour les explications des tableaux VBA, et pour le resize .
J'ai ajouté une gestion d'erreur car je suis un fainéant ça m'évite de tester si c'est du débit ou du crédit...

Il faudrait que les Numero de cheque dans tes différents comptes tu les déplaces aprés la colonne Crédit sinon un exercice d'application à faire en 2 fois avec resize et T.... si tu as besoin d'aide le fil reste ouvert.

Voici le code

VB:
 'si la date en colonne B de la ligne I est supérieure ou égale à la date du jour, message
   If CDate(F.Cells(i, "B").Value) <= Date Then
      If F.Cells(i, "P").Value <> "saisie" Then
         With F
            T = Range(.Cells(i, "B"), .Cells(i, "J")).Value
         End With
       On Error Resume Next
       'Débit
         Worksheets(Cells(i, "K").Value).[B65536].End(xlUp)(2).Resize(UBound(T), UBound(T, 2)) = T
       'Crédit
         Worksheets(Cells(i, "L").Value).[B65536].End(xlUp)(2).Resize(UBound(T), UBound(T, 2)) = T
      'Call Copier_Coller
      On Error GoTo 0
         F.Cells(i, "P").Value = "saisie"
      End If
   End If
 

Drapela

XLDnaute Nouveau
Bonsoir,
Tu veux faire une boucle sur les lignes I à DL mais tes variable ne sont pas initialisées.
Salut ,

Tu as en colonne K et L les noms de feuilles où mettre tes échéances que tu as déjà identifiées par une alerte. Toutefois moi je les marque Saisie pour éviter de les saisir à chaque fois. d'où le test F.Cells(i, "P").Value <> "saisie"

Je te propose une solution avec une nouvelle variable T , voir ma signature pour les explications des tableaux VBA, et pour le resize .
J'ai ajouté une gestion d'erreur car je suis un fainéant ça m'évite de tester si c'est du débit ou du crédit...

Il faudrait que les Numero de cheque dans tes différents comptes tu les déplaces aprés la colonne Crédit sinon un exercice d'application à faire en 2 fois avec resize et T.... si tu as besoin d'aide le fil reste ouvert.

Voici le code

VB:
 'si la date en colonne B de la ligne I est supérieure ou égale à la date du jour, message
   If CDate(F.Cells(i, "B").Value) <= Date Then
      If F.Cells(i, "P").Value <> "saisie" Then
         With F
            T = Range(.Cells(i, "B"), .Cells(i, "J")).Value
         End With
       On Error Resume Next
       'Débit
         Worksheets(Cells(i, "K").Value).[B65536].End(xlUp)(2).Resize(UBound(T), UBound(T, 2)) = T
       'Crédit
         Worksheets(Cells(i, "L").Value).[B65536].End(xlUp)(2).Resize(UBound(T), UBound(T, 2)) = T
      'Call Copier_Coller
      On Error GoTo 0
         F.Cells(i, "P").Value = "saisie"
      End If
   End If
Bonsoir,
Merci à gbinforme et Zon, pour précieuses informations.
Zon, ton code fonctionne parfaitement.
Pour la colonne numéros de chèques, plutôt que de la déplacer dans toutes les feuilles, j'ai pensé plus rapide de la créer dans l'onglet "Echéances".
En m'inspirant de tes conseils, j'ai adapter la macro MaJ_Echeances et ça fonctionne très bien aussi.

Encore une question, pour que le processus (tout le module 2) s'exécute à l'ouverture du classeur, ne vaut-il pas mieux coller le code directement sur la feuille 10 avec une commande Sub Worksheet_Activate() ?

Merci encore pour votre réactivité et vos compétances.
 

Pièces jointes

  • GestComptes.xlsm
    489 KB · Affichages: 10

Zon

XLDnaute Impliqué
Salut


Je déconseille du mettre du code (style module2 ) dans les modules de Feuille ou du classeur mais faire appel comme à l'ouverture du classeur(workbook_open)où tu as déjà date_expir, on peut faire pareil pour MaJ_Eche etTri_date.

Worksheet_activate, cela se produit à chaque fois qu'on clique sur la feuille en question.

Rien à voir avec XL, blindes tes LEP à 7700€ , ils rapportent 1% de plus que le livret A.
 

Discussions similaires

Statistiques des forums

Discussions
312 210
Messages
2 086 277
Membres
103 170
dernier inscrit
HASSEN@45