Attribuer des valeurs à une somme donnée

Bonjour à toutes et tous,

Voici ma difficulté : j'ai affaire à plusieurs clients réguliers qui parfois rassemblent plusieurs facture dans un seul paiement, sans le mentionner dans le virement.

En gros, je me retrouve avec deux colonnes (pour chaque client) : une colonne "facturation" et une colonne "paiement", sans pouvoir relier l'une à l'autre. Je vous fais un exemple fictif et (très) réduit ici : https://docs.google.com/spreadsheets/d/1ANF9n1EQJcq51Aj2q57ubKgjsMxX8H-2gStvnTy8ViA/edit?usp=sharing.

Ma question : existe-t-il sur Sheets une méthode qui me permette de tester les différentes combinaisons possibles de la colonne B qui permette d'atteindre les montants de la colonne C, d'attribuer les montants initiaux aux sommes finales, pour que je puisse dire à mon comptable : ce paiement là, c'est cette facture et cette facture que le client a additionné lui-même?

J'ai trouvé quelques infos pour Exel (notamment un tuto sur le Solver), mais 1) je n'ai pas Exel 2) même en installant une version d'essai, le Solver est dans les modules complémentaires que je dois télécharger etc etc. Je me dis que si Microsoft l'a fait, il est probable que Google l'ait fait aussi, non?

Merci pour votre aide.

Bonjour,

Voici une solution tardive à ton problème

Commence par copier ce code Apps Script dans l'éditeur :

function COMBINAISONS(total, plage) {

  // Filtre des valeurs numériques
  plage = plage.flat().filter(i => !isNaN(i) && i);

  // Recherche des combinaisons
  const tabCombinaisons = [];
  combiner(total, 0, [], tabCombinaisons, plage);

  return tabCombinaisons.length ? tabCombinaisons.map(i => [i.join(' / ')]) : 'Pas de combinaisons trouvées.';
}

function combiner(total, somme, tabCombinaison, tabCombinaisons, plage) {

  const nbValeurs = plage.length;

  for (let i = 0; i < nbValeurs; i++) {

    const valeur = plage[i];
    const nouvelleSomme = Math.round((valeur + somme) * 100) / 100; // Arrondi à 2 décimales pour éviter certains problèmes

    // Si plus grand que le total recherché
    if (nouvelleSomme > total) {
      continue;

    // Si le total recherché
    } else if (nouvelleSomme == total) {
      tabCombinaisons.push([...tabCombinaison, valeur]);

    // Si plus petit que le total recherché
    } else {
      const copiePlage = plage.slice(i + 1);
      if (copiePlage.length) {
        combiner(total, nouvelleSomme, [...tabCombinaison, valeur], tabCombinaisons, copiePlage);
      }
    }
  }
}

Puis utilise ensuite simplement la fonction COMBINAISONS pour effectuer les calculs :

image

Dans ce cas, tu peux voir que certains résultats sont à double car il y a 2 fois le montant à 59€, donc 2 combinaisons possibles.

Salut!

Ca fonctionne du tonnerre.

Merci beaucoup :)

Rechercher des sujets similaires à "attribuer valeurs somme donnee"