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

f87krz0w  于 2023-06-07  发布在  其他
关注(0)|答案(2)|浏览(165)

我有大约10天的VBA Excel经验,所以请原谅我的错误/无知。我也可能找不到解决方案,因为我不懂语言,因此我的问题没有意义/在马克上。我的查询主要返回“如何在Excel中使用VBA命名范围”。
我正在建立一个工作簿,其中包含我工作的公司制造的控制部件的测试结果。共有28个部件,每个部件有6个性能标准。
我正在尝试“抓取”条件格式公式中要使用的每个部分和参数的值:'=rnSource +/-(rnSourceTolerance)'。
每个部件编号都有一个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_TPxto rnSource。这导致:“运行时错误'424':需要对象”
在过去的12个小时里,我试图在网上找到解决方案,但无济于事。
使用rnSource =:424错误提示
运行时错误“1004”:对象“_Global”的方法“Range”失败
Range("SN_TPx").Value-代码运行但...我的条件格式公式导致:“单元格值< rnSource-(rnSource
Tolerance)”似乎不返回SN_TPx的值,而是返回“rnSource”文本(格式化值字体不受影响)
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

谢谢你抽出宝贵的时间来帮我
帕维尔

9rnv2umw

9rnv2umw1#

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

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

nsc4cvqm2#

感谢您的输入@urdearboy和@Scott Holtzman。你的回答是正确的,帮助我弄清楚了为什么我提出的方法行不通。
当I Set rnSource = .Range("SN_TPx")时,它确实将SN_TPx值分配给rnSourceDebug.Print确认了它),但是...工作表无法识别rnSource名称。因此,条件格式公式将不起作用,因为它包含Cell < =rnSource-(rnSource*Tolerance)

[CondFormatFail.jpg][1]

这意味着,尽管通过更改SN_TPx来更改rnSource值,但最终我的整个工作簿将以相同的rnSource value......最后一个分配给它的值结束。
现在,我必须将SN_TPx硬编码到我的条件格式中,并应用到适当的范围。随着时间的推移,我会精简它,使它更有效率。
再次感谢您!

相关问题