代码之家  ›  专栏  ›  技术社区  ›  mandroid

将范围属性存储为对象?

  •  2
  • mandroid  · 技术社区  · 15 年前

    我设计这个小报告的方式有问题。是否可以在Excel VBA中为范围对象创建变量,以便将格式应用于其他范围?以下是我的例子:

    我正在从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
    

    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:“对象变量或With block variable not set”错误。我想知道是否不可能有一个在工作表上没有位置的通用范围,或者我的语法是否有问题。

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

    4 回复  |  直到 15 年前
        1
  •  1
  •   James Eichele Bernard Igiri    15 年前

    好问题!不幸的是,我认为您无法在工作表中存储尚未初始化为现有单元格范围的区域。我可以想出几个选择:

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

    选项1可能是最简单的,尽管有一张额外的床单四处走动听起来有点过头了。我正在描绘一个隐藏的工作表,专门为此目的定义。

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

        2
  •  1
  •   Dick Kusleika    15 年前

    您是正确的-不可能有通用范围对象。您必须将范围变量“设置”为某个实际范围,以便能够读取和写入其属性。

    但是,如果您要“出租”您的rng属性,那么您似乎已经有了对某个范围的引用。如果不打算在Get语句中使用属性Let rng,为什么要使用该属性呢。

        3
  •  1
  •   AMissico    15 年前

    例如,是否可以在Excel VBA中为范围对象创建变量 适用

    我想知道是否不可能有一个通用的范围,而没有

    简而言之,答案是否定的。

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

        4
  •  1
  •   Siddharth Rout    13 年前

    这个解决方案怎么样?

    创建一个具有

    • 范围地址为文本,即。 "$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
    
    推荐文章