Power Query Power query Soustraire 2 sommes dont une a été remplacé de null à 0

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

guypont

XLDnaute Nouveau
Bonjour,
Dans mon tableau je dois calculé l'évolution d'un mois sur l'autre de différents comptes
Pour certains comptes j'ai des valeurs à "0", pour d'autre il est indiqué "Null"
Pour les comptes avec "0", la soustraction se fait bien (exple Cptes 60376200, 606130000).
Pour les comptes avec "Null", je remplace cette valeur par "0", mais la soustraction ne se fait pas (Cptes 602225000, 602280,606130)

Quelle solution ?
merci
 

Pièces jointes

Solution
Bonjour,
Je vois qu'on va vers une usine à gaz... (Fusion des mois les uns avec les autres, au fur et à mesure de l'avancée dans l'année...)
Il y a d'autres moyens, notamment par TCD (mais je pense - et j'en suis sûr - que @chris est bien plus à même que moi pour te trouver une solution)
Sinon, pour répondre "stricto-sensu" à ton interrogation, l'opérateur de coalescence "??" te permet de remplacer la valeur "null" par une valeur de ton choix (voir la documentation sous ce lien)
Ainsi, à l'étape "Personnalisée ajoutée1" (puis les autres étapes calculant les évolutions)

PowerQuery:
= Table.AddColumn(#"Colonnes supprimées", "Evolution 02 - 01", each [#"Février.28/02/2026"]-[#"31/01/2026"])

Tu peux rajouter ceci :

PowerQuery:
=...
Bonjour,
Je vois qu'on va vers une usine à gaz... (Fusion des mois les uns avec les autres, au fur et à mesure de l'avancée dans l'année...)
Il y a d'autres moyens, notamment par TCD (mais je pense - et j'en suis sûr - que @chris est bien plus à même que moi pour te trouver une solution)
Sinon, pour répondre "stricto-sensu" à ton interrogation, l'opérateur de coalescence "??" te permet de remplacer la valeur "null" par une valeur de ton choix (voir la documentation sous ce lien)
Ainsi, à l'étape "Personnalisée ajoutée1" (puis les autres étapes calculant les évolutions)

