web-dev-qa-db-fra.com

Sélection de la dernière valeur d'une colonne

J'ai une feuille de calcul avec des valeurs dans la colonne G. Certaines cellules sont vides entre elles et je dois obtenir la dernière valeur de cette colonne dans une autre cellule.

Quelque chose comme:

=LAST(G2:G9999)

sauf que LAST n'est pas une fonction.

106
cambraca

Donc, cette solution prend une chaîne en tant que paramètre. Il trouve combien de lignes sont dans la feuille. Il obtient toutes les valeurs de la colonne spécifiée. Il parcourt les valeurs de la fin au début jusqu'à ce qu'il trouve une valeur qui n'est pas une chaîne vide. Enfin, il retourne la valeur.

Script:

function lastValue(column) {
  var lastRow = SpreadsheetApp.getActiveSheet().getMaxRows();
  var values = SpreadsheetApp.getActiveSheet().getRange(column + "1:" + column + lastRow).getValues();

  for (; values[lastRow - 1] == "" && lastRow > 0; lastRow--) {}
  return values[lastRow - 1];
}

tilisation:

=lastValue("G")

EDIT:

En réponse au commentaire demandant à la fonction de se mettre à jour automatiquement:

Le meilleur moyen que je puisse trouver est de l'utiliser avec le code ci-dessus:

function onEdit(event) {
  SpreadsheetApp.getActiveSheet().getRange("A1").setValue(lastValue("G"));
}

Il ne serait plus nécessaire d'utiliser la fonction dans une cellule telle que la section sage. Au lieu de cela, vous codez en dur la cellule que vous souhaitez mettre à jour et la colonne que vous souhaitez suivre. Il est possible qu'il existe un moyen plus éloquent de mettre en œuvre ceci (espérons-le, celui qui n'est pas codé en dur), mais c'est le meilleur que j'ai pu trouver pour l'instant.

Notez que si vous utilisez la fonction dans la cellule comme indiqué précédemment, elle sera mise à jour lors du rechargement. Peut-être existe-t-il un moyen de se connecter à onEdit() et de forcer la mise à jour des fonctions de cellule. Je ne peux tout simplement pas le trouver dans la documentation.

54
tinifni

Réponse similaire à réponse de caligari , mais nous pouvons la nettoyer en spécifiant simplement la plage complète de la colonne:

=INDEX(G2:G, COUNT(G2:G))
163
dohmoose

En fait, j'ai trouvé une solution plus simple ici:

http://www.google.com/support/forum/p/Google+Docs/thread?tid=20f1741a2e663bca&hl=fr

Cela ressemble à ceci:

=FILTER( A10:A100 , ROW(A10:A100) =MAX( FILTER( ArrayFormula(ROW(A10:A100)) , NOT(ISBLANK(A10:A100)))))
53
Getas

La fonction LAST () n'est pas encore implémentée pour sélectionner la dernière cellule d'une plage. Cependant, en suivant votre exemple:

=LAST(G2:G9999)

nous pouvons obtenir la dernière cellule en utilisant le couple de fonctions INDEX () et COUNT () de cette manière:

=INDEX(G2:G; COUNT(G2:G))

Il y a un exemple réel sur la feuille de calcul où j'ai trouvé (et résolu) le même problème (feuille Orzamentos, cellule I5). Notez que cela fonctionne parfaitement, même en faisant référence à d'autres feuilles du document.

43
caligari

Sommaire:

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )

Détails:

J'ai parcouru et essayé plusieurs réponses et voici ce que j'ai trouvé: La solution la plus simple (voir réponse de Dohmoose ) fonctionne s'il n'y a pas de blancs:

=INDEX(G2:G; COUNT(G2:G))

Si vous avez des blancs, cela échoue.

Vous pouvez gérer un blanc en remplaçant simplement COUNT par COUNTA (voir réponse de user3280071 ):

=INDEX(G2:G; COUNTA(G2:G))

Cependant, cela échouera pour certaines combinaisons de blancs. (1 blank 1 blank 1 échoue pour moi.)

Le code suivant fonctionne (voir réponse de Nader et commentaire de jason ):

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , ROWS( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) )

mais il faut se demander si vous voulez utiliser COLUMNS ou ROWS pour une plage donnée.

