【发布时间】: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 覆盖每一行的原因是允许在未来几年添加新数据。我还不知道怎么做动态范围
-
感谢您的快速回复。我很感激
标签: excel vba named-ranges