รับเซลล์สุดท้ายที่ไม่ว่างในคอลัมน์ใน Google ชีต


147

ฉันใช้ฟังก์ชันต่อไปนี้

=DAYS360(A2, A35)

เพื่อคำนวณความแตกต่างระหว่างวันที่สองวันในคอลัมน์ของฉัน อย่างไรก็ตามคอลัมน์นี้กำลังขยายออกไปเรื่อย ๆ และตอนนี้ฉันต้องเปลี่ยน "A35" ด้วยตนเองเมื่อฉันอัปเดตสเปรดชีต

มีวิธี (ใน Google ชีต) ในการค้นหาเซลล์สุดท้ายที่ไม่ว่างเปล่าในคอลัมน์นี้แล้วตั้งค่าพารามิเตอร์นั้นแบบไดนามิกในฟังก์ชันด้านบนหรือไม่


2
คำถามที่คล้ายกัน: stackoverflow.com/questions/4169914/…
Jon Schneider

คำตอบ:


178

อาจมีวิธีที่คมชัดกว่านี้ แต่นี่คือวิธีที่ฉันคิดขึ้น:

ฟังก์ชันในการค้นหาเซลล์ที่เติมสุดท้ายในคอลัมน์คือ:

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

ดังนั้นหากคุณรวมเข้ากับฟังก์ชันปัจจุบันของคุณจะมีลักษณะดังนี้:

=DAYS360(A2,INDEX( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ; ROWS( FILTER( A:A ; NOT( ISBLANK( A:A ) ) ) ) ))

1
ฉันไม่ได้กังวลเกี่ยวกับความคมคายในกรณีนี้ตราบใดที่มันใช้งานได้เหมือนมีเสน่ห์ (ซึ่งมันทำ) - ขอบคุณมาก Sam!
MichaelS

