Excel Macro VBA ไม่ใช่ Instr

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

รหัสต้นฉบับ:

Function Lookup_concat(Search_string As String, _
Search_in_col As Range, Return_val_col As Range)
Dim i As Long
Dim result As String
For i = 1 To Search_in_col.Count
If Search_in_col.Cells(i, 1) = Search_string Then
result = result & " " & Return_val_col.Cells(i, 1).Value
End If
Next
Lookup_concat = Trim(result)
End Function

ฉันได้แก้ไขโค้ดเป็นสิ่งนี้ ฉันเยื้องการแก้ไขแทนที่จะเก็บไว้ในบรรทัดเดียวกันเพื่อให้อ่านง่ายขึ้น

Function Lookup_concat(Search_string As String, _
Search_in_col As Range, Return_val_col As Range)
Dim i As Long
Dim result As String
For i = 1 To Search_in_col.Count
If Search_in_col.Cells(i, 1) = Search_string 
      And Not (InStr(1, result, Return_val_col.Cells(i, 1).Value)) Then
result = result & " " & Return_val_col.Cells(i, 1).Value
End If
Next
Lookup_concat = Trim(result)
End Function

เวอร์ชันนี้ใกล้เคียงกับฟังก์ชัน PHP !strstr มากที่สุด (ที่ฉันเข้าใจ) และบางทีการพยายามใช้เทคนิค PHP กับ VBA ก็เป็นสิ่งที่ฉันคิดผิด ความคิดของฉันคือสตริงผลลัพธ์ถูกกรอกจริง ๆ หลังจากคำสั่ง Instr ของฉัน ซึ่งเป็นสาเหตุที่ทำให้ใช้งานไม่ได้


person JoeP    schedule 28.03.2013    source แหล่งที่มา


คำตอบ (3)


ฉันเชื่อว่าคุณกำลังพยายามใช้ Ifs สองตัว คุณต้องการเพิ่มตามสตริงที่อยู่ในช่วงและเฉพาะในกรณีที่ยังไม่ได้เพิ่มสตริงเท่านั้น

ลองสิ่งนี้:

Function Lookup_concat(Search_string As String, _
Search_in_col As Range, Return_val_col As Range)
   Dim i As Long
   Dim result As String

   For i = 1 To Search_in_col.Count

      If (Instr(1, Search_in_col.Cells(i, 1), Search_string) > 0 )
          And ( InStr(1, result, Return_val_col.Cells(i, 1).Value) = 0 ) Then

         result = result & " " & Return_val_col.Cells(i, 1).Value

      End If

   Next

   Lookup_concat = Trim(result)

End Function
person Motes    schedule 28.03.2013
comment
สมบูรณ์แบบ ขอบคุณ! ขออภัยที่ตอบช้า ฉันไม่ได้ทำงานตั้งแต่สัปดาห์ที่แล้ว - person JoeP; 02.04.2013

มันคือสิ่งที่คุณกำลังมองหา?

Function Lookup_concat(Search_string As String, Search_in_col As Range, Return_val_col As Range)
    Dim i As Long
    Dim result As String
    For i = 1 To Search_in_col.Count
        If InStr(1, Search_in_col.Cells(i, 1).Value, Search_string, vbTextCompare) > 0 Then
            result = result & " " & Return_val_col.Cells(i, 1).Value
        End If
    Next
    Lookup_concat = Trim(result)
End Function
person Community    schedule 28.03.2013

ไม่แน่ใจว่าคุณกำลังทำอะไรกับ Search_in_col และ Return_val_col แต่คุณจำเป็นต้องใช้การทดสอบ If Instr() > 0 อย่างแน่นอน

หากผลลัพธ์ > 1 แสดงว่าคุณไม่จำเป็นต้องดำเนินการใดๆ หากผลลัพธ์เป็น 0 คุณจะต้องทำการต่อข้อมูลของคุณ นั่นคือส่วนที่ฉันไม่แน่ใจว่าทำไมคุณส่ง search_in_col.cells(i,1).Value เป็นพารามิเตอร์การค้นหา แต่จากนั้นต่อด้วย Return_val_col.Cells(i,1).Value ดังนั้นคุณจึงไม่ได้ต่อค่าที่คุณใช้เป็นพารามิเตอร์การค้นหา...

'if the cell's value exists in the search_string
If InStr(1, Search_in_col.Cells(i, 1).Value, search_string, vbBinaryCompare) > 0 Then
    'probably you want to do nothing here, since it's already existing
Else:
    'the cell's value does not exist in the search_string, so concatenate it
    result = result & " " & "whatever value you want to append to the result"
End If
person David Zemens    schedule 28.03.2013
comment
คำอธิบายที่ดี ขอบคุณ. ฉันยอมรับคำตอบเบื้องต้นแล้ว แต่สิ่งนี้มีประโยชน์มากอย่างแน่นอน - person JoeP; 02.04.2013