web-dev-qa-db-fra.com

Exécution de Total dans Google Sheets avec Array

QUESTION:

Comment créer un solde courant répondant aux critères suivants:

  1. Il utilise une formule matricielle
  2. les lignes ne doivent pas être triées par date, mais total cumulé ne renvoie que le solde de:
    • Rangées avec les mêmes dates ou des dates antérieures
    • Rangées avec le même nom de compte exact
  3. Le solde s'accumule par date, par nom. (c’est-à-dire qu’il filtre tous les résultats par un nom et n’ajoute que les AMT dont la date est identique ou antérieure)

LE CONTEXTE:

J'ai créé un registre des chèques, qui comptabilise les dépôts et les retraits. voici n lien vers ce sur quoi j'ai travaillé jusqu'ici (il a plus de colonnes que l'image ci-dessous: parce que j'ai expérimenté plusieurs solutions.) enter image description here

CE QUE J'AI ESSAYÉ: voir google sheet

  • =ARRAYFORMULA(SUMIF($A$2:A,$A$2:A,$C$2:C)) Ceci ne donne que le total actuel (et non le total cumulé de chaque compte) et ignore complètement la colonne de date.
  • Utilisation d'un tableau =SORT(A2:C,2,TRUE) pour remplir les colonnes en double de A à C, sauf qu'elles sont maintenant triées. Ajoutez ensuite la formule =SUMIF($H$2:H2,H2,$J$2:J) où la colonne H est la colonne triée de A et la colonne J est la colonne triée C. Ensuite, copiez cette formule dans le reste de la colonne. Le problème est que ce n'est pas un tableau. Bien que le résultat se rapproche le plus de ce que j'espère accomplir.

MISE À JOUR 7/10/19:

La feuille que je "partageais" publiquement avait à l'origine un accès en édition à tout ce qui y était changé. J'ai fait de mon mieux pour le réparer et l'améliorer afin de faciliter la compréhension (c'est-à-dire que tous les montants ont été changés en 1, caractères gras et violets indiquent les zones dans lesquelles des formules existent)

3
Xzila

Si vous n'avez pas insisté sur la formule à base de tableau, alors

sumifs(C:C, A:A, A2, B:B, "<="&B2)

entré dans D2 et copié autour de la colonne D, ferait le travail.

Je ne pense pas qu'il existe une solution basée sur une formule array, car arrayformula parcourt une fois un tableau en effectuant des opérations élémentaires. Vous voulez comparer chaque élément avec tous les autres, ce qui est un peu plus complexe (une double boucle for.).

Mais vous pouvez utiliser une fonction personnalisée, comme =runningtotal(A2:A, B2:B, C2:C), qui traite les colonnes et renvoie un tableau de totaux cumulés. Le script implémentant cette fonction est ci-dessous; ajoutez-le via Outils> Editeur de script. La logique est assez simple: comme dit plus haut, il s’agit d’une double boucle for.

function runningTotal(names, dates, amounts) {
  var sum, totals = [], n = names.length;
  if (dates.length != n || amounts.length != n) {
    return 'Error: need three columns of equal length'; 
  }
  for (var i = 0; i < n; i++) {
    if (names[i][0]) {
      sum = 0;
      for (var j = 0; j < n; j++) {
        if (names[j][0] == names[i][0] && dates[j][0] <= dates[i][0]) {
          sum = sum + amounts[j][0];
        }
      }
    }
    else {
      sum = '';
    }
    totals.Push([sum]);
  }
  return totals;
}
3
user79865