4
ฉันลงเอยด้วยการเปรียบเทียบกับสตริงว่างแทนที่จะใช้ ISBLANK ซึ่งถือว่าเซลล์ที่ดูว่างเปล่า (เช่นสูตรที่ส่งคืนค่าว่างเช่น = "" เป็นแบบไม่ว่างเปล่าดังนั้น: '= index (ตัวกรอง (A: A, A: A <> ""), แถว (ตัวกรอง (A: A, A: A <> "))) '
circlepi314

ฉันยังมีปัญหากับ ISBLANK เนื่องจากสูตร แต่ใช้ = INDEX (FILTER (F3: F; F3: F <> "")); ROWS (FILTER (F3: F; F3: F <> "")) ผลลัพธ์ข้อผิดพลาดในการแยกวิเคราะห์สูตร มีความคิดอะไรผิด?
klor

คำถาม. ถ้าแทน A: A มี importrange () จะเขียนใหม่ได้อย่างไรโดยไม่ต้องทำ importrange เดียวกัน () 4 ครั้ง
Irina Rapoport

4
คำตอบที่เรียบง่ายเล็กน้อยที่จัดการช่องว่างโดย Doug Bradshaw: =INDEX(FILTER(A1:A,NOT(ISBLANK(A1:A))),COUNTA(A1:A))(สามารถเปลี่ยนแถวเริ่มต้น A1) คำอธิบายแบบเต็มได้ที่: stackoverflow.com/a/27623407/539149
Zack Morris

83

หากต้องการค้นหาเซลล์สุดท้ายที่ไม่ว่างคุณสามารถใช้INDEXและMATCHทำหน้าที่ดังนี้:

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

ฉันคิดว่านี่เร็วและง่ายกว่าเล็กน้อย


1
มันง่ายกว่าและฉันได้ทดสอบสิ่งนี้แล้ว ใช้งานได้ดี
Ciaran

26
วิธีของคุณดูเหมือนจะพบเฉพาะเซลล์สุดท้ายหากค่าเป็นตัวเลขเมธอดของฉันจะค้นหาแถวสุดท้ายหากเป็นสตริงประเภทด้วย คำถามเดิมเป็นเรื่องเกี่ยวกับวันที่ดังนั้นสิ่งนี้จะได้ผล แต่เมื่อเห็นว่าบทความยังคงได้รับความสนใจอยู่จึงควรสังเกตความแตกต่าง ทั้งหมดขึ้นอยู่กับความต้องการของคุณ หากคุณต้องการเพียงแค่เบอร์ฉันแนะนำทางนี้
Sam Plus Plus

1
นี่ถือว่าคอลัมน์ถูกจัดเรียง
Andrej Adamenko

สามารถทำได้เช่น=DAYS360(A2;VLOOKUP(99^99;A:A;1))
vstepaniuk

56

ถ้า A2: A มีวันที่ติดกัน INDEX (A2: A, COUNT (A2: A)) จะส่งกลับวันที่สุดท้าย สูตรสุดท้ายคือ

=DAYS360(A2,INDEX(A2:A,COUNT(A2:A)))

9
โดยส่วนตัวฉันคิดว่านี่ควรเป็นคำตอบที่ยอมรับได้ กระชับและเรียบง่าย
SwampThingTom

4
นี่คือคำตอบที่แม่นยำที่สุด ในขณะที่คำตอบของ @Poul ข้างต้นใช้ได้กับกรณีนี้ แต่ฉันต้องการค้นหาเซลล์สุดท้ายจริงที่มีข้อมูลจริงและสิ่งนี้จะได้รับว่าข้อมูลเป็นไปตามลำดับหรือไม่
Chuck Claunch

4
เหมาะมากครับ ประการที่สองการเคลื่อนไหวที่ควรเป็นคำตอบที่ยอมรับได้
shiri

37

สิ่งที่ฉันชอบคือ:

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

ดังนั้นสำหรับความต้องการของ OP:

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

... แม้ว่า "MAX" ที่โพสต์ไว้ด้านบนจะดูสะอาดกว่าในกรณีที่วันที่สุดท้ายเป็นวันล่าสุดเสมอ
Eric Smalling

1
เขาหมายถึง +1 ไม่ 1
Newbrict

1
สิ่งนี้ไม่ตอบคำถาม - จะเลือกค่าสุดท้าย แต่ไม่ใช่ค่าสุดท้ายที่ไม่ว่างเปล่า
NateS

17

หากคอลัมน์ขยายตามวันที่ที่เพิ่มต่อเนื่องกันในกรณีของฉัน - ฉันใช้เพียงฟังก์ชัน MAX เพื่อรับวันที่สุดท้าย

สูตรสุดท้ายจะเป็น:

=DAYS360(A2; MAX(A2:A)) 

3
อัจฉริยะ! ง่ายและมีประสิทธิภาพ
Asu

16

แม้ว่าคำถามจะได้รับคำตอบแล้ว แต่ก็มีวิธีที่ดีในการทำเช่นนั้น

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

ตัวอย่างเช่น:

หากข้อมูลของคุณอยู่ในA1:A100และคุณต้องการที่จะสามารถเพิ่มข้อมูลเพิ่มเติมในคอลัมน์ A กล่าวว่าอาจเป็นA1:A105หรือในA1:A1234ภายหลังคุณสามารถใช้ช่วงนี้:

A1:A

ตัวอย่าง

ดังนั้นเพื่อให้ได้ค่าสุดท้ายที่ไม่ว่างเปล่าในช่วงเราจะใช้ 2 ฟังก์ชัน:

  • COUNTA
  • ดัชนี

คำตอบคือ=INDEX(B3:B,COUNTA(B3:B)).

นี่คือคำอธิบาย:

COUNTA(range) ส่งคืนจำนวนค่าในช่วงเราสามารถใช้สิ่งนี้เพื่อรับจำนวนแถว

INDEX(range, row, col)ส่งคืนค่าในช่วงที่ตำแหน่งrowและcol( col=1หากไม่ระบุ)

ตัวอย่าง:

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

B3:Bสำหรับภาพข้างบนช่วงของเราจะได้รับ ดังนั้นเราจะนับจำนวนค่าจะมีในช่วงB3:BโดยCOUNTA(B3:B)ครั้งแรก ทางด้านซ้ายจะผลิต8เนื่องจากมี 8 ค่าในขณะที่จะผลิต9ในด้านขวา เรายังไม่ทราบว่าค่าสุดท้ายที่อยู่ในคอลัมน์ที่ 1 ของช่วงB3:Bดังนั้นcolพารามิเตอร์ของINDEXต้องเป็น 1 และพารามิเตอร์ที่ควรจะเป็นrowCOUNTA(B3:B)

PS : โปรดโหวตคำตอบของ @ bloodymurderlive ตั้งแต่เขาเขียนครั้งแรกฉันแค่อธิบายที่นี่


1
ฉันชอบสิ่งนี้ แต่เคยเห็นปัญหาที่บางครั้งส่งคืนรายการถัดไปสุดท้ายแทนที่จะเป็นรายการสุดท้าย
Eric Smalling

1
@EricSmalling ที่อาจเกิดขึ้นเนื่องจากคุณมีตัวดึงข้อมูลเพิ่มเติมหนึ่งบรรทัดที่ท้ายแถวทั้งหมดและเมื่อคุณคัดลอกวางมันอาจถูกพิจารณาว่าเป็นเซลล์ที่ไม่ว่างเปล่า คุณมีสเปรดชีตตัวอย่างที่เปิดเผยปัญหานี้หรือไม่
Ramazan Polat

ดูเหมือนวิธีแก้ปัญหาที่ชาญฉลาดที่สุด!
MemLeak

มันใช้ไม่ได้ คุณได้คำพูดจาก btw มาจากไหน? ฉันคิดว่ามันมาจากเอกสารของ Google ชีต
Atul

1
@RamazanPolat: OP ขอนะคะ ทาง (ใน Google ชีต) เพื่อค้นหาเซลล์สุดท้ายที่ไม่ว่างในคอลัมน์ A1:Aไม่ได้ให้ค่าเซลล์สุดท้ายที่ไม่ว่างเปล่าในคอลัมน์ A
Atul

8

นี่คืออีกหนึ่ง:

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

ด้วยสมการสุดท้ายคือ:

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

สมการอื่น ๆ ในที่นี่ใช้ได้ แต่ฉันชอบอันนี้เพราะมันทำให้การหาหมายเลขแถวง่ายขึ้นซึ่งฉันพบว่าฉันต้องทำบ่อยขึ้น หมายเลขแถวจะเป็นดังนี้:

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

ตอนแรกฉันพยายามค้นหาสิ่งนี้เพื่อแก้ปัญหาสเปรดชีต แต่ไม่พบสิ่งที่เป็นประโยชน์ที่ให้หมายเลขแถวของรายการสุดท้ายดังนั้นหวังว่านี่จะเป็นประโยชน์สำหรับใครบางคน

นอกจากนี้ยังมีข้อได้เปรียบเพิ่มเติมที่สามารถใช้ได้กับข้อมูลประเภทใดก็ได้ในลำดับใดก็ได้และคุณสามารถมีแถวว่างระหว่างแถวที่มีเนื้อหาได้และจะไม่นับเซลล์ที่มีสูตรที่ประเมินเป็น "" นอกจากนี้ยังสามารถจัดการกับค่าซ้ำ ๆ สรุปแล้วมันคล้ายกับสมการที่ใช้ max ((G: G <> "") * row (G: G)) ตรงนี้ แต่จะทำให้การดึงหมายเลขแถวออกมาง่ายขึ้นเล็กน้อยหากนั่นคือสิ่งที่คุณต้องการ .

หรือหากคุณต้องการใส่สคริปต์ลงในแผ่นงานของคุณคุณสามารถทำให้มันง่ายขึ้นด้วยตัวคุณเองหากคุณวางแผนที่จะทำสิ่งนี้เป็นจำนวนมาก นี่คือสิ่งที่ 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;
    }
  }
}

