将命名范围值分配给变量(Excel VBA) - 新手

Posted

技术标签:

【中文标题】将命名范围值分配给变量(Excel VBA) - 新手【英文标题】:Assigning a named Range value to a variable (Excel VBA) - Novice 【发布时间】:2020-04-28 15:24:55 【问题描述】:

我有大约 10 天的 VBA Excel 经验,所以请原谅我的错误/无知。此外,由于我不懂语言,我可能找不到解决方案,因此我的问题没有意义/没有意义。我的查询主要返回“如何在 Excel 中使用 VBA 命名范围”。

我正在构建一个工作簿,其中包含我工作的公司制造的控制部件的测试结果。共有 28 个部分,每个部分有 6 个性能标准。

我正在尝试为每个部分和参数“获取”一个值,以便在条件格式公式中使用:'=rnSource +/- (rnSource*Tolerance)'。

每个零件号都有一个 SN 和 6 个测试点结果 (TP)。我将范围(单个单元格)命名为 SN_TPx(x,为 1、2、3、...6)。这些命名单元格与条件格式目标工作表(其中 28 个,1/SN)位于不同的工作表中。单个工作表包含当前运行测试结果(工作表使用 SN 命名)。当我使用SN_TPx 代替rnSource 时,下面的代码运行良好。

原因:我可以通过修改一个“Dim”来重用代码,而不是复制/过去代码 168 次并在整个代码中更改单元格引用(8 次)。我还有 7 个其他产品线需要应用它。

在我的代码中,我尝试:Dim rnSource As Range,然后使用Set rnSource = SN_TPx 分配SN_TPx to rnSource。这导致:“运行时错误'424':需要对象”

在过去的 12 小时里,我试图在网上找到解决方案,但无济于事。

我尝试过使用 rnSource =SN_TPx.Value - '424' 错误

Range(SN_TPx).Value - 运行时错误“1004”:对象“_Global”的方法“范围”失败

Range("SN_TPx").Value - 代码运行但...我的条件格式公式导致:“单元格值

Worksheet("Sheet3").Range(SN_TPx) - 编译错误:未定义子或函数(工作表)

Worksheets("Sheet3").Range("SN_TPx") - 运行时错误“9”:下标超出范围

我已经尝试了其他我不记得的代码,但我确信有一个简单的解决方案,如果有人熟悉 VBA,我会错过。

代码如下:

Sub TP1_CondFormat_AV()
'***   Attempt to handle ranges (source and target) of CondFormat by setting dims and ranges upfront_
' then execute CondFormat routine for each set of dims and ranges


With ActiveSheet

'** par - define needed variables
Dim r1 As Range
Dim r2 As Range
Dim TP1_Range As Range
Dim TP2_Range As Range

'Dim rnSource As Variant ' fail
'Dim rnSource As Integer ' fail
Dim rnSource As Range
Dim rnTarget As Range
Dim wsSource As Worksheet
Dim wsTarget As Worksheet

'*** par - create a range called "rnTarget" which consists of r1 and r2 ranges
Set r1 = Range("L2:L4")
Set r2 = Range("L7:L1048576")
Set rnTarget = Union(r1, r2)
rnTarget.Name = "TP1"    'Name the rnTarget as "TP1"

Set rnSource = Range(SN_TP1).Value  '== troubleshooting, unable to point rnSource to "SN_TP1" value

End With

rnTarget.FormatConditions.Add Type:=xlCellValue, Operator:=xlLess, _
        Formula1:="=rnSource-(rnSource*Tolerance)"
rnTarget.FormatConditions(rnTarget.FormatConditions.Count).SetFirstPriority
    With rnTarget.FormatConditions(1).Font
        .Bold = True
        .Color = -4165632
        .TintAndShade = 0
    End With
    rnTarget.FormatConditions(1).StopIfTrue = False
    rnTarget.FormatConditions.Add Type:=xlCellValue, Operator:=xlGreater, _
        Formula1:="=rnSource+(rnSource*Tolerance)"
    rnTarget.FormatConditions(rnTarget.FormatConditions.Count).SetFirstPriority
    With rnTarget.FormatConditions(1).Font
        .Bold = True
        .Color = -16776961
        .TintAndShade = 0
    End With
    rnTarget.FormatConditions(1).StopIfTrue = False

    End Sub

感谢您抽出宝贵时间帮助我,

帕维尔

【问题讨论】:

除了@urdearboy 评论,明确分配Range 到一个特定的工作表。并且不要使用ActiveSheet。使用With Worksheets("mySheet") | Set rn Source = .Range("SN_TP1"),例如(管道是行分隔符)。 我建议不要将r2 设置为覆盖每一行。你真的在工作表上的每一行吗?投注实践是将您的代码限制在您的实际范围内。 联合的 r1 和 r2 是为了说明工作表中的一些标题(我不想格式化)。 r2 覆盖每一行的原因是允许在未来几年添加新数据。我还不知道怎么做动态范围 感谢您的快速回复。我很感激 【参考方案1】:

如果您只是想为 Excel 命名范围创建 VBA 范围变量,您只需添加引号。请注意,您应该删除您当前拥有的 .Value,因为它是一个范围的属性(下面是如何访问变量值的示例


Set rnSource = Range("SN_TP1")
'Debug.Print rnSource.Value

【讨论】:

这种方法几乎对我有用。条件格式以一个看起来像“单元格值 这听起来像是一个单独的问题,这不是这个问题的意图。如果您现在可以引用该单元格,那么您的问题已得到解答 很公平,但我试图用一个引用替换 SN_TPx,我可以通过在定义它时更改它来调整每个 TP 和 SN(将 rnSource 作为范围而不是在 Set rnSource 中更改 101_TP1)否则我每个 TP 每个 SN 必须更改 8 次。 听起来你想循环播放什么的?您可能需要修改您的问题,因为这不清楚 简而言之,是的。我几乎没有经验,所以循环似乎仍然遥不可及。边走边学。什么是有效的,但要完全应用它需要大量的查找/替换,而不是健壮或可扩展的。你也对,我的问题可能不清楚......我很难表达我的需要。【参考方案2】:

感谢您的意见@urdearboy 和@Scott Holtzman。您的回答是正确的,并帮助我弄清楚了为什么我提出的方法不起作用。

当我 Set rnSource = .Range("SN_TPx") 它确实将 SN_TPx 值分配给 rnSourceDebug.Print 确认)但是...工作表无法识别 rnSource 名称。因此,条件格式公式将不起作用,因为它包含 Cell < =rnSource-(rnSource*Tolerance)

[CondFormatFail.jpg][1]

这意味着尽管通过更改 SN_TPx 更改了 rnSource 的值,但最终我的整个工作簿将最终得到相同的 rnSource value...最后一个分配给它。

现在我必须将SN_TPx 硬编码到我的条件格式中并应用于适当的范围。随着时间的推移,我会精简它并提高效率。

再次感谢您!

【讨论】:

以上是关于将命名范围值分配给变量(Excel VBA) - 新手的主要内容,如果未能解决你的问题,请参考以下文章

VBA:无法将函数的返回值分配给变量[重复]

使用范围变量时未定义 Excel vba 变量

excel vba复制数据范围,打开新的xlsx文件重命名表并保存

Excel VBA - 将参数参数传递给 Sub

在 VBA Excel 2007 中使用命名范围

Excel公式中的VBA命名范围