Хранить атрибуты Range как объект? - PullRequest
2 голосов
/ 31 августа 2009

У меня проблемы с тем, как я разработал этот маленький отчет, который я делаю. Можно ли создать переменную для объекта Range в Excel VBA, чтобы применить форматирование к другому 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

Вот моя функция поля:

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. Мне интересно, если невозможно иметь общий диапазон, который не имеет местоположения на листе, или мой синтаксис каким-то образом отключен.

Любая помощь будет принята с благодарностью! :)

Ответы [ 4 ]

1 голос
/ 10 сентября 2009

Как насчет этого решения?

Создать класс с

  • адрес диапазона в виде текста, т. Е. "$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
1 голос
/ 31 августа 2009

Вы правы - невозможно иметь общий объект Range. Вы должны установить переменную диапазона в некоторый фактический диапазон, чтобы иметь возможность читать и записывать ее свойства.

Но если вы «позволяете» свойству rng, то, похоже, у вас уже есть ссылка на диапазон. Почему у вас есть свойство Let rng, если вы не собираетесь использовать это свойство в операторе Get.

1 голос
/ 31 августа 2009

Можно ли создать переменную для объекта Range в Excel VBA, для цели применения форматирование в другой диапазон?

Мне интересно, не возможно ли иметь общий диапазон, который не имеет местоположение на листе ...

Краткий ответ - нет.

Быстрый ответ ... Я предлагаю создать «форматную» таблицу, которая может быть скрытой или очень скрытой, которая содержит диапазоны или именованные диапазоны с необходимым форматированием. Это позволяет вам диапазон .Copy «форматированный» диапазон, а затем использовать диапазон .PasteSpecial xlPasteFormats.

Мне не нравится перезаписывать буфер обмена пользователя, но сложно программно скопировать форматирование одного диапазона в другой. Я использую этот метод в многочисленных решениях, потому что он гибкий, обслуживаемый, многоразовый и не использует сложный код. Более того, я могу визуально изменить форматирование, не трогая код.

1 голос
/ 31 августа 2009

Хороший вопрос! К сожалению, я не думаю, что вы можете сохранить диапазон, который не был инициализирован для существующего диапазона ячеек на вашем листе. Я могу придумать пару вариантов:

  1. Использование скрытого рабочего листа для хранения информации о диапазоне
  2. Сохранение информации о диапазоне вручную в нескольких переменных-членах

Вариант 1 может быть самым простым, несмотря на то, что лишний лист звучит как излишнее. Я представляю один скрытый лист, определенный специально для этой цели.

Вариант 2 может быть упрощен, если вам нужно отслеживать только несколько свойств диапазона (например, границы и цвет).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...