ที่นี่คุณสามารถพิมพ์ข้อความต่อไปนี้หากคุณต้องการให้แถวสุดท้ายในแผ่นเดียวกันกับที่คุณกำลังแก้ไขอยู่:

=LASTROW()

หรือถ้าคุณต้องการให้แถวสุดท้ายของคอลัมน์ใดคอลัมน์หนึ่งจากแผ่นงานนั้นหรือของคอลัมน์ใดคอลัมน์หนึ่งจากแผ่นงานอื่นคุณสามารถทำสิ่งต่อไปนี้:

=LASTROW("Sheet1","A")

และสำหรับแถวสุดท้ายของแผ่นงานโดยทั่วไป:

=LASTROW("Sheet1")

จากนั้นเพื่อให้ได้ข้อมูลจริงคุณสามารถใช้ทางอ้อม:

=INDIRECT("A"&LASTROW())

หรือคุณสามารถแก้ไขสคริปต์ด้านบนที่สองบรรทัดสุดท้าย (สองบรรทัดสุดท้ายเนื่องจากคุณจะต้องใส่ทั้งชีตและคอลัมน์เพื่อรับค่าจริงจากคอลัมน์จริง) และแทนที่ตัวแปรด้วยสิ่งต่อไปนี้:

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

และ

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

ข้อดีอย่างหนึ่งของสคริปต์นี้คือคุณสามารถเลือกได้ว่าคุณต้องการรวมสมการที่ประเมินเป็น "" หรือไม่ หากไม่มีการเพิ่มข้อโต้แย้งสมการที่ประเมินเป็น "" จะถูกนับ แต่ถ้าคุณระบุแผ่นงานและคอลัมน์จะถูกนับ นอกจากนี้ยังมีความยืดหยุ่นมากหากคุณต้องการใช้สคริปต์ในรูปแบบต่างๆ

อาจจะมากเกินไป แต่เป็นไปได้ทั้งหมด


1
"Unknown function LASTROW"
Berit Larsen

