รับดัชนีของค่าที่เลือกใน Excel แบบเลื่อนลง


1

ฉันมีรายการแบบหล่นลงที่สร้างขึ้นใน Excel จากค่าแถว ฉันต้องการเลือกจากดรอปดาวน์นั้นรับดัชนีของค่านั้นในอาร์เรย์ดร็อปดาวน์จากนั้นใช้ค่านั้นเป็นค่าออฟเซ็ตเพื่อเลือกค่าจากคอลัมน์อื่น

ฉันไม่สามารถหาวิธีง่ายๆในการรับดัชนีของค่าที่เลือกไว้ในรายการแบบหล่นลง

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

คำตอบ:


2

คุณไม่จำเป็นต้องใช้ VBA เพื่อแก้ไขปัญหานี้

  1. กำหนดช่วงที่มีชื่อในสมุดงานสำหรับรายชื่อที่คุณใช้สำหรับการตรวจสอบ (ในกรณีของฉันฉันมี<5, >5และ>10ในเซลล์A2, A3และสำหรับปีของการบริการเพื่อให้ช่วงที่มีชื่อเรียกว่าA4Years_of_service

  2. การตรวจสอบความถูกต้องอยู่ในเซลล์C1โดยใช้ช่วงชื่อที่กำหนดYears_of_serviceสำหรับรายการ

  3. สูตรในเซลล์จะทำงานออกมาชดเชยหรือรายการที่เลือกไว้ในรายการเป็นD1=MATCH(C1,Years_of_service,0)

Mark O'Rafferty


1

Updated

ลองวาง VBA ต่อไปนี้ลงใน "ThisWorkbook" (หากคุณต้องการความช่วยเหลือให้ถามด้วยความเห็น):

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
Dim ValidationIndex As Long
Dim rngTest As Excel.Range

'assumes the data validation is in a cell named "rngTest"
On Error Resume Next
Set rngTest = Sh.Range("rngTest")
If rngTest Is Nothing Then
    Exit Sub
End If
On Error GoTo 0

If Not Intersect(ActiveCell, Sh.Range("rngTest")) Is Nothing Then
    ValidationIndex = GetValidationIndex
    Sheets("Sheet1").Range("E2").Value = ValidationIndex
End If
End Sub

Function GetValidationIndex() As Long
'returns a 1-based index
Dim rngTest As Excel.Range
Dim varValidationString As Variant
Dim ErrNumber As Long
Dim i As Long

With ActiveCell.Validation
    If .Type = xlValidateList Then    '3
        On Error Resume Next
        Set rngTest = ActiveCell.Parent.Range(.Formula1)
        'I do this goofy thing with ErrNumber to keep my indenting and flow pretty
        ErrNumber = Err.Number
        On Error GoTo 0
        'if the Validation is defined as a range
        If ErrNumber = 0 Then
            GetValidationIndex = Application.WorksheetFunction.Match(ActiveCell.Value2, rngTest, 0)
            Exit Function
        'if the validation is defined by comma-separated values
        Else
            varValidationString = Split(.Formula1, ",")
            For i = LBound(varValidationString) To UBound(varValidationString)
                If varValidationString(i) = ActiveCell.Value2 Then
                    GetValidationIndex = i + 1
                    Exit Function
                End If
            Next i
        End If
    End If
End With
End Function

หมายเหตุเล็กน้อย:

  • นี่ถือว่ากล่อง / เซลล์แบบหล่นลงของคุณชื่อ "rngTest" หากไม่เป็นเช่นนั้นให้เปลี่ยนชื่อหรือเปลี่ยนมันตลอดรหัสนี้เป็นชื่อที่มีอยู่
  • บรรทัดที่ 15 กำหนดเซลล์ที่แน่นอนที่ผลลัพธ์ดัชนีจะส่งออก คุณจะต้องเปลี่ยนชื่อชีตและเซลล์ให้ตรงกับของคุณเอง

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


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

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