将Range属性存储为对象?

时间:2009-08-31 14:53:31

标签: excel vba excel-vba

我设计这个小报告的方式遇到了麻烦。是否可以在Excel VBA中为Range对象创建变量,以便将格式应用于另一个Range?这是我的例子:

我正在使用Microsoft Scripting Runtime库创建一个字典:

Dim d as Scripting.Dictionary

通过这个我添加标签,值和(尝试添加)范围。

Dim rng as Range    

rng.Font.Bold = True
d.Add 1, Field("test1", 12345, rng)
rng.Font.Bold = False
d.Add 2, Field("TestTwo", "Testing field", rng)
rng.HorizontalAlignment = xlCenter
d.Add 3, Field("threeeee", 128937912, rng)

Dim key As Variant

For Each key In d.keys
    Range("A" & key).value = d(key).Label
    Set Range("B" & key).value = d(key).rng

Next key

这是我的Field函数:

Private Function Field(Label As String, val As Variant, rng As Range) As cField

    Dim f As New cField
    f.Label = Label
    f.val = val
    Set f.rng = rng
    Set Field = f

End Function

这是我的cField类:

Option Explicit

Dim mVarValue As Variant
Dim mStrLabel As String
Dim mRng As Range

Property Let val(ByVal val As Variant)
    mVarValue = val
End Property

Property Get val() As Variant
    val = mVarValue
End Property

Property Let Label(ByVal val As String)
    mStrLabel = val
End Property

Property Get Label() As String
    Label = mStrLabel
End Property

Property Let rng(ByVal val As Range)
    Set mRng = val
End Property

Property Get rng() As Range
    Dim a As Range
    a.value = mVarValue
    Set rng = a
End Property

这个想法是字典中的键将成为字段的行位置。这样,如果需要对我正在制作的报告进行更改,则唯一需要更改的是字典中该特定值的关键。我已成功存储值的标签和值本身,但我还想存储该范围的格式(粗体,对齐,边框等)。

我得到'运行时错误'91':对象变量或With block变量未在rng声明后面的行上设置'错误。我想知道是否不可能有一个通用的Range在工作表上没有位置,或者我的语法是否已关闭。

任何帮助将不胜感激! :)

4 个答案:

答案 0 :(得分:1)

好问题!不幸的是,我认为您不能将尚未初始化的范围存储到工作表上的现有单元格区域。我可以想到几个选项:

  1. 使用隐藏工作表存储范围信息
  2. 手动存储范围信息,存储在少数成员变量中
  3. 选项1可能是最简单的,尽管事实上有一个额外的工作表可能有点过分。我正在想象一个隐藏的工作表,专门为此目的而定义。

    如果您只需要跟踪几个范围属性(例如边框和颜色),则可以简化选项2.

答案 1 :(得分:1)

你是对的 - 不可能有一个通用的Range对象。您必须将范围变量“设置”到某个实际范围才能读取和写入其属性。

但是如果你是“让”你的rng属性,那么你似乎应该已经有了一个范围的引用。如果你不打算在Get语句中使用该属性,为什么你有一个Property Let rng。

答案 2 :(得分:1)

  

是否可以在Excel VBA中为Range对象创建变量   适用的目的   格式化到另一个范围?

     

我想知道是否有可能没有通用的Range   工作表上的位置......

简短的回答是否定的。

快速回答是......我建议创建一个“格式”工作表,它可以隐藏或隐藏,包含范围或命名范围,具有您需要的格式。这允许您范围 .Copy“格式化”范围,然后使用范围 .PasteSpecial xlPasteFormats

我不喜欢覆盖用户的剪贴板,但很难以编程方式将一个范围的格式复制到另一个范围。我在许多解决方案中使用此方法,因为它灵活,可维护,可重用,并且不依赖于复杂的代码。此外,我可以在不触及代码的情况下直观地更改格式。

答案 3 :(得分:1)

这个解决方案怎么样?

使用

创建一个类
  • 范围地址为文本,即"$A$3:$A$11,$A$18:$A$24,$D$29"

  • 将范围的格式保存为格式文本。

然后你可以按Range(RangeAdressAsText)创建范围并使用类似下面的内容

Private Sub ApplyFormatting(r As Range, ByVal f As String)
On Error GoTo ErrHandler:

f = UCase$(f)
Dim IterateRange As Range
Dim Formatarray() As String
Formatarray = Split(f, " ")
Dim i As Integer

With r
    For i = LBound(Formatarray) To UBound(Formatarray)
        Select Case Formatarray(i)
            Case "BOLD"
                .Font.Bold = True
            Case "ITALIC"
                .Font.Italic = True
            Case "TOP"
                .VerticalAlignment = xlTop
            Case "BOTTOM"
                .VerticalAlignment = xlBottom
            Case "UNDERLINE"
                .Font.Underline = True
        End Select
    Next i
End With

Erase Formatarray

Exit Sub
ErrHandler:
    LogInformation Format(Now, "yyyy-mm-dd hh:mm:ss") & " - " &  ": @ ApplyFormatting in xlPrinter " & " - " & Err.Number & " - " & Err.Description & " - " & Err.Source & " - " & Err.LastDllError

End Sub