ควรเป็น +100 สำหรับการตอบคำถามหัวข้อ: แถวสุดท้ายไม่ใช่ค่าในแถวสุดท้าย
Norbert van Nobelen

6

แล้วสูตรนี้สำหรับการรับค่าสุดท้าย:

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

และนี่จะเป็นสูตรสุดท้ายสำหรับงานเดิมของคุณ:

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

สมมติว่าวันที่เริ่มต้นของคุณอยู่ใน G10


5

ฉันไปคนละเส้นทาง เนื่องจากฉันรู้ว่าฉันจะเพิ่มบางสิ่งลงในแถว / คอลัมน์ทีละรายการฉันจึงค้นหาแถวสุดท้ายโดยการนับช่องที่มีข้อมูลก่อน ฉันจะสาธิตสิ่งนี้ด้วยคอลัมน์:

=COUNT(A5:A34)

สมมุติว่าส่งกลับ 21 A5 คือ 4 แถวลงไปดังนั้นผมต้องได้ตำแหน่งที่ 21 จากแถวที่ 4 ลงไป ฉันสามารถทำได้โดยใช้ inderect ดังนี้:

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

เป็นการหาจำนวนแถวที่มีข้อมูลและส่งคืนตัวเลขที่ฉันใช้เป็นตัวปรับดัชนี


1
โปรดทราบว่าต้องไม่มีเซลล์ว่าง นอกจากนี้ COUNTA ควรจะพอดีกับสถานการณ์อื่น ๆ
Bernardo Dal Corno

4

สำหรับแถว:

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

สำหรับคอลัมน์:

=ARRAYFORMULA(INDIRECT(ADDRESS(1, MAX(IF(1:1<>"", COLUMN(1:1), )), 4)))

1
คำตอบที่ยอดเยี่ยม ขอบคุณ.
Nick

3

นี่ดูเหมือนจะเป็นวิธีที่ง่ายที่สุดที่ฉันพบในการดึงค่าสุดท้ายในคอลัมน์ที่ขยายตลอดเวลา:

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

3

สิ่งนี้ใช้ได้กับฉัน รับค่าสุดท้ายของคอลัมน์ A ใน Google แผ่นงาน:

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

(นอกจากนี้ยังข้ามแถวว่างระหว่างถ้ามี)



1

สิ่งนี้จะให้เนื้อหาของเซลล์สุดท้าย:

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

สิ่งนี้จะให้ที่อยู่ของเซลล์สุดท้าย:

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

สิ่งนี้จะให้แถวของเซลล์สุดท้าย:

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

บางทีคุณอาจต้องการสคริปต์ สคริปต์นี้สั้นกว่าสคริปต์ขนาดใหญ่ที่คนอื่นโพสต์ไว้ด้านบน:

ไปที่โปรแกรมแก้ไขสคริปต์และบันทึกสคริปต์นี้:

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

สิ่งหนึ่งที่เสร็จแล้วคุณเพียงแค่ป้อนสิ่งนี้ในเซลล์:

=getLastRow(A:A)

0

วิธีที่มือสมัครเล่นทำคือ "= CONCATENATE (" A ", COUNTUNIQUE (A1: A9999))" โดยที่ A1 เป็นเซลล์แรกในคอลัมน์และ A9999 จะอยู่ห่างจากคอลัมน์นั้นมากกว่าที่ฉันคาดไว้ว่าจะมีรายการใด ๆ ผลลัพธ์ A # นี้สามารถใช้กับฟังก์ชัน INDIRECT ได้ตามต้องการ


ขออภัย. สิ่งนี้ใช้ได้เฉพาะเมื่อรายการทั้งหมดในคอลัมน์ไม่ซ้ำกัน
Conrad Lindes

1
แม้ว่าฉันจะขอบคุณที่คุณมีส่วนร่วมใน StackOverflow Conrad แต่คำตอบของคุณมีปัญหาบางประการ ประการแรกเขาไม่ได้ระบุว่าวันที่ไม่ซ้ำกันดังนั้นคุณควรใช้ count () แทน countunique () ประการที่สองการใช้ทางอ้อม () และเชื่อมต่อกันจะซ้ำซ้อนกับฟังก์ชันที่มีอยู่ของ index () ดังที่คุณเห็นในคำตอบอื่น ๆ ประการที่สามแทนที่จะใช้ A1: A9999 ทำไมไม่ใช้ A1: A ล่ะ?
sondra.kinsey

0

เพื่อหาจำนวน nonempty แถวสุดท้าย (ให้ช่องว่างระหว่างพวกเขา) Aผมใช้ด้านล่างเพื่อค้นหาคอลัมน์

=ArrayFormula(IFNA(match(2,1/(A:A<>""))))
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.