我有一列使用預定義集(下拉列表)中的值,使用以下方法實現數據驗證。現在如果我更改清單中的某些值,下拉式選單(開啟時)將立即提供這個新值。然而,該表不會自動更新自身,這意味著該列中的某些值將無效,直到我手動修復它們。
我已經看到基於巨集/VBA 的解決方案,但是沒有直接在 Excel UI 中的一些聰明的方法嗎?
答案1
正如我在評論中提到的,唯一的方法是使用 VBA。
這是一種選擇。我在整個程式碼中添加了註釋。這假設您正在使用名為「List」的驗證清單的命名範圍,並且它與正在驗證的儲存格位於相同工作表上。
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim cell As Range
Dim isect As Range
Dim vOldValue As Variant, vNewValue As Variant
Set isect = Application.Intersect(Target, ThisWorkbook.Names("List").RefersToRange)
If Not isect Is Nothing Then
' Get previous value of this cell
Application.EnableEvents = False
With Target
vNewValue = .Value
Application.Undo
vOldValue = .Value
.Value = vNewValue
End With
' For every cell with validation
For Each cell In Me.UsedRange.SpecialCells(xlCellTypeAllValidation)
With cell
' If it has list validation AND the validation formula matches AND the value is the old value
If .Validation.Type = 3 And .Validation.Formula1 = "=List" And .Value = vOldValue Then
' Change the cell value
cell.Value = vNewValue
End If
End With
Next cell
Application.EnableEvents = True
End If
End Sub
您也可以下載電子表格範例我把它放在一起測試一下。 (包含巨集!)
答案2
但是直接在 Excel UI 中不是有一些巧妙的方法嗎?
我想我知道一個 - 至少它似乎滿足你的所有要求:
- 你需要設定動態改變命名區域作為資料驗證的來源。這可以使用
OFFSET
函數來實現。假設您在 A 列中有下拉框的值清單Sheet1
(名稱僅對公式重要),單元格A1
具有標題,例如List of values
,且值放置在開始位置A2
和下方,您應該執行以下操作:前往 RibbonFormulas > Name Manager
,建立新區域(讓我們稱之為Items
) 並將其區域設為不指向單元格,而是使用以下公式:=OFFSET(Sheet1!$A$2;0;0;COUNTA(Sheet1!$A:$A)-1;1)
。 - 放數據驗證規則:不要指向清單的儲存格範圍,而是鍵入
=Items
- 因此您的命名區域將用作清單項目來源。 - 由於上述原因,您將收到滿足您所有要求的真正動態清單:您可以自由變更/新增項目到 A 列,這些變更將在您下次使用時立即反映在下拉清單中。同時,舊的價值觀將保持不變。
我在工作中使用這個解決方案大約有 2 年。希望您也會發現它很有用!
PS這是實際的範例文件:動態下拉選單