Bloqué en VBA !

simkmil Messages postés 473 Date d'inscription mardi 19 février 2008 Statut Membre Dernière intervention 25 novembre 2024 - 17 sept. 2024 à 12:06
yg_be Messages postés 23358 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 novembre 2024 - 22 sept. 2024 à 14:27

Bonjour,

j'ai un fichier Excel qui reprends les opérations bancaires d'une association.

les montants reçus sur ce compte sont ensuite dispatchés vers un compte "Achats" c'est à dire une carte de banque alimentée par le compte principal et destinée à la personne responsable des achats journaliers, et un compte "caisse" qui lui reçoit l'argent nécessaire aux dépenses en espèces.

J'ai fais un petit programme VBA qui lorsque la destination est "Achats" mets le montant dans la feuille "Achats", et là il descend d'une ligne à chaque fois.

Mon problème est que lorsque je déclenche ma macro, tout se recopie depuis le début.

Or je voudrais que cela se recopie uniquement pour les dernières opérations.

Merci de votre aide.

A voir également:

12 réponses

simkmil Messages postés 473 Date d'inscription mardi 19 février 2008 Statut Membre Dernière intervention 25 novembre 2024 35
17 sept. 2024 à 12:08

Je vous joins le fichier, ce sera plus aisé pour comprendre le problème

https://www.cjoint.com/c/NIrkh76fmDN

0
yg_be Messages postés 23358 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 novembre 2024 Ambassadeur 1 555
17 sept. 2024 à 13:01

bonjour,

Comment déterminer quelles sont les "dernières" opérations?

Le plus simple, je pense, serait d'ajouter une colonne dans l'onglet "Banque", et que la macro utilise cette colonne pour indiquer que le montant a été dispatché, et ne doit donc plus être traité la fois suivante.

On peut imaginer d'autres techniques, si cette suggestion ne convient pas.  Explique, alors, pourquoi cela ne convient pas, pour guider notre créativité.

0
simkmil Messages postés 473 Date d'inscription mardi 19 février 2008 Statut Membre Dernière intervention 25 novembre 2024 35
17 sept. 2024 à 17:55

Merci de ta réponse aussi rapide !

en effet, je pense que c'est une excellente idée. 

je vais donc ajouter une colonne en début, c'est à dire en A.

Serait il possible, lorsque je vais cliquer sur "dispatcher" que cette colonne se remplisse jusqu'à la dernièree opération; et de là repartir à partir de la première cellule vide de cette nouvelle colonne ?

Je vais essayer, mais une aide serait aussi la bienvenue.

Merci et excellente fin de journée

0
yg_be Messages postés 23358 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 novembre 2024 1 555
17 sept. 2024 à 18:20

Je ferais ainsi:

    If wsSource.Range("D" & i).Value = "Achats" And wsSource.Cells(i, "A") = "" Then
        ' Obtenir la valeur de la colonne F de la source
        valeurF = wsSource.Range("F" & i).Value
        
        ' Trouver la première ligne vide dans la colonne F de la feuille "achats"
        dernièreLigne = wsCible.Cells(wsCible.Rows.Count, "E").End(xlUp).Row + 1
        
        ' Inscrire la valeur dans la première ligne vide
        wsCible.Cells(dernièreLigne, "E").Value = valeurF
        wsSource.Cells(i, "A") = "X"
    End If

