Добавить свойство в существующий класс VBA - PullRequest
1 голос
/ 12 ноября 2008

Я хотел бы сделать что-то вроде добавления свойства nice-to-Excel-functions Name в класс WorkBook. Есть ли хороший способ сделать это?

Более подробная проблема: в VBA вы можете назначить формулу для диапазона в листе Excel. Я хочу сделать это, и я хочу, чтобы моя формула ссылалась на вторую рабочую книгу, которая в моем коде называется объектом wb. Затем я использую wb.Name при назначении формулы для диапазона.

Проблема возникает, когда в wb.Name есть одиночная кавычка. Тогда вы получите что-то вроде этого:

=MONTH('[Ryan's WB]Sheet1'A1)

в электронной таблице, что приводит к сбою, поскольку одинарная кавычка в имени книги соответствует первой одинарной кавычке.

То, что я хотел бы, это свойство FunName для класса WorkBook, которое заменяет все одинарные кавычки в свойстве Name на две одинарные кавычки и возвращает их. Тогда приведенная выше формула будет выглядеть как

=MONTH('[Ryan''s WB]Sheet1'A1)

Ответы [ 4 ]

3 голосов
/ 20 декабря 2008

Вам не нужно создавать отдельный класс для расширения класса рабочей книги. Вы можете добавить свойства к существующему модулю класса ThisWorkbook, например:

Public Property Get FunName() As String

    FunName = Replace(Me.Name, "'", "''")

End Property

Затем вы звоните ThisWorkbook.FunName, чтобы получить ваше вычищенное имя. Однако этот код должен присутствовать в рабочей книге под рукой. Если вы хотите, чтобы он работал на любой книге, ваша функция - путь.

1 голос
/ 13 ноября 2008

Окончательный ответ, как представляется, заключается в том, что класс WorkBook можно расширить, включив в него свойство имени, подходящее для формул Excel. Это можно сделать с помощью метода, предоставленного dbb. Однако, поскольку VBA не поддерживает наследование, объекты расширенного класса будут иметь только те свойства, которые вы для них определили.

Следовательно, имеет смысл использовать функцию. Вот что я собираюсь использовать:

Function FormulaWorkName(ByVal aName As String) As String
    FormulaWorkName = Replace(aName, "'", "''")
End Function

Что я буду применять как к именам листов, так и к именам книг.

1 голос
/ 12 ноября 2008

Просто сделайте замену, чтобы удвоить одинарные кавычки

WorksheetName = Replace(WB.Name, "'", "''")
0 голосов
/ 13 ноября 2008

Вам нужен класс, который расширяет объект Workbook. Вставьте модуль класса, затем попробуйте следующий код

Dim WithEvents WB As Workbook

Public Sub SetWB(W As Workbook)
  Set WB = W
End Sub

Public Property Get FunName() As String
  FunName = Replace(WB.Name, "'", "''")
End Property

Private Sub WB_SheetCalculate(ByVal Sh As Object)
  'this runs when WB calculates
End Sub

'используйте это так

Dim WB As New wbClass
WB.SetWB ActiveWorkbook
CleanedName = WB.FunName

Обратите внимание, что в качестве бонуса я поместил WithEvents в строку, которая Dims WB вверху класса. Это позволяет вам отследить все события, которые происходят с WB, и я включил событие Calculate в качестве демонстрационной версии выше. Если вы находитесь в коде класса и щелкаете раскрывающийся список объектов в верхнем левом углу панели кода, вы увидите объект WB, а если щелкнуть по нему, в правом списке появится все события на выбор. 1007 *

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