Copier la valeur d'une cellule en fonction de la valeur d'une autre cellule

Bonjour à tous !

Novice dans le VBA, je réalise malgré tout une macro dans le cadre de mon entreprise.

Un peu plus d'explications :

Je cherche à comparer les données contenues dans la colonne T : Dans la feuille "Items", si Cells(i,20) alors on prend Cells(i,3) (i étant initialisé à 2 et allant jusqu'à la dernière ligne, défini en Integer, k également)

Voici le code que j'ai gribouillé :

Sub Calcul_Mt_Litige()
i = 2
k = 2
    With Sheets("Items")
        For i = 2 To Derniere_Ligne
            If Cells(i, 20) = 1 Then
                For k = 2 To i
                    .Cells(i, k) = 5
                    .Cells(i, 3).Copy Sheets("Litiges").Cells(k, 1)
                    k = k + 1
                Next
            Else
            End If
            i = i + 1
        Next
    End With
    With Sheets("Litiges")
        .Activate
        Mt_Litige = Application.WorksheetFunction.Sum(Range("C:C"))
    End With
End Sub

La macro ne me renvoie aucune erreur, mais rien ne se passe lorsque je lance ce bout là... Une véritable Trempette.

Je suis quasi persuadé que ce n'est vraiment pas grand chose mais ça fait bien 2 jours que je planche dessus ( et d'autres petits soucis dans la macro)...

Je suis ouvert à toutes propositions !

Merci d'avance pour votre aide

Bonjour,

Tu n'as pas défini Derniere_Ligne

Je ne sais pas faire fonctionner ton application pour voir s'il y a d'autres choses ...

capture d ecran 142
    With Sheets("Litiges")
        .Activate
        Mt_Litige = Application.WorksheetFunction.Sum(Range("C:C"))
    End With

Ta colonne C:C est contenue dans quel onglet ? mettre un . devant si c'est la feuille Litiges

idem

If Cells(i, 20) = 1 Then

mettre le cas échéant un . devant Cells

Bonjour Steelson,

Merci de prendre le temps de jeter un coup d'oeil

Derniere_Ligne est définie dans le module "Releve_Client" en public, je n'ai pas voulu mettre tout le code car il commence à être relativement long...

C'est à cause de l'adresse du fichier, je te joins la base (sans les données client bien entendu) sur laquelle je travaille, c'est ce type de fichier que la macro va chercher (sachant que le nombre de ligne est variable d'un client à un autre)

1test-macro.xlsx (59.07 Ko)
capture d ecran 143

Je vais arrêter là pour ma part ...

Reprends calmement le fichier, change l'adresse du fichier et quelqu'un saura revenir sur le sujet.

J'ai tenté de modifier comme tu me l'as précisé, cependant ça ne me met toujours rien dans mon onglet "Litiges"...

Je te joins une version de la macro où il n'y a pas besoin de spécifier de nom de client afin que tu puisses voir peut-être plus facilement...

Désolé si je ne suis pas assez explicite, je n'ai pas encore les bonnes habitudes en VBA

En soi, il n'y a pas besoin non plus de fichier supplémentaires, les données que j'ai besoin de travailler sont dans le fichier

Et de mon côté, ton lien dans workbook_open est inconnu pour nous !

