我设计这个小报告的方式遇到了麻烦。是否可以在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在工作表上没有位置,或者我的语法是否已关闭。
任何帮助将不胜感激! :)
答案 0 :(得分:1)
好问题!不幸的是,我认为您不能将尚未初始化的范围存储到工作表上的现有单元格区域。我可以想到几个选项:
选项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