PowerQuery:
= Table.AddColumn(#"Colonnes supprimées", "Evolution 02 - 01", each [#"Février.28/02/2026"]-[#"31/01/2026"])

Tu peux rajouter ceci :

PowerQuery:
= Table.AddColumn(#"Colonnes supprimées", "Evolution 02 - 01", each [#"Février.28/02/2026"]??0-[#"31/01/2026"]??0)

Bon courage
PS, dans tes SelectRows des différentes tables, utilise plutôt le filtre <> "vide" et <> "null" pour la colonne "Compte"
 
Bonjour,
Je vois qu'on va vers une usine à gaz... (Fusion des mois les uns avec les autres, au fur et à mesure de l'avancée dans l'année...)
Il y a d'autres moyens, notamment par TCD (mais je pense - et j'en suis sûr - que @chris est bien plus à même que moi pour te trouver une solution)
Sinon, pour répondre "stricto-sensu" à ton interrogation, l'opérateur de coalescence "??" te permet de remplacer la valeur "null" par une valeur de ton choix (voir la documentation sous ce lien)
Ainsi, à l'étape "Personnalisée ajoutée1" (puis les autres étapes calculant les évolutions)

PowerQuery:
= Table.AddColumn(#"Colonnes supprimées", "Evolution 02 - 01", each [#"Février.28/02/2026"]-[#"31/01/2026"])

Tu peux rajouter ceci :

PowerQuery:
= Table.AddColumn(#"Colonnes supprimées", "Evolution 02 - 01", each [#"Février.28/02/2026"]??0-[#"31/01/2026"]??0)

Bon courage
PS, dans tes SelectRows des différentes tables, utilise plutôt le filtre <> "vide" et <> "null" pour la colonne "Compte"
Super

Merci beaucoup

Pour le TCD je suis aussi preneur sachant que l'une des difficultés provient du fait que certains mois comportent des comptes qui ne le sont pas dans les mois précédent. Si @chris est dispo....

Bonne soirée
 
Bonjour,
J'ai modifié le type de requêtes.
Dans ce nouveau fichier, tous les Tableaux mensuels commencent par "t_" (exemple, "t_Janvier").
Une requête unique combine tous les tableaux, même ceux que tu vas intégrer ultérieurement. (pour peu qu'ils commencent bien par "t_")
Et un TCD permet d'effectuer le calcul d’Évolution (avec une Mise En Forme Conditionnelle, "vert" si évolution positive, "rouge" sinon)
Petit bémol, je n'arrive pas à supprimer la première colonne vide d'évolution, pour le calcul du premier mois... (je l'ai donc masquée - Colonne D)
Si ça t'intéresse.
Bonne journée
 

Pièces jointes

Bonjour,
J'ai modifié le type de requêtes.
Dans ce nouveau fichier, tous les Tableaux mensuels commencent par "t_" (exemple, "t_Janvier").
Une requête unique combine tous les tableaux, même ceux que tu vas intégrer ultérieurement. (pour peu qu'ils commencent bien par "t_")
Et un TCD permet d'effectuer le calcul d’Évolution (avec une Mise En Forme Conditionnelle, "vert" si évolution positive, "rouge" sinon)
Petit bémol, je n'arrive pas à supprimer la première colonne vide d'évolution, pour le calcul du premier mois... (je l'ai donc masquée - Colonne D)
Si ça t'intéresse.
Bonne journée
Bonjour,
j'étais en train de reproduire ton tableau croisé. J'ai un problème avec le champ "Evolution". Je l'ai créé, paramétré selon ton exemple mais mes colonnes restent vides
1775715836313.png
1775715879144.png


J'ai dû louper une subtilité

Merci de tes éclaircissements
 
Hello,
Je vois "31/01/2026"...
Regarde la pièce jointe 1229375
Une date non conforme, dans la requête?
J'ai essayé de reproduire ton fichier (Power Query, TCD).
J'arrive à remonter les données mais j'ai un noiuveau problème pour créere les colonnes 3Evolution".
Les "Champs,éléments et jeux" sont inactifs
1775723201384.png

Je te joins mon tableau pour que tu puisses vérifier mes erreurs

Merci
 

Pièces jointes

Re-,
Tout d'abord, tu n'as pas appliqué le principe de mon fichier, à savoir que tu charges tes tableaux mensuels au fur et à mesure, alors qu'avec mon fichier, ces tableaux étaient automatiquement chargés, au fur et à mesure de leur création, rien qu'en "Actualisant tout..."
Revois bien ma requête unique.
Ensuite, il ne faut pas créer un champ calculé, mais glisser une deuxième fois le champ "Valeur" dans la synthèse "∑ Valeurs" (flèche bleue)

1775724305790.png



Puis cliquer sur ce champ de valeurs ("Somme de Valeur2), "Paramètres des champs de valeurs..."
1775724200311.png


Puis configurer ainsi :

1775724394316.png


Tu peux renommer le "Nom personnalisé" à ce moment, par exemple

Nota, la création de champs calculés n'est plus possible, car tu as intégré le TCD dans un modèle de données (à la création de ce TCD)

J'ai refait la requête (et le TCD) dans ton dernier fichier
Bon courage
 

Pièces jointes

Re-,
Tout d'abord, tu n'as pas appliqué le principe de mon fichier, à savoir que tu charges tes tableaux mensuels au fur et à mesure, alors qu'avec mon fichier, ces tableaux étaient automatiquement chargés, au fur et à mesure de leur création, rien qu'en "Actualisant tout..."
Revois bien ma requête unique.
Ensuite, il ne faut pas créer un champ calculé, mais glisser une deuxième fois le champ "Valeur" dans la synthèse "∑ Valeurs" (flèche bleue)

Regarde la pièce jointe 1229385


Puis cliquer sur ce champ de valeurs ("Somme de Valeur2), "Paramètres des champs de valeurs..."
Regarde la pièce jointe 1229384

Puis configurer ainsi :

Regarde la pièce jointe 1229386

Tu peux renommer le "Nom personnalisé" à ce moment, par exemple

Nota, la création de champs calculés n'est plus possible, car tu as intégré le TCD dans un modèle de données (à la création de ce TCD)

J'ai refait la requête (et le TCD) dans ton dernier fichier
Bon courage
ok
Pour finir (j'espère) Peux-tu m'expliquer comment créer ta requête unique ?
Si j'ai bien compris en appliquant celle-ci, je pourrais rajouter les onglets mensuels et les actualiser pour que mon TCD se compléte.
 
Re-,
Oui, c'est ce que j'essaie de te dire.. 😉
Regarde dans la requête "CousinHub" (que tu peux renommer, bien sûr)
A l'étape "Source", j'ai cette ligne de code
PowerQuery:
= Excel.CurrentWorkbook()
Cette commande permet de charger tous les tableaux du fichier
1775726377062.png


Si tu en rajoutes, ils seront donc automatiquement chargés
ensuite, à l'étape suivante, je filtre sur les Tableaux commençant par "t_"
Puis je combine, filtre en enlevant les lignes dont l'intitulé est null ou vide
Un dépivotage permet d'avoir une colonne "date", et leur valeur associée
Et enfin, un typage "Date"
Dans le TCD, j'applique le format "janv-20026"
Bon courage
 
Re-,
Oui, c'est ce que j'essaie de te dire.. 😉
Regarde dans la requête "CousinHub" (que tu peux renommer, bien sûr)
A l'étape "Source", j'ai cette ligne de code
PowerQuery:
= Excel.CurrentWorkbook()
Cette commande permet de charger tous les tableaux du fichier
Regarde la pièce jointe 1229391

Si tu en rajoutes, ils seront donc automatiquement chargés
ensuite, à l'étape suivante, je filtre sur les Tableaux commençant par "t_"
Puis je combine, filtre en enlevant les lignes dont l'intitulé est null ou vide
Un dépivotage permet d'avoir une colonne "date", et leur valeur associée
Et enfin, un typage "Date"
Dans le TCD, j'applique le format "janv-20026"
Bon courage
Je tente de reproduire ton tableau en partant d'un tableau vierge afin de comprendre les différentes étapes.
Je bute sue l'étape "Combine" qui doit être accessible par une fonction sans avoir à la taper dans la barre de formule.

Peux-tu m'éclairer encore une fois ?
 
Bonjour guypont, Cousinhub, le forum,

Je sais bien que ce qui vous intéresse c'est Power Query.

Notez cependant que VBA fait souvent les choses plus facilement, voyez le fichier joint et cette macro dans le code de la feuille "Evolution" :
VB:
Private Sub Worksheet_Activate()
Dim An%, n%, nf$, feuilles(), ub%, d As Object, tablo, i&, x$, resu(), a, ii&
An = 26 'à adapter
'---liste des feuilles---
For n = 1 To 12
    On Error Resume Next
    nf = Format(n, "00") & An
    If IsError(Sheets(nf)) Then Else ub = ub + 1: ReDim Preserve feuilles(ub): feuilles(ub) = nf
Next n
'--- liste des comptes sans doublon---
Set d = CreateObject("Scripting.Dictionary")
For n = 1 To ub
    tablo = Sheets(feuilles(n)).ListObjects(1).Range 'tableau structuré
    For i = 2 To UBound(tablo)
        x = tablo(i, 1)
        If x <> "" Then d(x) = ""
Next i, n
Application.ScreenUpdating = False
Rows("2:" & Rows.Count).ClearContents 'RAZ
If d.Count = 0 Then Exit Sub
'---tableau des résultats---
ReDim resu(1 To d.Count, 1 To 2 * ub + 1)
a = d.keys
For i = 1 To d.Count
    resu(i, 1) = a(i - 1)
    For n = 1 To ub
        tablo = Sheets(feuilles(n)).ListObjects(1).Range
        For ii = 2 To UBound(tablo)
            If tablo(ii, 1) = resu(i, 1) Then
                If resu(i, 2) = "" Then resu(i, 2) = tablo(ii, 2)
                resu(i, IIf(n = 1, 3, 2 * n)) = tablo(ii, 3)
                Exit For
            End If
Next ii, n, i
'---restitution et formules des évolutions---
[A2].Resize(d.Count, 2 * ub + 1) = resu
If ub > 1 Then [E2].Resize(d.Count) = "=RC[-1]-RC[-2]"
If ub > 2 Then
    For n = 3 To ub
        Cells(2, 2 * n + 1).Resize(d.Count) = "=RC[-1]-RC[-3]"
    Next n
End If
With UsedRange: End With 'actualise les barres de défilement
End Sub
Elle se déclenche quand on active la feuille.

A+
 

Pièces jointes

Je corrige avec cette macro, plus logique et beaucoup plus rapide :
VB:
Private Sub Worksheet_Activate()
Dim An%, n%, nf$, feuilles(), ub%, hmax&, resu(), d As Object, tablo, i&, x$, nn&, lig&
An = 26 'à adapter
'---liste des feuilles---
For n = 1 To 12
    On Error Resume Next
    nf = Format(n, "00") & An
    If IsError(Sheets(nf)) Then
    Else
        ub = ub + 1
        ReDim Preserve feuilles(ub)
        feuilles(ub) = nf
        hmax = hmax + Sheets(feuilles(ub)).ListObjects(1).ListRows.Count 'tableaux structurés
    End If
Next n
'--- liste des comptes sans doublon et tableau des résultats---
ReDim resu(1 To hmax, 1 To 2 * ub + 1)
Set d = CreateObject("Scripting.Dictionary")
For n = 1 To ub
    tablo = Sheets(feuilles(n)).ListObjects(1).Range 'matrice, plus rapide
    For i = 2 To UBound(tablo)
        x = tablo(i, 1)
        If x <> "" Then
            If Not d.exists(x) Then
                nn = nn + 1
                d(x) = nn 'repère la ligne
                resu(nn, 1) = x
                resu(nn, 2) = tablo(i, 2)
            End If
            lig = d(x) 'récupère la ligne
            resu(lig, IIf(n = 1, 3, 2 * n)) = tablo(i, 3)
            If n > 1 Then If n = 2 Then resu(lig, 5) = resu(lig, 4) - resu(lig, 3) _
                Else resu(lig, 2 * n + 1) = resu(lig, 2 * n) - resu(lig, 2 * n - 2)
        End If
Next i, n
'---restitution---
Application.ScreenUpdating = False
Rows("2:" & Rows.Count).ClearContents 'RAZ
If nn Then [A2].Resize(nn, 2 * ub + 1) = resu
With UsedRange: End With 'actualise les barres de défilement
End Sub
 

Pièces jointes

Dernière édition:
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD
Retour