2016-04-22 191 views
0

我在Excel VBA中编写了一个相当长的宏。我想使用命名范围,而不是在宏中指定它。此宏旨在用于长期使用。如果范围由另一个用户改变会发生什么?我如何调整我的代码,使我的命名范围可以适应不断变化的职位?使用更改命名范围Excel VBA

回答

2

我(个人)讨厌命名范围。特别是,当您从一个文件复制或粘贴表单/范围到另一个文件时,您总是会遇到死链接或复制到不再工作的命名范围或被重命名(因为它们已经存在于该文件中)。

我对这个解决方案是以下两种之一:

(1)我奉献在VBA某一部分(甚至模块)在全局变量声明我的范围。这与每个子开始处的所有变量的Dim非常相似。

'********************************************************* 
'** Declaring all ranges and where to find which data 
'********************************************************* 

Dim rngNamedRangeName As Range 

Sub SetupAllGlobalVariables() 

Set rngNamedRangeName = ThisWorkbook.Worksheets(1).Range("A1:C10") 

End Sub 

'********************************************************* 
'** After that all your normal subs follow and whenever 
'** necessary you can call the above to get your ranges 
'********************************************************* 

Sub ExampleCodeToFormatYourRanges() 

Call SetupAllGlobalVariables 

With rngNamedRangeName 
    .Interior.ColorIndex = 36 
End With 

End Sub 

(2)然而,我的优选的第二解决方案是有一个单独的very hidden片,其中我参考/链接的所有范围再次(这是很重要的我)。所以,基本上,我在这张单独的表格中再次显示所有“重要”数据。这将是你的命名范围。但是没有人允许触摸这张表格(这就是为什么它隐藏起来的原因)。如果您的任何范围被移动或改变,那么很容易重新链接此隐藏表上的范围与其他表。然而,在隐藏表单上,所有数据仍处于同一位置,并允许您对VBA中的所有范围进行硬编码(仅从隐藏表中获取)。

即使非VBA程序员通常可以用第二种方法修复这些问题。用第一种方法,你可能总是需要有VBA技能的人来修复它。

请注意,上述不是唯一的解决方案,也不是最好的解决方案。但我可以肯定地说,即使对于大公司来说,这已经被证明是一个可用的解决方案。

+0

感谢您的回复。但是,第二种解决方案可能会牺牲多用户的可用性以及宏和电子表格的可移植性。当你隐藏电子表格时,它最终会飘浮在内存之外。 – Dombey

+0

在某些时候,你必须告诉VBA在哪里找到数据,直到你不把它放在结构化数据库服务器(SQL)上,你必须在某处某处对引用进行硬编码。所以,现在你有三种选择,你可以评估它们并且尽可能多地尝试它们。我(亲自)已经这么做了很长时间,并得出了上述结论。然而,不同的设置/参数可能导致不同的结论。所以,尽情地尝试一下并比较它们。可能有人甚至可以添加另一个切实可行的解决方案。 – Ralph