Comptabiliser la dernière séquence sur une ligne correspondant à un critère

Bonjour,
Sous Excel j'ai une fonction personnalisée qui me permet de récupérer le nombre de cellules composant la dernière séquence sur la ligne en fonction d'un critère.
ex: x x x z z d d d d d x x x x x x
pour le x : le résultat sera 6
pour le d : le résultat sera 5
pour le z : le résultat sera 2

Ma fonction sous Excel est :
Function SousTerre(L As Integer) As Single
Application.Volatile
x = Cells(3, 3).Value
Dim c1%, c2 As Integer

For c1 = x To 20 Step -1
If Cells(L, c1) = "BR" Or Cells(L, c1) = "ST" Then Exit For
Next

For c2 = c1 To 20 Step -1
If Cells(L, c2) <> "BR" And Cells(L, c2) <> "ST" Then Exit For
Next

SousTerre = IIf(c2 = c1, 0, (c1 - c2) )

End Function

Ma question, comment traduire cela pour Apps script
Merci

Bonjour,

Le critère est BR ou ST c'est cela ? Si oui un =Query avec en condition where = %BR% / %ST% pourrait être la solution ?

Bonjour,

J'ai essayé avec Query avec exemple sur la ligne 3 en appliquant la recherche que sur "ST".

=query(B3:T3;"select * count(3:3) where = ST")

De ce que j'ai pu lire, Query est très bien pour des tableaux, et je ne voit pas comment l'appliquer pour une ligne, sachant que je devrait répéter cela à chaque ligne.

Ce que je cherche, c'est de pouvoir compter la dernière activité correspondant à un critère sur une ligne. Celle-ci peut se trouver à la fin de la ligne, mais aussi entre deux activités.

Bonjour,

1- Pour ce qui est de la position relative de votre cible (ST / BR) il faut utiliser LIKE + le signe % ainsi qu'importe sa position, il sera trouvé.

SELECT * WHERE A LIKE '%ST%' ")

2- Pour ce qui est de l'analyse de ligne au lieu de colonne, un simple TRANSPOSE devrait suffire.

Bonjour,

Désolé mais je n'y arrive pas avec Query.

Par contre je pense avoir trouvé un début de solution avec ces codes:

Néanmoins il faudrait que :

LastNotEmpty m'indique le numéro de la colonne contenant le dernier "ST" sur la ligne.

FirstNotEmpty m'indique le numéro de la colonne contenant le premier différent de "ST" en partant de lastNotEmpty.

Code principal m'indique le résultat de LastNotEmpty moins FirstNotEmpty.

LastNotEmpty = C1

FirstNotEmpty=C2

Code principal = C1 - C2

function lastNotEmpty(spreadsheet, row) {
const dataRange = spreadsheet.getRange(row, 1, 0, spreadSheet.getLastColumn()).getData()[0];
   for(let i=dataRange.length -1; i>=0; i--) {
      if (dataRange[i] && dataRange[i].trim()) {
          return spreadsheet.getRange(row, i, 0, 0).getA1Notation();
      }
   }
}

function firstNotEmpty(spreadsheet, row){
   const dataRange = spreadsheet.getRange(row, 1, 0, spreadSheet.getLastColumn()).getData()[0];
   for(let i=0; i<dataRange.length; i--) {
      if (dataRange[i] && dataRange[i].trim()) {
          return spreadsheet.getRange(row, i, 0, 0).getA1Notation();
      }
   }
}

function codePrincipal(){
const app = SpreadsheetApp.getActive();
const spreadsheet = app.getActiveSpreadsheet();
const row = app.getActiveRange().getRow();
const first = firstNotEmpty(spreadsheet, row);
  if (!first) {
    return;
}
applyStyle(spreadsheet, first, lastNotEmpty(spreadsheet, row))
}

Personnellement je mets une formule COUNUNIQUE en haut de mes tableaux que j'utilise pour ce type de formule : (ici la variable range)

// compte le nombre de lignes où il y a des références
  var range = sheet.getRange(4,1).getValue()+1;
// créé une liste avec les références
  var REF = sheet.getRange(5,8,range).getValues();
  for (var i=0;i<=range;i++)
  {
    sheet.getRange(5+i,9).setValue(TDstatut(REF[i]))
  } 

Bonjour,

Peut être plus simple à expliquer avec un fichier exemple :

https://docs.google.com/spreadsheets/d/1SXCvGI7u3w9xFXABpI4BCsoFF6oiI13x_BiGLU1KEg0/edit#gid=0

Bonjour,

Voilà une solution:

=transpose({NB.SI(query(transpose(query($C19:$S19;"select * where C ='"&C6&"'")));"Di");NB.SI(query(transpose(query($C19:$S19;"select * where C ='"&C6&"'")));"RE");NB.SI(query(transpose(query($C19:$S19;"select * where C ='"&C6&"'")));"GE");NB.SI(query(transpose(query($C19:$S19;"select * where C ='"&C6&"'")));"ST")})