Cela ne fait le travail que si la colonne A est vide, et la remplit après avoir fait le travail. (je n'ai pas testé)

0
simkmil Messages postés 473 Date d'inscription mardi 19 février 2008 Statut Membre Dernière intervention 25 novembre 2024 35
17 sept. 2024 à 18:23

Merci, j'essaie de suite !

j'avais réussi à me situer sur la première cellule non vide, mais ne voyais pas comment remplir la colonne A jusque là.

J'essaie et je reviens vers toi.

SimKmil

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
simkmil Messages postés 473 Date d'inscription mardi 19 février 2008 Statut Membre Dernière intervention 25 novembre 2024 35
17 sept. 2024 à 18:27

Je viens d'essayer et ça bloque sur la première ligne. MAIS ! j'ai fais un module rien qu'avec cela, ne devais-je pas le joindre à l'intérieur du premier module ?

je vais voir cela

0
yg_be Messages postés 23358 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 novembre 2024 1 555
17 sept. 2024 à 20:12

Ce que j'ai proposé, c'est une adaptation d'une partie de ton code.

Sub dispatcher_opération()


    Dim i As Long
    i = 5 'débute à la ligne 5 pour D5
    'boucle jusqu'à ce que nous trouvions une cellule vide
    
    Do While Not IsEmpty(Range("D" & i).Value)
    'placer ici le code à exécuter
    
    
    Dim wsSource As Worksheet
    Dim wsCible As Worksheet
    Dim valeurF As Variant
    Dim dernièreLigne As Long
    
    ' Définir les feuilles
    Set wsSource = ThisWorkbook.Sheets("Banque") ' Remplacez par le nom de votre feuille source
    Set wsCible = ThisWorkbook.Sheets("Achats")
    
    ' Vérifier si la cellule D1 contient "achats"
    If wsSource.Range("D" & i).Value = "Achats" And wsSource.Cells(i, "A") = "" Then
        ' Obtenir la valeur de la colonne F de la source
        valeurF = wsSource.Range("F" & i).Value
        
        ' Trouver la première ligne vide dans la colonne F de la feuille "achats"
        dernièreLigne = wsCible.Cells(wsCible.Rows.Count, "E").End(xlUp).Row + 1
        
        ' Inscrire la valeur dans la première ligne vide
        wsCible.Cells(dernièreLigne, "E").Value = valeurF
        wsSource.Cells(i, "A") = "X"
    End If

    
    
    
    MsgBox "la valeur de D" & i & " est: " & Range("D" & i).Value
    
    'incrémenter le compteur de ligne
    i = i + 1
    Loop
    
    
End Sub
0
simkmil Messages postés 473 Date d'inscription mardi 19 février 2008 Statut Membre Dernière intervention 25 novembre 2024 35
18 sept. 2024 à 09:31

Super !!

ça marche. j'ai changé la colonne A vers la colonne H et celle-çi se remplit de "X" à chaque fois que j'ai "Achats".

Ces montants se retrouvent bien sur la feuille Achats.

Maintenant, je dois essayer de ne dispatcher que les nouveaux montants en me basant sur la cellule suivant le dernier "x"

Je vais essayer d'y arriver ... 

je fais ceci afin d'aider une association qui s'occupe d'enfants placés et ils n'ont évidemment pas les moyens de s'offrir un "vrai" informaticien, alors je me débrouille comme je peux, et surtout avec ton aide.

Merci beaucoup

0
yg_be Messages postés 23358 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 novembre 2024 1 555
18 sept. 2024 à 09:43

ne dispatcher que les nouveaux montants, c'est le but du second test dans l'instruction suivante, dans le code proposé plus haut:

If wsSource.Range("D" & i).Value = "Achats" And wsSource.Cells(i, "H") = "" Then
0
simkmil Messages postés 473 Date d'inscription mardi 19 février 2008 Statut Membre Dernière intervention 25 novembre 2024 35
18 sept. 2024 à 17:26

Merci, en effet, les montants inscrivent un "X" dans la colonne H, mais je n'ai pas compris si au départ de cela mes nouveaux montants démarreraient sous cette ligne.

Je vais donc essayer en introduisant de nouveaux montants

Merci de tes explications.

0
simkmil Messages postés 473 Date d'inscription mardi 19 février 2008 Statut Membre Dernière intervention 25 novembre 2024 35
18 sept. 2024 à 17:30

Ouf ! tout fonctionne !

je n'avais pas fait de nouvel essai. c'est ma faute, trop pressé .

Maintenant il me reste à faire le même module pour l'argent qui va du compe Banque vers la caisse (retrait pour besoin d'argent en espèces)

Merci beaucoup et excellente fin de journée. Ici du soleil.

0
yg_be Messages postés 23358 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 novembre 2024 1 555
18 sept. 2024 à 21:56

Soleil ici aussi.

Pour éviter de dupliquer tout le code, tu pourrais utiliser la valeur en colonne D pour déterminer la feuille de destination.  C'est surtout utile si tu as plus de deux feuilles de destinatons.

0
simkmil Messages postés 473 Date d'inscription mardi 19 février 2008 Statut Membre Dernière intervention 25 novembre 2024 35
19 sept. 2024 à 10:41

Bien le bonjour !

merci pour le conseil, je vais essayer de l'appliquer.

si je comprends bien, en début de code, je dois définir une feuille supplémentaire par Set wsCibleB = ThisWorkbook.Sheets("Caisse")

et ensuite sous mon premier "IF" mettre le second IF avec "Caisse"

et inscrire des "Y" dans la colonne H

est ce bien le bon chemin ?

Merci de ton aide

ce matin, aussi beau soleil, mon robot tond et je viens de repeindre une barrière, j'en profite de ce qu'elle sèche pour venir un peu travailler sur l' ordi.

Bonne journée

0
simkmil Messages postés 473 Date d'inscription mardi 19 février 2008 Statut Membre Dernière intervention 25 novembre 2024 35
19 sept. 2024 à 10:55

je reviens à nouveau vers toi ...

