我有大约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_TPx
to rnSource
。这导致:“运行时错误'424':需要对象”
在过去的12个小时里,我试图在网上找到解决方案,但无济于事。
使用rnSource =
:424错误提示
运行时错误“1004”:对象“_Global”的方法“Range”失败Range("SN_TPx").Value
-代码运行但...我的条件格式公式导致:“单元格值< rnSource-(rnSourceTolerance)”似乎不返回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
谢谢你抽出宝贵的时间来帮我
帕维尔
2条答案
按热度按时间9rnv2umw1#
如果您只是尝试为Excel命名范围创建VBA范围变量,则只需添加引号即可。请注意,您应该删除您当前拥有的
.Value
,因为它是范围的属性(* 下面是如何访问变量值的示例 *)nsc4cvqm2#
感谢您的输入@urdearboy和@Scott Holtzman。你的回答是正确的,帮助我弄清楚了为什么我提出的方法行不通。
当I
Set rnSource = .Range("SN_TPx")
时,它确实将SN_TPx
值分配给rnSource
(Debug.Print
确认了它),但是...工作表无法识别rnSource
名称。因此,条件格式公式将不起作用,因为它包含Cell < =rnSource-(rnSource*Tolerance)
这意味着,尽管通过更改
SN_TPx
来更改rnSource
值,但最终我的整个工作簿将以相同的rnSource value
......最后一个分配给它的值结束。现在,我必须将
SN_TPx
硬编码到我的条件格式中,并应用到适当的范围。随着时间的推移,我会精简它,使它更有效率。再次感谢您!