https://docs.google.com/spreadsheets/d/1RP3o3OSjHJhkV9eGZbUGrFo-XPXQFFLlHOoRhZzsKK8/edit?usp=sharing

Cordialement,

Fil.

Bonjour,

Ce n'est pas exactement cela. Le solution apportée compte toutes les occurrences correspondant au critère, cela revient à la formule = NB.SI( "valeur cherchée; plage).

Ce que je souhaites récupérer, c'est uniquement le nombre de valeur de la dernière activité (critère de recherche "ST" ou "DI" etc) . Lorsqu'une même activité est coupée par une autre, ne prendre en compte que la dernière.

D'accord!

Effectivement, j'ai lu trop rapidement ta demande...

En fait, si j'ai bien compris: il faut lire le tableau de droite à gauche et compter uniquement le nombre d'occurrences rencontrées en premier pour chaque valeur?

Bonjour,

Oui c'est cela.

Aller sur la dernière cellule de la ligne. revenir en arrière pour trouver l'occurrence recherchée. Compter ce nombre d'occurrence et cela jusqu'au prochain changement. Afficher le nombre dans la cellule en entête de ligne.

Bonjour,

Et avec un cumul de SI ? C'est bourrin, mais ça marche :

=SI(S19="ST";1+SI(R19="ST";+1+SI(Q19="ST";+1+SI(P19="ST";+1+SI(O19="ST";+1+SI(N19="ST";+1+SI(M19="ST";+1+SI(L19="ST";+1+SI(K19="ST";+1+SI(J19="ST";+1+SI(I19="ST";+1+SI(H19="ST";+1;0);0);0);0);0);0);0);0);0);0);0);0)

J'ai mis à jour ton tableau avec ST :

https://docs.google.com/spreadsheets/d/1SXCvGI7u3w9xFXABpI4BCsoFF6oiI13x_BiGLU1KEg0/edit#gid=0

Bonjour,

Merci

Oui cela fonctionne pour un nombre très limité de colonnes et uniquement si c'est la dernière valeur de la ligne.

Cela doit compter les dernières valeurs de la dernière séquence correspondant au critère. Cette séquence peut donc se trouver au milieu de la ligne.

Bonjour,

J'avance un peu, j'ai créé ce code mais je n'ai rien qui s'affiche.

function sousterre(){
// définir les variables
var ss = SpreadsheetApp.getActiveSpreadsheet()
var C1;
var C2;
// trouver le premier "ST" en partant de la fin de la ligne - comptage de droite à gauche
  for(C1=1;C1>30;C1--){
    ss.getRange(row,C1)="ST";
// trouver la première occurance différente en partant de C1 - comptage de droite à gauche
  for(C2=1;C2<C1;C2--){
    ss.getRange(row,C2)<""> "ST";
// pour afficher le résultat 
sousterre = If(C2=C1,0,(C1-C2))
  }
}
}

Peut être avec une erreur ici : comment mettre le signe différent <>

 ss.getRange(row,C2)<""> "ST";

Bonjour,

Sous Apps Script, la syntaxe pour différent de est: "!=".

Cordialement,

Fil.

Re,

Est-ce en partie la bonne solution ?

pour C1 partir de la dernière cellule de la ligne. est-ce le bon code?

function sousterre(){
// définir les variables
var ss = SpreadsheetApp.getActiveSpreadsheet()

// comment faire pour la variable row?

// trouver le premier "ST" en partant de la fin de la ligne - comptage de droite à gauche
    for(var C1=30;C1>=1;C1--) { // boucle de 30 à 1
    if(ss.getRange(row,C1).getValue() == "ST"){
// trouver la première occurence différente en partant de C1 - comptage de droite à gauche
  for(C2=1;C2<C1;C2--){
    ss.getRange(row,C2)!= "ST";
// pour afficher le résultat 
sousterre = If(C2=C1,0,(C1-C2))
  }
}
}

Bonjour,

Juste pour vous donner la solution:

function sousterre(){
// définir les variables
var ss = SpreadsheetApp.getActiveSheet()
var n= ss.getLastColumn();
  for(var C1=n;C1>=1;C1--) { // boucle de n à 1
    if(ss.getRange(ss.getCurrentCell().getRow(),C1).getValue() == "ST"){
         // on a trouvé la cellule qui contient ST
  for(var C2=C1;C2>=1;C2--){
    if(ss.getRange(ss.getCurrentCell().getRow(),C2).getValue() !="ST"){
  return  C1-C2;
        }
      }       
    }    
  }
}

Bonjour,

Si ton problème est résolu, peux-tu clôturer le sujet, stp?

Merci,

Bonne journée,

Fil.


Rechercher des sujets similaires à "comptabiliser derniere sequence ligne correspondant critere"