Formule pour recopier une cellule si....

G

Gaëtan Hardy

Guest
Bonjour,

Voilà, je fais ma comptabilité sur Excel.

Sur ma première feuille, j'ai :

En A : la date de facture
En B : le nom du client
En C : le prénom du client
En D : la somme de la facture en devise nationale
En E : la somme de la facture en devise euros
En F : le numéro de facture
En G : la date de paiement
En H : je met X si payé, sinon la cellule reste vide

Sur ma deuxième feuille, j'ai plusieurs calcul dont une formule qui me calcule le montant total reçu et le montant des factures encore non payées :

=(SOMME.SI(Feuil1!H3:H997;"X";Feuil1!E3:E997)) // total reçu
=SOMME.SI(Feuil1!H3:H997;"";Feuil1!E3:E997) // total en attente

Sur la troisième feuille, je recopie les lignes correspondant aux factures non payés. Etant donné que sur ma première feuille se trouvent toutes les factures depuis le début de l'année, je recopie sur la troisième feuille celles qui sont impayées, et je les supprime lorsque je reçois le paiement.

Mais voilà, je me demande s'il n'y a pas moyen d'avoir une formule qui me recopie sur la troisième feuille les lignes (ou cellules) correspondantes aux factures en attente de paiement, ce qui me ferait gagner du temps.

Merci d'avance.
 
D

Didier

Guest
Bonjour,
Vous cliquez sur la 3' feuille sur la celle ou vous voulez copier le montant facture vous tapez = dans la barre de formule, retourner sur la 2' feuille
cliquez sur la cellule à recopier et Entrée.
Bon Am
 
@

@+Thierry

Guest
Bonjour Gaëtan
Bonjour Didier
Bonjour le Forum,

Merci Didier, tu as bien raison de partager le savoir que tu as sur Excel, et c'est très bien de participer.