Toutefois, si COLUMNS est remplacé par COUNT, il semble que je reçoive une implémentation fiable et vierge de LAST:

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNT( FILTER( G2:G , NOT(ISBLANK(G2:G)) ) ) ) 

Et puisque COUNTA a le filtre intégré, nous pouvons simplifier davantage en utilisant

=INDEX( FILTER( G2:G , NOT(ISBLANK(G2:G))) , COUNTA(G2:G) )

C'est un peu simple et correct. Et vous n'avez pas à vous soucier de savoir s'il faut compter les lignes ou les colonnes. Et contrairement aux solutions de script, il est automatiquement mis à jour avec les modifications apportées à la feuille de calcul.

Et si vous voulez obtenir la dernière valeur d'une ligne, changez simplement la plage de données:

=INDEX( FILTER( A2:2 , NOT(ISBLANK(A2:2))) , COUNTA(A2:2) )
29
Doug Bradshaw

Afin de renvoyer la dernière valeur d'une colonne de valeurs de texte, vous devez utiliser COUNTA. Cette formule est la suivante:

=INDEX(G2:G; COUNTA(G2:G))
9
user3280071

essayez ceci: =INDIRECT("B"&arrayformula(max((B3:B<>"")*row(B3:B))))

Supposons que la colonne dans laquelle vous recherchez la dernière valeur est B.

Et oui, cela fonctionne avec des blancs.

7
Andrew Anderson

Il semble que Google Apps Script prenne désormais en charge les plages en tant que paramètres de fonction. Cette solution accepte une gamme:

// Returns row number with the last non-blank value in a column, or the first row
//   number if all are blank.
// Example: =rowWithLastValue(a2:a, 2)
// Arguments
//   range: Spreadsheet range.
//   firstRow: Row number of first row. It would be Nice to pull this out of
//     the range parameter, but the information is not available.
function rowWithLastValue(range, firstRow) {
  // range is passed as an array of values from the indicated spreadsheet cells.
  for (var i = range.length - 1;  i >= 0;  -- i) {
    if (range[i] != "")  return i + firstRow;
  }
  return firstRow;
}

Consultez également la discussion sur le forum d'aide Google Apps Script: Comment forcer le recalcul des formules?

6
craig3353

J'ai regardé les réponses précédentes et elles ont l'air de travailler trop dur. Peut-être que la prise en charge des scripts s'est simplement améliorée. Je pense que la fonction est exprimée comme ceci:

function lastValue(myRange) {
    lastRow = myRange.length;
    for (; myRange[lastRow - 1] == "" && lastRow > 0; lastRow--)
    { /*nothing to do*/ }
    return myRange[lastRow - 1];
}

Dans mon tableur, j'utilise ensuite:

= lastValue(E17:E999)

Dans la fonction, j'obtiens un tableau de valeurs avec une cellule par cellule référencée, qui effectue une itération à partir de la fin du tableau jusqu'à ce qu'il trouve une valeur non vide ou manque d'éléments. Les références de feuille doivent être interprétées avant que les données ne soient transmises à la fonction. Pas assez sophistiqué pour gérer plusieurs dimensions, non plus. La question demandait la dernière cellule d'une seule colonne, donc cela semble correspondre. Cela mourra probablement aussi si vous manquez de données.

Votre kilométrage peut varier, mais cela fonctionne pour moi.

6
Ted H.
function lastRow(column){
  var sheet = SpreadsheetApp.getActiveSpreadsheet();
  var lastRow = sheet.getLastRow();
  var lastRowRange=sheet.getRange(column+startRow);
  return lastRowRange.getValue();
}

pas de codage dur.

5
desnyki

Celui-ci fonctionne pour moi:

=INDEX(I:I;MAX((I:I<>"")*(ROW(I:I))))
5
Pedro

Ceci obtient la dernière valeur et gère les valeurs vides:

=INDEX(  FILTER( H:H ; NOT(ISBLANK(H:H))) ; ROWS( FILTER( H:H ; NOT(ISBLANK(H:H)) ) ) )
5
Nader

Dans une colonne avec des blancs, vous pouvez obtenir la dernière valeur avec

=+sort(G:G,row(G:G)*(G:G<>""),)
4
JPV

La réponse

