Obtenir la dernière cellule non vide d'une colonne dans Google Sheets

140

J'utilise la fonction suivante

=DAYS360(A2, A35)

pour calculer la différence entre deux dates dans ma colonne. Cependant, la colonne est en constante expansion et je dois actuellement modifier manuellement «A35» lorsque je mets à jour ma feuille de calcul.

Existe-t-il un moyen (dans Google Sheets) de trouver la dernière cellule non vide de cette colonne, puis de définir dynamiquement ce paramètre dans la fonction ci-dessus?

MichaelS
la source
2
Question similaire: stackoverflow.com/questions/4169914/…
Jon Schneider

Réponses:

172

Il y a peut-être un moyen plus éloquent, mais c'est ainsi que j'ai proposé:

La fonction pour trouver la dernière cellule remplie dans une colonne est:

=INDEX( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ; ROWS( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ) )

Donc, si vous le combinez avec votre fonction actuelle, cela ressemblerait à ceci:

=DAYS360(A2,INDEX( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ; ROWS( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ) ))
Sam Plus Plus
la source
1
Je ne suis pas vraiment dérangé par l'éloquence dans ce cas tant que cela fonctionne comme un charme (ce qu'il fait) - merci beaucoup Sam!
MichaelS
4
J'ai fini par comparer avec la chaîne vide plutôt que d'utiliser ISBLANK, qui traite certaines cellules vides (par exemple, les formules de retour de blanc comme = "" comme non vides. Ainsi: '= index (filter (A: A, A: A <> ""), rows (filter (A: A, A: A <> ""))) '
circlepi314
J'ai également eu des problèmes avec l'ISBLANK à cause des formules. Mais en utilisant = INDEX (FILTER (F3: F; F3: F <> "")); ROWS (FILTER (F3: F; F3: F <> "")) entraîne une erreur d'analyse de formule. Une idée de ce qui ne va pas?
klor le
Question. Si au lieu de A: A, il y a un importrange (), comment peut-il être réécrit sans faire le même importrange () 4 fois?
Ruby
4
Réponse légèrement simplifiée qui gère également les blancs, par Doug Bradshaw: =INDEX(FILTER(A1:A,NOT(ISBLANK(A1:A))),COUNTA(A1:A))(peut changer la ligne de départ A1) description complète à: stackoverflow.com/a/27623407/539149
Zack Morris
82

Pour trouver la dernière cellule non vide, vous pouvez utiliser INDEXet des MATCHfonctions comme ceci:

=DAYS360(A2; INDEX(A:A; MATCH(99^99;A:A; 1)))

Je pense que c'est un peu plus rapide et plus facile.

xxxbence
la source
1
C'est plus simple et j'ai testé cela. Fonctionne très bien.
Ciaran
24
Votre méthode semble ne trouver la dernière cellule que si la valeur est un nombre, ma méthode trouvera la dernière ligne si elle est également de type chaîne. La question initiale concernait les dates, donc cela fonctionnerait, mais comme l'article retient toujours l'attention, il convient de noter la différence. Tout dépend de vos besoins. Si vous avez juste besoin d'un numéro, je recommande cette méthode.
Sam Plus Plus
1
Cela suppose que la colonne est triée
Andrej Adamenko
Aussi pourrait être fait comme=DAYS360(A2;VLOOKUP(99^99;A:A;1))
vstepaniuk
56

Si A2: A contient des dates contiguës, INDEX (A2: A, COUNT (A2: A)) renverra la dernière date. La formule finale est

=DAYS360(A2,INDEX(A2:A,COUNT(A2:A)))
Rubén
la source
9
Personnellement, je pense que cela devrait être la réponse acceptée. Concis et simple.
SwampThingTom
4
C'est la réponse la plus précise. Bien que la réponse de @Poul ci-dessus fonctionne pour ce cas, je voulais trouver la dernière cellule réelle avec des données réelles et cela permet de savoir si les données sont en ordre ou non.
Chuck Claunch
4
C'est parfait. Deuxièmement, la motion voulant que ce soit la réponse acceptée.
shiri
37

Mon favori est:

=INDEX(A2:A,COUNTA(A2:A),1)

Donc, pour le besoin du PO:

=DAYS360(A2,INDEX(A2:A,COUNTA(A2:A),1))
Eric Smalling
la source
... bien que le "MAX" posté par Poul ci-dessus soit plus propre dans le cas où la dernière date est toujours la plus récente.
Eric Smalling
1
Il voulait dire +1 non, 1
Newbrict
1
Cela ne répond pas à la question - il sélectionne la dernière valeur, mais pas la dernière valeur non vide.
NateS du
17

Si la colonne ne s'est développée que par des dates ajoutées de manière contiguë comme dans mon cas, j'ai utilisé uniquement la fonction MAX pour obtenir la dernière date.

La formule finale sera:

=DAYS360(A2; MAX(A2:A)) 
Poul
la source
3
Génie! Simple et efficace.
Asu le
14

Bien que la question soit déjà répondue, il existe une manière éloquente de le faire.

Use just the column name to denote last non-empty row of that column.

Par exemple:

Si vos données se trouvent A1:A100et que vous souhaitez pouvoir ajouter des données supplémentaires à la colonne A, disons que cela peut l'être A1:A105ou même A1:A1234plus tard, vous pouvez utiliser cette plage:

A1:A

Échantillon

Donc, pour obtenir la dernière valeur non vide d'une plage, nous allons utiliser 2 fonctions:

  • COUNTA
  • INDICE

La réponse est =INDEX(B3:B,COUNTA(B3:B)).

Voici l'explication:

COUNTA(range) renvoie le nombre de valeurs dans une plage, nous pouvons l'utiliser pour obtenir le nombre de lignes.

INDEX(range, row, col)renvoie la valeur dans une plage à la position rowet col( col=1si non spécifié)

Exemples:

INDEX(A1:C5,1,1) = A1
INDEX(A1:C5,1) = A1 # implicitly states that col = 1
INDEX(A1:C5,1,2) = A2
INDEX(A1:C5,2,1) = B1
INDEX(A1:C5,2,2) = B2
INDEX(A1:C5,3,1) = C1
INDEX(A1:C5,3,2) = C2

Pour l'image ci-dessus, notre gamme sera B3:B. Nous allons donc compter le nombre de valeurs présentes dans la plage B3:Ben COUNTA(B3:B)premier. Dans le côté gauche, il produira 8puisqu'il y a 8 valeurs alors qu'il produira 9dans le côté droit. Nous savons également que la dernière valeur est dans la 1ère colonne de la plage, B3:Bdonc le colparamètre de INDEXdoit être 1 et le rowparamètre doit être COUNTA(B3:B).

PS : merci de voter pour la réponse de @ bloodymurderlive depuis qu'il l'a écrite en premier, je l'explique juste ici.

Ramazan Polat
la source
1
J'aime cela, mais j'ai vu des problèmes où il renvoie parfois l'avant-dernier élément au lieu du dernier.
Eric Smalling
1
@EricSmalling cela peut se produire car vous avez un saut de ligne supplémentaire à la fin de toutes les lignes et lorsque vous copiez-collez, cela peut être considéré comme une cellule non vide. Avez-vous un exemple de feuille de calcul exposant ce problème?
Ramazan Polat
On dirait la solution la plus intelligente!
MemLeak
Ça ne marche pas. Où avez-vous obtenu le devis de btw? Je pensais que c'était de la documentation de la feuille de Google.
Atul
1
@RamazanPolat: OP demande un moyen (dans Google Sheets) de trouver la dernière cellule non vide de la colonne A1:A ne me donne pas la dernière valeur de cellule non vide dans la colonne A
Atul le
8

En voici un autre:

=indirect("A"&max(arrayformula(if(A:A<>"",row(A:A),""))))

L'équation finale étant la suivante:

=DAYS360(A2,indirect("A"&max(arrayformula(if(A:A<>"",row(A:A),"")))))

Les autres équations ici fonctionnent, mais j'aime celle-ci car elle facilite l'obtention du numéro de ligne, ce que je trouve que je dois faire plus souvent. Juste le numéro de ligne serait comme ceci:

=max(arrayformula(if(A:A<>"",row(A:A),"")))

J'ai initialement essayé de trouver ceci pour résoudre un problème de feuille de calcul, mais je n'ai rien trouvé d'utile qui donne simplement le numéro de ligne de la dernière entrée, donc j'espère que cela sera utile pour quelqu'un.

En outre, cela présente l'avantage supplémentaire de fonctionner pour tout type de données dans n'importe quel ordre, et vous pouvez avoir des lignes vides entre les lignes avec du contenu, et cela ne compte pas les cellules avec des formules qui évaluent à "". Il peut également gérer des valeurs répétées. Dans l'ensemble, c'est très similaire à l'équation qui utilise max ((G: G <> "") * row (G: G)) ici, mais rend l'extraction du numéro de ligne un peu plus facile si c'est ce que vous recherchez .

Sinon, si vous souhaitez mettre un script sur votre feuille, vous pouvez vous faciliter la tâche si vous prévoyez de le faire beaucoup. Voici ce scirpt:

function lastRow(sheet,column) {
  var ss = SpreadsheetApp.getActiveSpreadsheet();
  if (column == null) {
    if (sheet != null) {
       var sheet = ss.getSheetByName(sheet);
    } else {
      var sheet = ss.getActiveSheet();
    }
    return sheet.getLastRow();
  } else {
    var sheet = ss.getSheetByName(sheet);
    var lastRow = sheet.getLastRow();
    var array = sheet.getRange(column + 1 + ':' + column + lastRow).getValues();
    for (i=0;i<array.length;i++) {
      if (array[i] != '') {       
        var final = i + 1;
      }
    }
    if (final != null) {
      return final;
    } else {
      return 0;
    }
  }
}

Ici, vous pouvez simplement taper ce qui suit si vous voulez que la dernière ligne soit identique à la feuille que vous modifiez actuellement:

=LASTROW()

ou si vous voulez la dernière ligne d'une colonne particulière de cette feuille, ou d'une colonne particulière d'une autre feuille, vous pouvez faire ce qui suit:

=LASTROW("Sheet1","A")

Et pour la dernière ligne d'une feuille particulière en général:

=LASTROW("Sheet1")

Ensuite, pour obtenir les données réelles, vous pouvez soit utiliser indirectement:

=INDIRECT("A"&LASTROW())

ou vous pouvez modifier le script ci-dessus au niveau des deux dernières lignes de retour (les deux dernières car vous devrez mettre à la fois la feuille et la colonne pour obtenir la valeur réelle d'une colonne réelle), et remplacer la variable par ce qui suit:

return sheet.getRange(column + final).getValue();

et

return sheet.getRange(column + lastRow).getValue();

L'un des avantages de ce script est que vous pouvez choisir si vous souhaitez inclure des équations évaluées à "". Si aucun argument n'est ajouté, les équations évaluées à "" seront comptées, mais si vous spécifiez une feuille et une colonne, elles seront désormais comptées. De plus, il y a beaucoup de flexibilité si vous êtes prêt à utiliser des variantes du script.

Probablement exagéré, mais tout est possible.

Mearg
la source
1
"Fonction inconnue LASTROW"
Berit Larsen
Doit être +100 pour répondre réellement au titre de la question: Dernière ligne, pas de valeur dans la dernière ligne
Norbert van Nobelen
6

Qu'en est-il de cette formule pour obtenir la dernière valeur:

=index(G:G;max((G:G<>"")*row(G:G)))

Et ce serait une formule finale pour votre tâche initiale:

=DAYS360(G10;index(G:G;max((G:G<>"")*row(G:G))))

Supposons que votre date initiale soit en G10.

Andrew Anderson
la source
5

J'ai emprunté une voie différente. Puisque je sais que j'ajouterai quelque chose dans une ligne / colonne un par un, je trouve la dernière ligne en comptant d'abord les champs contenant des données. Je vais démontrer cela avec une colonne:

=COUNT(A5:A34)

Donc, disons que renvoyé 21. A5 est 4 lignes vers le bas, donc je dois obtenir la 21e position de la 4e ligne vers le bas. Je peux le faire en utilisant inderect, comme ceci:

=INDIRECT("A"&COUNT(A5:A34)+4)

Il trouve la quantité de lignes avec des données et me renvoie un nombre que j'utilise comme modificateur d'index.

Tamir Nadav
la source
1
Notez qu'il ne peut pas y avoir de cellules vides. En outre, COUNTA devrait s'adapter à plus de scénarios
Z. Khullah
4

pour une ligne:

=ARRAYFORMULA(INDIRECT("A"&MAX(IF(A:A<>"", ROW(A:A), ))))

pour une colonne:

=ARRAYFORMULA(INDIRECT(ADDRESS(1, MAX(IF(1:1<>"", COLUMN(1:1), )), 4)))
joueur0
la source
1
Excellente réponse. Je vous remercie.
Nick
2

Cela semble être la solution la plus simple que j'ai trouvée pour récupérer la dernière valeur dans une colonne en constante expansion:

=INDEX(A:A,COUNTA(A:A),1)
sanglant
la source
2

Cela fonctionne pour moi. Obtenez la dernière valeur de la colonne A dans la feuille Google:

=index(A:A,max(row(A:A)*(A:A<>"")))

(Il saute également les lignes vides entre les deux, le cas échéant)

Atul
la source
1

Calculez la différence entre la dernière date de la colonne A et la date de la cellule A2.

=MAX(A2:A)-A2
Oiseau joyeux
la source
1

Cela donnera le contenu de la dernière cellule:

=indirect("A"&max(ARRAYFORMULA(row(a:a)*--(a:a<>""))))

Cela donnera l'adresse de la dernière cellule:

="A"&max(ARRAYFORMULA(row(a:a)*--(a:a<>"")))

Cela donnera la ligne de la dernière cellule:

=max(ARRAYFORMULA(row(a:a)*--(a:a<>"")))

Vous préférez peut-être un script. Ce script est bien plus court que l'énorme script publié ci-dessus par quelqu'un d'autre:

Accédez à l'éditeur de script et enregistrez ce script:

function getLastRow(range){
  while(range.length>0 && range[range.length-1][0]=='') range.pop();
  return range.length;
}

Une fois que cela est fait, il vous suffit de le saisir dans une cellule:

=getLastRow(A:A)
Michael
la source
0

La façon dont un amateur le fait est "= CONCATENER (" A ", COUNTUNIQUE (A1: A9999))", où A1 est la première cellule de la colonne, et A9999 est plus bas dans cette colonne que je ne m'attends à avoir des entrées. Ce A # résultant peut être utilisé avec la fonction INDIRECT si nécessaire.

Conrad Lindes
la source
Désolé. Cela ne fonctionne que si toutes les entrées de la colonne sont uniques.
Conrad Lindes
1
Bien que j'apprécie votre contribution à StackOverflow, Conrad, votre réponse pose quelques problèmes. Premièrement, il n'a pas spécifié que les dates étaient uniques, vous devriez donc utiliser count () au lieu de countunique (). Deuxièmement, l'utilisation d'indirect () et de concaténation duplique la fonctionnalité existante d'index (), comme vous pouvez le voir dans les autres réponses. Troisièmement, au lieu de A1: A9999, pourquoi ne pas simplement utiliser A1: A?
sondra.kinsey
0

Pour trouver le dernier numéro de ligne non vide (permettant des espaces entre eux), j'ai utilisé ci-dessous pour rechercher la colonne A.

=ArrayFormula(IFNA(match(2,1/(A:A<>""))))
utilisateur34612
la source