Par contre comme Gaëtan utilise =(SOMME.SI(Feuil1!H3:H997;"X";Feuil1!E3:E997)... Je pense qu'il sait faire une liaison entre deux feuilles.

En formule il doit probablemet y avoir une solution... Mais moi je fais çà en VBA.... et çà donnerait ceci :

Option Explicit
Sub ReportImpaye()
Dim X As String
Dim MaPlage As Range
Dim LigneSource As Long
Dim LigneCible As Long
Dim Cell As Range

Sheets(3).Range("A2:H65536").ClearContents

Set MaPlage = Sheets(1).Range("H2", [H65500].End(xlUp))
LigneCible = Sheets(3).Range("A65536").End(xlUp).Row + 1

For Each Cell In MaPlage
If Cell.Value <> "" Then
LigneSource = Cell.Row
Sheets(3).Range("A" & LigneCible & ":H" & LigneCible).Value = _
Sheets(1).Range("A" & LigneSource & ":H" & LigneSource).Value
LigneCible = LigneCible + 1
End If
Next
End Sub


On peut aussi coller çà dans le Private Module de la feuille 1 :
Private Sub Worksheet_Change(ByVal Target As Range)
Call ReportImpaye
End Sub
Comme çà la Feuille trois sera systématiquement mise à jour automatiquement à chaque changement de la feuille 1

J'ai un classeur exemple si tu as des difficulté Gaëtan...
Bon Samedi
@+Thierry
 
G

Gaëtan Hardy

Guest
Bonjour à tous,

Didier, merci pour ta participation, mais ce n'est pas ce que je recherche. Je veux avoir une fonction ou une macro qui me recopie toutes les lignes de mes factures (de la feuille 1 sur la feuille 3) SI ET SEULEMENT SI le paiement n'a pas été effectué.

Thierry,

Merci pour ton aide, mais je ne comprend pas tout. Est-ce que je peux intégrer quelque chose comme ce que tu as écrit dans une feuille de calcul excel ? Je ne suis pas très poussé en programmation excel, je programme surtout en PHP pour le net.

Je veux bien ton classeur exemple. Si tu veux, je te file mon fichier de compta pour que tu comprennes mieux ce que je veux.

Merci d'avance.

Gaëtan
 
@

@+Thierry

Guest
Non ce n'est pas la peine de m'envoyer un fichier...

Regardes ci joint et tape un X (ou autre chose en feuil1 colonne H.....)

et regarde la feuil3.........

@+Thierry
 

Pièces jointes

  • ReportImpaye.xls
    29.5 KB · Affichages: 71
G

Gaëtan Hardy

Guest
les macros sont désactivées car non signés, mais j'ai compris le sytème de ton fichiers. Il recopie toutes les factures qui ont été payés.

C'est très intéressant, sauf que je voudrais le contraire, c'est à dire qu'il me donne la liste des impayées (qui heureusement est plus petite que celle des payés)

Merci d'avance

Gaëtan
 
G

Gaëtan Hardy

Guest
j'ai activé les macros, c'est bien ce que je pensais. Très intéressant ton truc, il me le faut juste dans l'autre sens : afficher sur la feuille 3 les lignes de la feuille 1 où la cellule H est vide.
 
G

Gaëtan Hardy

Guest
Excellent, ça marche, je n'ai plus qu'à faire la mise en page.

Juste la première ligne qu'il me recopie na pas le même format.

Et comment faire pour qu'il me mette en-dessous le montant total en attente ?

En tout cas merci beaucoup, cela va me faciliter le travail.

bon samedi
 
@

@+Thierry

Guest
Gaëtan

Cette macro ne fait pas de report de format... mais juste des Valeurs...
Donc c'est la feuille 3 qui doit être formatée comme tu ne veux...
Pour avoir une somme des impayé il faut faire une ligne de code de plus du style...

J'ai aussi fais un test pour le cas où il n'y ait plus de facture Impayée...
Et en fait la modif => If Cell.Value = "" Then nécessite un changement dans la plage "MaPlage" car VBA ne va pas chercher sur TOUTE la plage... Il faut préciser autrement.......

Donc j'ai TOUT changé (lol çà arrive souvent en VBA !!)

Option Explicit

Sub ReportImpaye()
Dim X As String
Dim MaPlage As Range
Dim LigneSource As Long
Dim LigneCible As Long
Dim RowCible As Long
Dim Cell As Range
Dim FormuleD As String
Dim FormuleE As String

Sheets(3).Range("A2:H65536").ClearContents
RowCible = Sheets(1).Range("A65536").End(xlUp).Row


Set MaPlage = Worksheets(1).Range("H2:H" & RowCible)
LigneCible = Sheets(3).Range("A65536").End(xlUp).Row + 1
For Each Cell In MaPlage
If Cell.Value = "" Then
LigneSource = Cell.Row
Sheets(3).Range("A" & LigneCible & ":H" & LigneCible).Value = _
Sheets(1).Range("A" & LigneSource & ":H" & LigneSource).Value
LigneCible = LigneCible + 1
End If
Next
If LigneCible = 2 Then GoTo Sortie
FormuleD = "=SUM(D2:D" & LigneCible - 1 & ")"
Sheets(3).Range("D" & LigneCible).Value = FormuleD
FormuleE = "=SUM(E2:E" & LigneCible - 1 & ")"
Sheets(3).Range("E" & LigneCible).Value = FormuleE
Exit Sub
Sortie:
MsgBox "Il n'y a pas de facture impayée"
End Sub

Voilà çà devrait mieux marcher !!
Bon Travail
@+Thierry
 
@

@+Thierry

Guest
Gaëtan

En fait le "Dim X as String" peut être supprimé puisque j'ai finalement fait autre chose et je ne fais pas appel à une Variable "X"....

Mais ce n'est pas grave... Juste pour la "propreté" (lol)

@+Thierry
 
@

@+Thierry

Guest
Bonsoir Gaëtan et Moa

Pour Moa: on doit peut-être pouvoir le faire avec format conditionnel (quoique je n'ai pas cherché) mais il faudrait faire compliqué (style on fait une somme de la colonne quelque part ailleurs (exemple cellule X1) en on applique la condition = X1 => format bold...) mais bon vu que tout est fait par VBA on continue !!! (lol)


Donc voici la nouvelle procédure : (qui devient plus longue of course, car on doit d'abord enlever les précédent formats)

Option Explicit

Sub ReportImpaye()
Dim Cible As Range
Dim MaPlage As Range
Dim LigneSource As Long
Dim LigneCible As Long
Dim RowCible As Long
Dim Cell As Range
Dim FormuleD As String
Dim FormuleE As String
Dim SousToto As Range

Set Cible = Sheets(3).Range("A2:H65536")
With Cible
.ClearContents
.Font.Bold = False
End With

RowCible = Sheets(1).Range("A65536").End(xlUp).Row

Set MaPlage = Worksheets(1).Range("H2:H" & RowCible)
LigneCible = Sheets(3).Range("A65536").End(xlUp).Row + 1
For Each Cell In MaPlage
If Cell.Value = "" Then
LigneSource = Cell.Row
Sheets(3).Range("A" & LigneCible & ":H" & LigneCible).Value = _
Sheets(1).Range("A" & LigneSource & ":H" & LigneSource).Value
LigneCible = LigneCible + 1
End If
Next
If LigneCible = 2 Then GoTo Sortie
FormuleD = "=SUM(D2:D" & LigneCible - 1 & ")"
Sheets(3).Range("D" & LigneCible).Value = FormuleD
FormuleE = "=SUM(E2:E" & LigneCible - 1 & ")"
Sheets(3).Range("E" & LigneCible).Value = FormuleE
Set SousToto = Sheets(3).Range("D" & LigneCible & ":E" & LigneCible)
With SousToto
.Font.Bold = True
End With
Exit Sub
Sortie:
MsgBox "Il n'y a pas de facture impayée"
End Sub

Voilà Gaêtan... Je pense que cette fois-ci tu as tout ce que tu voulais en automatique...

Bon Travail (enfin là tu n'as plus grand chose à faire !! lol)
:)
@+Thierry
 
G

Gaëtan Hardy

Guest
Merci beaucoup Thierry, cela va beaucoup m'aider. En plus, cela m'a permi de comprendre un peu la programmation sous excel.

J'ai modifié un peu la mise en page afin de recopier les titres descellules (nom, prénom,etc)

Voici le script :

Option Explicit

Sub ReportImpaye()
Dim Cible As Range
Dim MaPlage As Range
Dim LigneSource As Long
Dim LigneCible As Long
Dim RowCible As Long
Dim Cell As Range
Dim FormuleD As String
Dim FormuleE As String
Dim SousToto As Range
Dim Titre As Range

Set Cible = Sheets(3).Range("A2:H65536")
With Cible
.ClearContents
.Font.Bold = False
End With

RowCible = Sheets(1).Range("A65536").End(xlUp).Row

Set MaPlage = Worksheets(1).Range("H2:H" & RowCible)
LigneCible = Sheets(3).Range("A65536").End(xlUp).Row + 2
For Each Cell In MaPlage
If Cell.Value = "" Then
LigneSource = Cell.Row
Sheets(3).Range("A" & LigneCible & ":F" & LigneCible).Value = _
Sheets(1).Range("A" & LigneSource & ":F" & LigneSource).Value
Sheets(3).Range("G" & LigneCible).Value = _
Sheets(1).Range("I" & LigneSource).Value
LigneCible = LigneCible + 1
End If
Next
If LigneCible = 2 Then GoTo Sortie
Sheets(3).Range("A" & LigneCible + 1).Value = "Total en attente"
FormuleD = "=SUM(D2:D" & LigneCible - 1 & ")"
Sheets(3).Range("D" & LigneCible + 1).Value = FormuleD
FormuleE = "=SUM(E2:E" & LigneCible - 1 & ")"
Sheets(3).Range("E" & LigneCible + 1).Value = FormuleE
Set SousToto = Sheets(3).Range("A" & LigneCible + 1 & ":E" & LigneCible + 1)
With SousToto
.Font.Bold = True
End With
Sheets(3).Range("A" & 3 & ":F" & 3).Value = _
Sheets(1).Range("A" & 2 & ":F" & 2).Value
Sheets(3).Range("G" & 3).Value = "Remarque"
Set Titre = Sheets(3).Range("A" & 3 & ":G" & 3)
With Titre
.Font.Bold = True
End With
Exit Sub
Sortie:
MsgBox "Il n'y a pas de facture impayée"
End Sub


Encore merci.

Si un jour tu as un souci en PHP, tu peux m'envoyer un email, et si je peux t'aider, ce sera avec plaisir.

a+

Gaëtan
 

Discussions similaires

Réponses
17
Affichages
916
Réponses
59
Affichages
4 K

Statistiques des forums

Discussions
313 092
Messages
2 095 190
Membres
106 211
dernier inscrit
Céline 161918