2009-08-31 82 views
2

我在设计这个我正在制作的小报告时遇到了麻烦。是否可以在Excel VBA中为Range对象创建一个变量,用于将格式应用于另一个Range?这是我的例子:作为对象存储范围属性?

我创建从Microsoft脚本运行时库的字典:

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 

这里是我的现场功能:

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':对象变量或块变量未设置'错误紧接在rng声明之后的行上。我想知道如果它不可能有一个通用的范围,没有在工作表上的位置,或者如果不知何故我的语法关闭。

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

回答

1

是否有可能建立在Excel VBA的Range对象的变量,用于 应用 格式到另一种范围的目的是什么?

我想知道如果它不可能有没有 在纸张上的位置的通用范围...

简短的答案是否定的。

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

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

+0

哦,伙计,这是一个伟大的答案,我唯一的问题是我通过Access VBA所以我outputing报告不能嵌入像这样的隐藏表格。 – mandroid 2009-08-31 19:00:53

1

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

  1. 使用隐藏的工作表手动存储的范围信息
  2. 商店的范围内的信息,在成员变量的少数

选项1可能是最简单的方式,尽管事实上听起来像是多余的纸张踢来踢去。我正在描绘一个专门为此目的定义的隐藏工作表。

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

1

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

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

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