$ =INDEX(G2:G; COUNT(G2:G))

ne fonctionne pas correctement dans LibreOffice. Cependant, avec un petit changement, cela fonctionne parfaitement.

$ =INDEX(G2:G100000; COUNT(G2:G100000))

Cela ne fonctionne toujours que si la vraie plage est inférieure à (G2:G10000)

4
Manuel Ferreira

Est-il acceptable de répondre à la question initiale avec une réponse strictement hors sujet :) Vous pouvez écrire une formule dans la feuille de calcul pour le faire. Moche peut-être? mais efficace dans le fonctionnement normal d'un tableur.

=indirect("R"&ArrayFormula(max((G:G<>"")*row(G:G)))&"C"&7)


(G:G<>"") gives an array of true false values representing non-empty/empty cells
(G:G<>"")*row(G:G) gives an array of row numbers with zeros where cell is empty
max((G:G<>"")*row(G:G)) is the last non-empty cell in G

Ceci est proposé comme une pensée pour une série de questions dans la zone de script qui pourraient être fournies de manière fiable avec des formules de tableau qui ont l’avantage de travailler souvent de la manière similaire dans Excel et openoffice.

3
DavidF

Je jouais avec le code donné par @tinfini et je pensais que les gens pourraient bénéficier de ce que je pense être une solution légèrement plus élégante (remarque: je ne pense pas que les scripts fonctionnent de la même manière quand il a créé la réponse originale) ...

//Note that this function assumes a single column of values, it will 
//not  function properly if given a multi-dimensional array (if the 
//cells that are captured are not in a single row).

function LastInRange(values) 
{
  for (index = values.length - 1; values[index] == "" && index > 0; index--) {}
  return String(values[index]);
}

En usage, cela ressemblerait à ceci:

=LastInRange(D2:D)
3
Jonathan Cavell
function getDashboardSheet(spreadsheet) {
  var sheetName = 'Name';
  return spreadsheet.getSheetByName(sheetName);
}
      var spreadsheet = SpreadsheetApp.openByUrl(SPREADSHEET_URL);  
      var dashboardSheet = getDashboardSheet(spreadsheet);
      Logger.log('see:'+dashboardSheet.getLastRow());
3
Marian

J'ai trouvé une autre solution qui pourrait vous aider

=INDEX( SORT( A5:D ; 1 ; FALSE) ; 1 ) retournera la dernière ligne

Plus d'infos sur anab ici: https://groups.google.com/forum/?fromgroups=#!topic/How-to-Documents/if0_fGVINmI

2
irriss

Trouvé une légère variation qui a fonctionné pour éliminer les blancs du bas de la table. = index (G2: G, COUNTIF (G2: G, "<>"))

2
Chris

Concernant le commentaire de @ Jon_Schneider, si la colonne a des cellules vides, utilisez simplement COUNTA ()

=INDEX(G2:G; COUNT**A**(G2:G))
2
pedro

Je suis surpris que personne n'ait jamais donné cette réponse auparavant. Mais cela devrait être le plus court et cela fonctionne même dans Excel:

=ARRAYFORMULA(LOOKUP(2,1/(G2:G<>""),G2:G))

G2:G<>"" crée un tableau de 1/vrai (1) et 1/faux (0). Puisque LOOKUP fait une approche descendante pour trouver 2 et comme il ne trouvera jamais 2, il se place à la dernière ligne non vide et en donne la position.

L'autre façon de faire, comme d'autres l'ont peut-être mentionné, est la suivante:

=INDEX(G2:G,MAX((ISBLANK(G2:G)-1)*-ROW(G2:G))-1)

Trouver le MAXimum ROW de la ligne non vide et l'envoyer à INDEX

Une autre option consiste à utiliser la notation INDIRECTRC avec COUNTBLANK dans un tableau d'interruption vierge. Si V4: V6 est occupé avec des entrées, alors,

V18:

=INDIRECT("R[-"&COUNTBLANK(V4:V17)+1&"]C",0)

donnera la position de V6.

1
TheMaster

pour obtenir la dernière valeur d'une colonne, vous pouvez également utiliser la fonction MAX avec la fonction IF

=ARRAYFORMULA(INDIRECT("G"&MAX(IF(G:G<>"", ROW(G:G), )), 4)))
1
player0