数据验证参考提供值且未关联列表值 - VBA 参考错误

问题描述 投票:0回答:1

我的代码的数据验证部分中的间接公式似乎遇到了相对引用问题。

我正在尝试创建一个宏,该宏将使用“列表!”中的数据验证列表自动更新和格式化某些单元格。每次“输入!”A1 中的值发生变化时。 参考图片在这里

我下面的代码可以很好地填充和格式化“列表!”中必要的数据验证单元格,但是,数据验证列表由 A 列中单元格的奇异值组成,而不是由共享相同值的关联表格项组成名称为 A 列中的单元格。

例如。以图片为例,

  • Scientific_Name 将有 3 个从名为“Scientific_Name”(Deus、ex、machina)的表派生的选项,而不是值“Scientific_Name”
  • Fabric 将有 2 个从名为“Fabric”的表派生的选项(是、否)

下面是我的代码:

子更新数据验证() 调暗 ws1 作为工作表,ws2 作为工作表 将 inputVal 调暗为字符串 将 i 调暗为整数 暗淡提示作为变体 昏暗的验证单元作为变体

Set ws1 = ThisWorkbook.Sheets("Input")
Set ws2 = ThisWorkbook.Sheets("Lists")
inputVal = ws1.Range("A1").Value

' Clear existing content and data validations
ws2.Cells.ClearContents
ws2.Cells.Validation.Delete

' Define input prompts and cells for data validation
Select Case inputVal
    Case "Brown"
        prompts = Array("Name", "Scientific_Name", "Gender", "Species", "Count", _
                        "Favorite_Food", "Favorite_Color", "Favorite_Sport", "Favorite_Drink", "Date", "Option_1", "Option_2")
        validationCells = Array("B1", "B2", "B5", "B7")
    Case "Orange"
        prompts = Array("Color", "Fabric", "Style", "Quantity", "Length", "Width", "Area", _
                        "Supplier", "Location", "Distance")
        validationCells = Array("B2", "B4", "B6", "B8", "B12")
    Case Else
        prompts = Array()
        validationCells = Array()
End Select

' Populate input prompts
For i = LBound(prompts) To UBound(prompts)
    ws2.Cells(i + 1, 1).Value = prompts(i)
Next i

' Set up data validation
For i = LBound(validationCells) To UBound(validationCells)
    With ws2.Range(validationCells(i)).Validation
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=INDIRECT(""A"" & ROW())"
        .IgnoreBlank = True
        .InCellDropdown = True
        .ShowInput = True
        .ShowError = True
    End With
Next i

结束子

我希望使用间接(A1),这在创建具有更多选项的下拉列表方面起到了部分作用。但是,为数据验证而格式化的每个单元格共享相同的下拉列表。

我对 VBA 非常陌生,根据我对 Excel 的了解,这似乎是一个相对参考问题。

我了解间接下拉列表的工作原理,并已将每个表正确格式化为其关联值。当您在 VBA 中添加时,这只是一个全新的图层。

编辑 ******

在进行了更多研究并了解了有关 VBA 的更多信息之后,我认为最好的选择是以某种方式利用数据验证单元格的范围,并从列值中减去 1。我将进一步研究如何做到这一点,但我认为这就是答案。

excel vba validation reference
1个回答
0
投票

由于

INDIRECT
必须知道从哪个表获取数据,请将这些步骤应用于您的工作表

  • 将所有表格命名为表格的
    Header
    (A,B,CC ...)
  • 应用于单元格 D3(第一个下拉列表)进行数据验证:
    =INDIRECT(C3&"["&C3&"]")
  • 向下拖动D3直到最后。

VBA 代码将定义列

C
的实际值。如果需要,您也可以在代码中动态分配单元格的验证公式。

enter image description here

© www.soinside.com 2019 - 2024. All rights reserved.