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