ฉันไม่ใช่ผู้เชี่ยวชาญใน Excel! อย่างไรก็ตามฉันรู้ว่าสูตรทำงานได้ดีใน MAX เมื่อมีการส่ง Array แบบสัมบูรณ์ให้กับมันแทนที่จะส่งกลับมาจาก IF ฉันเดาว่านี่เป็นเพราะความยาวที่เกิดขึ้นของสองอาร์เรย์ไม่ตรงกับการส่งกลับ # N / A มากเกินไปและดึงสูตรทั้งหมดไปที่ # N / A ดูภาพหน้าจอด้านล่างนี้
นั่นทำให้ฉันสร้าง UDF พื้นฐานมากใน VBA ที่ส่งกลับเฉพาะอาเรย์ที่จำเป็น ไม่มีการตรวจสอบความถูกต้องจำนวนมากใน UDF นี้ ตรวจสอบให้แน่ใจว่ามีการส่งผ่านการอ้างอิงคอลัมน์เดียวเท่านั้นและค่าส่งคืนที่คาดหวังมีอยู่ในคอลัมน์ที่อยู่ติดกันมากไปทางขวา เช่นถ้าคุณผ่าน A1: A4 มันจะตรวจสอบค่าใน B1: B4
กดALT+ F11เพื่อเข้าถึงตัวแก้ไข VBA แทรก -> โมดูลและวางรหัสต่อไปนี้
Public Function RetArray(r1 As Range, a As String) As Variant
Dim i
i = 0
Dim myarray()
For Each cell In r1
If cell.Value = a Then
i = i + 1
End If
Next cell
ReDim myarray(i)
Dim j
j = 0
For Each cell In r1
If cell.Value = a Then
myarray(j) = cell.Offset(0, 1).Value
j = j + 1
End If
Next cell
RetArray = myarray
End Function
เราจะใช้ UDF นี้ในการแก้ปัญหาขั้นสุดท้าย เช่นรับอาร์เรย์ของคอลัมน์ B โดยที่ A คือ H1 ใช้สูตรนี้เป็น=RetArray(A1:A6,H1)
ส่วนที่ยุ่งยากต่อไปคือการจับคู่ค่าที่ส่งคืนนี้ไปยังตำแหน่งที่แน่นอนในคอลัมน์ E และรับค่าจาก D
ขั้นแรกสร้างคอลัมน์ผู้ช่วยเหลือใน C ซึ่งเป็นการต่อเชื่อม D & E
สูตรใน C1 คือ=E1&F1
และลากลงไปยังเซลล์ที่ต้องการด้านล่าง ตรวจสอบให้แน่ใจว่าวันที่ของคุณอยู่ในรูปแบบวันที่ที่ถูกต้องใน Excel และไม่ใช่แบบข้อความมิฉะนั้นโซลูชันนี้จะไม่ทำงาน
ตารางของคุณอยู่ใน H1: H4
ตอนนี้ใน I1 ใส่สูตรต่อไปนี้
=INDEX($D$1:$D$9,MIN(IF($C$1:$C$9=MAX(IF($F$1:$F$9=RetArray($A$1:$A$8,H1),$E$1:$E$9,0))&RetArray($A$1:$A$8,H1),ROW($C$1:$C$9),99^99)))
กดCTRL+ SHIFT+ ENTERเพื่อสร้างและ Array Formula แล้วลากลงตามความยาวของตาราง
วิธีนี้ไม่ได้ทดสอบอย่างละเอียดว่า มันจะทำงานได้ดีถ้าคุณเริ่มข้อมูลของคุณใน Row 1 มิฉะนั้นการอ้างอิงจะผิดพลาดเว้นแต่คุณจะจัดการข้อมูลเดียวกันโดยใช้การอ้างอิงแถวก่อนหน้า ลองดูและย้อนกลับ ตรวจสอบโซลูชันที่ชาญฉลาดจากผู้ใช้รายอื่นด้วยเช่นกัน
ปรับปรุง
ฉันรู้ว่าในขณะที่ Constant Arrays ใช้งานได้และ Cell Reference ไม่ได้ (ซึ่งทำให้ฉันสร้าง UDF ที่ส่งคืน Array) โดยใช้ฟังก์ชัน TRANSPOSE จริง ๆ แล้วดูเหมือนว่าจะสร้าง Constant Array ภายใน ดังนั้นเพียงแค่แทนที่ UDF ด้วย TRANSPOSE ที่อยู่ใน IF และวิธีการแก้ปัญหานี้ทำงานได้โดยไม่ต้องมีโค้ด VBA & คอลัมน์ Helper ใด ๆ
ลองทำสิ่งนี้และตรวจสอบว่าสิ่งนี้เหมาะกับคุณหรือไม่
สูตร Array ใน I1 และ down คือ
=INDEX($D$1:$D$9,MIN(IF($E$1:$E$9&$F$1:$F$9=MAX(IF($F$1:$F$9=TRANSPOSE(IF($A$1:$A$8=H1,$B$1:$B$8)),$E$1:$E$9,0))&TRANSPOSE(IF($A$1:$A$8=H1,$B$1:$B$8)),ROW($C$1:$C$9),99^99)))