สมการการค้นหาอ้างอิง VBA

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

Dim qty as worksheet
Dim Imonth as integer, IImonth as integer
Dim lrow as long

With summary1
.Range("B3:B" & lrow).Formula =   Application.Iferror(Application.Index(qty.Columns(Imonth), Application.Match(.Range("A3:A" & lrow), qty.Columns(1), 0)) - Application.Index(qty.Columns(IImonth), Application.Match(.Range("A3:A" & lrow), qty.Columns(1), 0)), " ")

person krish86    schedule 15.03.2018    source แหล่งที่มา
comment
เพราะไม่เหมือนกับสูตรบนแผ่นงานเมื่อมีข้อผิดพลาดเกิดขึ้นใน vba มันจะหยุด ดังนั้นเมื่อไม่พบการจับคู่ ข้อผิดพลาดจะถูกส่งผ่านไปยัง INDEX และ INDEX ไม่รู้ว่าจะทำอย่างไรกับมัน ดังนั้นจึงส่งข้อผิดพลาดนั้นออกมา คุณต้องแยกโค้ดออกจากกันและทดสอบข้อผิดพลาดแยกกันก่อนที่จะส่งผ่านไปยัง INDEX   -  person Scott Craner    schedule 16.03.2018
comment
ดู: stackoverflow.com/ คำถาม/49283620/   -  person Scott Craner    schedule 16.03.2018
comment
คุณต้องการค่าหรือคุณต้องการสูตรในเซลล์นั้น   -  person Scott Craner    schedule 16.03.2018
comment
ฉันต้องการให้คำนวณค่าภายในแต่ละเซลล์ในช่วง ไม่ใช่สูตร ฉันรู้ว่าสามารถทำได้ด้วย FormulaR1C1 แต่จะทำให้โปรแกรมทำงานช้ามากเนื่องจากมีการอัปเดตสูตรอยู่ตลอดเวลา   -  person krish86    schedule 16.03.2018
comment
จากนั้นคุณจะต้องวนซ้ำแต่ละเซลล์และกำหนดค่าจากโค้ด คุณจะต้องการดูลิงค์ที่ฉันให้ไว้   -  person Scott Craner    schedule 16.03.2018
comment
ฉันรันแต่ละส่วนแยกกันและไม่พบข้อผิดพลาด หากฉันเรียกใช้การค้นหาข้อมูลอ้างอิงทางด้านซ้ายของสมการ ก็จะได้ค่าที่ถูกต้อง หากฉันเรียกใช้การค้นหาข้อมูลอ้างอิงทางด้านขวา ก็จะนำค่าที่ถูกต้องมาด้วย มันจะไม่คำนวณความแตกต่างระหว่างสองค่านี้   -  person krish86    schedule 16.03.2018
comment
คุณไม่สามารถป้อนค่าแต่ละค่าลงในช่วงมวลได้ คุณจะต้องวนซ้ำ   -  person Scott Craner    schedule 16.03.2018
comment
คุณเพิ่งให้แนวคิดกับฉันเกี่ยวกับการใช้ลูป ฉันสามารถเรียกใช้การค้นหาข้อมูลอ้างอิงครั้งแรก จากนั้นวนกลับ โดยรับผลต่างของค่าแรกจากค่าอ้างอิงที่สอง ขอบคุณ!   -  person krish86    schedule 16.03.2018
comment
มันจะเร็วขึ้นถ้าคุณดึงการจับคู่ออกมาแยกกันและกำหนดให้กับตัวแปร จากนั้นใช้ .Cells() แทน INDEX   -  person Scott Craner    schedule 16.03.2018
comment
คุณช่วยยกตัวอย่างสั้นๆ เพื่อให้ฉันเข้าใจข้อเสนอแนะของคุณดีขึ้นได้ไหม   -  person krish86    schedule 16.03.2018


คำตอบ (1)


ฉันจะโหลดทั้งหมดลงในอาร์เรย์หน่วยความจำแล้ววนซ้ำ

Sub kjlk()


Dim qty As Worksheet
Dim Imonth As Integer, IImonth As Integer
Dim lrow As Long
Dim summary1 As Worksheet

'assign the variables
Set qty = Worksheets("Sheet1")
Set summary1 = Worksheets("Sheet2")

Imonth = 20
IImonth = 21

lrow = 20

Dim IMArr As Variant
Dim IIMarr As Variant
Dim lkupArr As Variant

IMArr = Intersect(qty.Columns(Imonth), qty.UsedRange).Value
IIMarr = Intersect(qty.Columns(IImonth), qty.UsedRange).Value
lkupArr = Intersect(qty.Columns(1), qty.UsedRange).Value

Dim InArr As Variant
Dim OutArr As Variant



With summary1
    InArr = .Range("A3:A" & lrow).Value
    ReDim OutArr(1 To UBound(InArr, 1), 1 To 1)
    Dim i As Long
    For i = 1 To UBound(InArr, 1)
        Dim mtch As Long
        mtch = WhereContains(lkupArr, InArr(i, 1))
        If mtch > -1 Then
            OutArr(i, 1) = IMArr(mtch, 1) - IIMarr(mtch, 1)
        Else
            OutArr(i, 1) = vbNullString
        End If
    Next i
   .Range("B3:B" & lrow).Value= OutArr
End With
End Sub

Function WhereContains(arr, v) As Long
Dim rv As Long, i As Long
    rv = -1
    For i = LBound(arr) To UBound(arr)
        If arr(i, 1) = v Then
            rv = i
            Exit For
        End If
    Next i
    WhereContains = rv
End Function
person Scott Craner    schedule 16.03.2018
comment
ฉันจะลองสิ่งนี้ ขอบคุณสำหรับความช่วยเหลือ บางครั้งการได้คิดเรื่องอื่นก็เป็นเรื่องดี - person krish86; 16.03.2018