excel - 如何从范围创建数组?
问题描述
我正在使用我编写的名为“包含”的函数来确定数据列中的条目是否与预先确定的“可接受”值的字典相匹配。
Sub Validate_Data()
Dim My_Dictionary As Variant
My_Dictionary = Array("Entry1", "Entry2", "Entry3")
Dim Destination As Range
Set Destination = Range("C2:C10")
For Each cell In Destination
cell.FormulaR1C1 = Contains(My_Dictionary, cell)
Next cell
End Sub
如上所述,当我指定数组的元素时,此代码可以正常工作。但是,当我尝试从一系列数据中创建一个数组时,根据这篇文章,我的函数 Contains 不再起作用
Sub Validate_Data()
Dim My_Dictionary As Variant
My_Dictionary = Range("A1:A3").Value
Dim Destination As Range
Set Destination = Range("C2:C10")
For Each cell In Destination
cell.FormulaR1C1 = Contains(My_Dictionary, cell)
Next cell
End Sub
也许它在一个版本中被保存为不同的数据类型而不是另一个?我不知道为什么第一个代码有效而第二个无效,我宁愿能够从工作表中读取数组,也不愿指定代码中的每个元素(它比三个元素长得多)。
解决方案
如上所述,从 a 创建的数组range
是二维的。My_Dictionary(x)
因此,不要像访问元素那样访问My_Dictionary(x, x)
.
要Application.Transpose
在您的列上使用一维数组。
My_Dictionary = Application.Transpose(Range("A1:A3"))
.
旁注
@bigben 是正确的,我立即感到困惑,因为我以为您正在使用Scripting.Dictionary
对象。
我会将该名称更改为类似的名称acceptableValues
或acceptableEntries
使其更清楚它包含的内容。
无论您使用什么名称,我都会从子名称和变量中删除下划线。这在 VBA 中具有特殊含义,并且可能会导致您在路上出错。
推荐阅读
- javascript - svelte:svelte 如何在 if 块之间运行函数?
- c# - 为什么内容没有写入 yaml 文档?
- java - eclipse VM agrs中的“-Ddep-type = local”是什么?
- r - 如何将 mvn 测试的结果放在 R 中的表格中?
- ignite - 在以前的 Apache Ignite 版本中工作的选择在 2.8.0 中不起作用
- react-native - 在这种情况下我应该怎么做?
- mongodb - Mongodb db.serverStatus().storageEngine 未显示
- postgresql - 如何使用 sequelize/postgres 添加嵌套的 JSONB 字段
- ruby-on-rails - rails中的ajax表单提交消息错误
- c++ - 如何检测是否有任何进程阻止 Windows 进入睡眠状态?