将范围属性存储为对象?

我在devise这个小报告的时候遇到了麻烦。 是否可以在Excel VBA中为Range对象创build一个variables,用于将格式应用到另一个Range? 这是我的例子:

我从Microsoft Scripting Runtime库创build一个字典:

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 

这是我的领域function:

 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 

这个想法是字典中的关键字将成为该字段的行位置。 这样,如果需要对所做的报告进行更改,则唯一需要更改的是字典中特定值的关键字。 我已经成功地存储了标签的价值和价值本身,但我也想存储该范围的格式(粗体,理由,边界等…)。

在rng声明之后,我得到'运行时错误'91':对象variables或者块variables未设置'错误。 我想知道如果它不可能有一个通用的范围,没有在工作表上的位置,或者如果不知何故我的语法是closures的。

任何帮助将不胜感激! 🙂

是否可以在Excel VBA中为Range对象创build一个variables,用于将格式应用到另一个Range?

我想知道如果它不可能有一个通用的范围,没有在工作表上的位置…

最简洁的答案是不。

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

我不喜欢覆盖用户的剪贴板,但很难以编程方式将一个范围的格式复制到另一个范围。 我在许多解决scheme中使用这种方法,因为它灵活,可维护,可重用,而且不依赖于复杂的代码。 此外,我可以在视觉上改变格式而不用触摸代码。

好问题! 不幸的是,我不认为你可以在你的工作表中存储一个尚未初始化为单元格范围的范围。 我可以想到几个选项:

  1. 使用隐藏的工作表来存储范围信息
  2. 将范围信息手动存储在less数成员variables中

选项1可能是最简单的,尽pipe事实上听起来像是有一个额外的表单踢。 我想像一个隐藏的工作表,专门为此目的而定义的。

如果您只需跟踪一些范围属性(例如边框和颜色),选项2可能会被简化。

你是正确的 – 不可能有一个通用的Range对象。 你必须“设置”你的范围variables到一些实际的范围,以便能够读写属性。

但是,如果你“让”你的财产,那么你应该已经有一个范围的参考。 为什么你有一个属性如果你不打算在Get语句中使用该属性,让rng。

这个解决scheme如何?

创build一个类

  • 范围地址作为文本,即。 "$A$3:$A$11,$A$18:$A$24,$D$29"

  • 价值

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

然后你可以通过Range(RangeAdressAsText)创build范围,并使用如下所示

 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