Set oFl = oFSO.GetFile("\\ad.global\EMEA-FR-SHARE\ShareAAF\FRTRO-SERVICE_COMPTABILITE\Compta_Client\Relevés client\" & Nom_Client & ".xlsx")

J'ai modifié, plus besoin de saisir un nom de client avec un fichier introuvable derrière, les données dont j'ai besoin sont directement dans ce tableau en PJ

Pour auditer une macro, n'hésite pas à utiliser le debugger. Affiche la fenêtre d'exécution dans l'éditeur de macro. (Ctrl+G)

Exemple :

Sub Calcul_Mt_Litige()
i = 2
k = 2
    With Sheets("Items")
Debug.Print Derniere_Ligne
        For i = 2 To Derniere_Ligne
Debug.Print i
            If .Cells(i, 20) = 1 Then
                For k = 2 To i
                    .Cells(i, k) = 5
                    .Cells(i, 3).Copy Sheets("Litiges").Cells(k, 1)
                    k = k + 1
                Next
            Else
            End If
            i = i + 1
        Next
    End With
    With Sheets("Litiges")
        .Activate
        Mt_Litige = .Application.WorksheetFunction.Sum(Range("C:C"))
    End With
End Sub

et si je lance cette macro en l'état, je trouve ... Derniere_Ligne = 0, ce qui était ma première remarque !

Autre remarque ...

        For i = 2 To Derniere_Ligne
'...
            i = i + 1
        Next

tu fais une boucle sur i, mais tu incrémentes aussi i dans ta boucle ... du coup on ne tient compte que des lignes paires (cela revient à avoir un pas de 2 !

C'est la même chose pour la boucle sur k

Je te renvoie de nouveau ma remarque du début

        Mt_Litige = .Application.WorksheetFunction.Sum(Range("C:C"))

il manque le . devant Range("C:C") sinon tu pourrais faire la somme des numéros d'items,

mais devant application, je ne vois pas ce que cela vient faire !

de toute façon excel est parti en vrille à ce moment ...

        Mt_Litige = Application.WorksheetFunction.Sum(.Range("C:C"))

Ce n'est peut-être pas le dernier sujet, mais je n'ai pas compris ceci :

        For i = 2 To Derniere_Ligne
            If .Cells(i, 20) = 1 Then
                For k = 2 To i
' je ne comprends pas pourquoi faire appel à i dans cette boucle !
                Next
            Else
            End If
        Next

Mettre

i = 2
k = 2

est inutile puisque le début sera défini dans la boucle for

                    .Cells(i, k) = 5
                    .Cells(i, 3).Copy Sheets("Litiges").Cells(k, 1)

une fois k signifie une ligne, une fois il signifie une colonne !

Salut Mycka,

Salut Steelson ,

quel mic-mac, là-dedans : tu as une sacrée patience, Steelson!

@Mycka : histoire d'aider à démêler le schmillblick, pourrais-tu (enfin) te décider à expliquer en français ta démarche?

Comme je le ressens confusément, à observer tes titres de colonnes, quand, en 'Items', tu rencontres un "1" en [T], ne cherches-tu pas à calculer le retard de règlement depuis la date en [A] et, peut-être, multiplier ce nombre de jours par 5 pour ensuite rapporter le n° en 'Litiges' [A] et ce montant en 'Litiges' [C] ce qui expliquerait l'addition en 'Litiges' [C:C] ?

Espérant t'aider, Steelson...

A+

Bonjour,

Je m'excuse pour mon manque de clarté, je vais reprendre depuis le début.

Cette macro a pour but d'éditer une situation du compte des (gros) clients, l'objectif étant de leur envoyer uniquement le montant échu, à échoir et le montant total.

Dans l'onglet Litiges, je cherche à recenser toutes les factures qui sont en litiges, caractérisées par l'état "1" dans la colonne T de l'onglet Items

Idem dans l'onglet Factures échues, je cherche à recenser les factures échues non réglées qui restent dans le compte du client

L'onglet Factures à échoir recense les factures non échues.

La démarche est la suivante :

En donnant le nom du client à l'ouverture du classeur, la macro va chercher directement dans le répertoire adéquat, le fichier extrait du logiciel de recouvrement afin de le coller dans l'onglet Items.

Par la suite, mettre dans Base de Données les données qui me seront utiles lors du traitement, et ce à partir de l'onglet Items

Enfin, une fois que les types de pièces sont identifiés (litiges etc...), calculer les différents montants (litiges, échues et à échoir), le retard de règlement et en faire la synthèse dans l'onglet "Récap client" avec le nom du client derrière, puis sauvegarder une copie de ce fichier dans un répertoire.

Jusque là, j'ai déjà pu aller chercher mon fichier dans le répertoire adéquat, calculer le retard, identifier les types de pièces, mettre en forme mes onglets comme j'en ai besoin, et ajouter un onglet de manière dynamique.

Le but de ma question est : Comment puis-je faire pour récupérer, dans le cas où une facture est en litige (donc à l'état 1 en colonne T), le numéro de facture correspondant (colonne B) pour le remettre dans mon onglet Litiges au fur et à mesure ? Et ainsi par la suite faire des vlookup selon le numéro de facture afin de remplir les autres colonnes du tableau, pour en déterminer le montant total (et éventuellement le nombre)

J'espère que c'est déjà un peu plus clair pour vous...

à partir de l'onglet Items

Enfin, une fois que les types de pièces sont identifiés (litiges etc...), calculer les différents montants (litiges, échues et à échoir), le retard de règlement et en faire la synthèse dans l'onglet "Récap client" avec le nom du client derrière,

Alors fais un TCD.

Je ne sais pas où sont les valeurs.

Tu fais juste une actualisation du TCD par macro.

Sub actualiser()
    Sheets("TCD").PivotTables("Tableau croisé dynamique1").PivotCache.Refresh
End Sub
Rechercher des sujets similaires à "copier valeur fonction"