Furmulae อาร์เรย์หลายเซลล์ซ้อนกัน


0

ข้อมูลของฉันอยู่ใน 2 ตารางแรก ( A1:B6และD1:F6):

สูตรอาร์เรย์หลายเซลล์ที่ซ้อนกัน

ผลสุดท้ายที่ฉันตั้งใจอยู่ในทุกค่าที่สอดคล้องกันในI1:I4H1:H4

ตัวอย่างเช่นคุณใช้ค่า "A" คุณจะพบทุกรหัสที่ตรงกันจากB1:B6(เช่น "code1", "code2" และ "code3") จากนั้นคุณค้นหาวันที่ล่าสุดในE1:E5(ตรงกับรหัสจากขั้นตอนก่อนหน้า ) D1:D5และให้ผลที่สอดคล้องกับวันที่ค่าใน

ฉันติดอยู่กับขั้นตอนการค้นหาวันที่ล่าสุด ฉันลองสิ่งเหล่านี้:

{=IF($F$1:$F$5=IF($A$1:$A$6=$H$1,$B$1:$B$6),$E$1:$E$5)}
{=IF($F$1:$F$5={IF($A$1:$A$6=$H$1,$B$1:$B$6)},$E$1:$E$5)}

คำแนะนำใด ๆ โปรด? ฉันสามารถเพิ่มคอลัมน์เพิ่มเติมได้ แต่ปัญหาคือผลลัพธ์หลายอาเรย์ซึ่งเท่าที่ฉันรู้ไม่สามารถเก็บไว้ในเซลล์เดียว

คำตอบ:


3

ฉันไม่ใช่ผู้เชี่ยวชาญใน 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)))

ป้อนคำอธิบายรูปภาพที่นี่


ขอขอบคุณ! ฉันขอขอบคุณความพยายามของคุณ ฉันได้อัปเกรดคำตอบแล้ว แต่ตอนนี้ฉันจะไม่ทำเครื่องหมายว่าตอบแล้ว มันรู้สึกอย่างใดควรมีตัวเลือกโดยไม่ VBA และง่ายกว่าคำตอบของฉันเอง ฉันรู้ว่า VBA ค่อนข้างดี แต่ปัจจุบันฉันพยายามหลีกเลี่ยง ขอขอบคุณ!
ZygD

พบการใช้ TRANSPOSE แทน UDF ใด ๆ ลองวิธีแก้ปัญหาที่ปรับปรุงแล้ว
patkim

1

นี่คือลักษณะที่ผลลัพธ์หลังจากคิดมาทั้งวัน:

ผล

คอลัมน์ผู้ช่วย 4 คอลัมน์ถูกสร้างขึ้นด้วยสูตรอาร์เรย์เซลล์เดียวแต่ละรายการ

เซลล์C1ลดลง:

{=MAX(IF(B1=$K$1:$K$5,$J$1:$J$5))}

เซลล์D1ลดลง:

{=IFERROR(INDEX($I$1:$I$5,MATCH(1,(B1=$K$1:$K$5)*(C1=$J$1:$J$5),0)),"")}

เซลล์E1ลดลง:

{=MAX(IF(A1=$A$1:$A$6,$C$1:$C$6))}

เซลล์F1ลดลง:

{=INDEX($B$1:$B$6,MATCH(1,(A1=$A$1:$A$6)*($C$1:$C$6=E1),0))}

และคำตอบในG1ด้านล่าง:

{=INDEX($D$1:$D$6,MATCH(1,($B$1:$B$6=F2)*($C$1:$C$6=E2),0))}

คงจะดีถ้ามีสิ่งนี้ในคอลัมน์เดียว แต่โอ้ดี ... :)


0

เพื่อนตอนนี้เทินของฉัน

โดยทั่วไปแบบสอบถามคือการหาล่าสุด (ล่าสุด) วันสำหรับรหัส 1, Code2 & Code3, ถ้ามันจะมีค่าการแข่งขันที่สอดคล้องกันเป็นในโคล่า (ตรวจสอบต้นฉบับแบบสอบถามโพสต์)

หมายความว่าทั้งคู่ต้องได้ลิ้มรส ตั้งแต่ Code3 ปรากฏตัวครั้งที่สองครั้งที่ 1 ด้วย A และ B

และอย่างที่ฉันเขียนล่าสุดคือล่าสุดดังนั้นMAX Function ไม่สามารถใช้งานได้ MIN ค้นหาสิ่งล่าสุด

ตรวจสอบภาพหน้าจอ,

ป้อนคำอธิบายรูปภาพที่นี่

สูตรคือ

= IF (D423: D428 = "A", IF (E423: E428 = ({"Code1", "รหัส", "Code3"}), MIN (F423: F428))

แม้แต่สูตรที่ไม่ได้จัดเรียงก็สามารถแก้ไขปัญหานี้ได้

หมายเหตุ:คุณสามารถออกแบบสูตรอีกครั้งโดยใช้ช่วงข้อมูลของคุณ

ฉันโพสต์โซลูชันหลังจากผ่านการทดสอบโดยฉันในกรณีที่แตกต่างโปรดแสดงความคิดเห็น


0

ด้วยการแก้ไขเล็กน้อยฉันนำวิธีแก้ปัญหาซึ่งพบวันที่ล่าสุดเฉพาะภายในพื้นที่ที่ต้องการข้อมูลตัวกรองที่ใช้เกณฑ์คือ A และ Code1, Code2 หรือ Code3

ป้อนคำอธิบายรูปภาพที่นี่

{= MAX (IF (D423: D428 = "A", IF (E423: E428 = {"Code1", "รหัส", "Code3"}, F423: F428, "")))}

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.