j'ai tenté d'appliquer la seconde condition, mais il m'écrit qu'il manque un "DO" or, je le vois en début de code.

https://www.cjoint.com/c/NItiZ6si3kN

voici mon fichier complet.

Pour cet essai, j'ai recopié le module 1 dans le module 2 et j'ai nommé la macro : "dispatcher_opération_essai" afin de conserver le premier module qui fonctionne.

Merci de ton aide.

0
yg_be Messages postés 23358 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 novembre 2024 1 555
19 sept. 2024 à 12:10

Il écrit qu'il manque un DO, parce qu'il manque un END IF.  Et donc il ne trouve pas le DO là où il l'attend.

Suggestion:

Option Explicit

Sub dispatcher_opération_Essai()
Dim i As Long, wsSource As Worksheet, wsCible As Worksheet, dernièreLigne As Long

' Définir les feuilles
Set wsSource = ThisWorkbook.Sheets("Banque") ' Remplacez par le nom de votre feuille source
i = 5 'débute à la ligne 5 pour D5
Do While Not IsEmpty(Range("D" & i).Value)
    ' Vérifier si la cellule D1 contient "achats" ou "caisse"
    If wsSource.Cells(i, "H") = "" And _
        wsSource.Cells(i, "D") = "Achats" Or wsSource.Cells(i, "D") = "Caisse" Then
        Set wsCible = ThisWorkbook.Sheets(CStr(wsSource.Cells(i, "D")))
        ' Trouver la première ligne vide dans la colonne E de la feuille de destination
        dernièreLigne = wsCible.Cells(wsCible.Rows.Count, "E").End(xlUp).Row + 1
        ' Inscrire la valeur dans la première ligne vide
        wsCible.Cells(dernièreLigne, "E").Value = wsSource.Cells(i, "F")
        wsSource.Cells(i, "H") = "X"
        MsgBox "la valeur de D" & i & " est: " & Range("D" & i).Value
    End If
    'incrémenter le compteur de ligne
    i = i + 1
Loop
End Sub
0
simkmil Messages postés 473 Date d'inscription mardi 19 février 2008 Statut Membre Dernière intervention 25 novembre 2024 35
19 sept. 2024 à 17:45

Magnifique !

je vois que j'ai encore beaucoup à apprendre en VBA. Mais il faut dire que j'ai débuté tard, en étudiant VBA et le travail en même temps, ça n'était pas aisé. Maintenant que je suis à la retraite c'est un peu plus facile.

Je vais donc peaufiner,a présentation de mon tableau.

Merci beaucoup de ton aide.

Ici, toujours du soleil!

Bonne fin de journée

0
yg_be Messages postés 23358 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 novembre 2024 1 555
20 sept. 2024 à 05:36

En me relisant, j'ai fait une erreur, voici un code plus correct:

Option Explicit

Sub dispatcher_opération_Essai()
Dim i As Long, wsSource As Worksheet, wsCible As Worksheet, dernièreLigne As Long

' Définir les feuilles
Set wsSource = ThisWorkbook.Sheets("Banque") ' Remplacez par le nom de votre feuille source
i = 5 'débute à la ligne 5 pour D5
Do While Not IsEmpty(Range("D" & i).Value)
    ' Vérifier si la cellule D1 contient "achats" ou "caisse"
    If wsSource.Cells(i, "H") = "" And _
        (wsSource.Cells(i, "D") = "Achats" Or wsSource.Cells(i, "D") = "Caisse") Then
        Set wsCible = ThisWorkbook.Sheets(CStr(wsSource.Cells(i, "D")))
        ' Trouver la première ligne vide dans la colonne E de la feuille de destination
        dernièreLigne = wsCible.Cells(wsCible.Rows.Count, "E").End(xlUp).Row + 1
        ' Inscrire la valeur dans la première ligne vide
        wsCible.Cells(dernièreLigne, "E").Value = wsSource.Cells(i, "F")
        wsSource.Cells(i, "H") = "X"
        MsgBox "la valeur de D" & i & " est: " & Range("D" & i).Value
    End If
    'incrémenter le compteur de ligne
    i = i + 1
Loop
End Sub
0
simkmil Messages postés 473 Date d'inscription mardi 19 février 2008 Statut Membre Dernière intervention 25 novembre 2024 35
21 sept. 2024 à 20:11

Merci, je vais changer, mais pourtant l'autre code semblait bien fonctionner, je l'ai testé et tout fonctionnait.

Mais si celui çi est mieux, je le change dès demain.

Merci et bonne soirée

0
yg_be Messages postés 23358 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 28 novembre 2024 1 555
22 sept. 2024 à 14:27

L'avant dernier code ne tenait pas compte du X en colonne H pour la Caisse.

0