Вопрос о надстройках VBA - PullRequest
1 голос
/ 08 сентября 2011

У меня проблема с надстройкой VBA в Excel 2010.

Я создал некоторый код для анализа моих данных Excel.который я превратил в Надстройку.

Однако, когда я загружаю Надстройку и запускаю, возникает ошибка.

Сообщение об ошибке гласит: runtime error 91 object variable or With block variable not set

Ошибка указывает на rowSize = ActiveSheet.Rows.Count.

Кто-нибудь знает, как исправить эту ошибку?

Вот код,

Private Sub Workbook_Open()

Dim counter As Long
Dim rowSize As Long
Dim userId As String
Dim answers As String
Dim vals As String

Dim i As Integer

rowSize = ActiveSheet.Rows.Count
counter = 1



'Create Column

ActiveSheet.Cells(1, 7).Value = "Country"
ActiveSheet.Cells(1, 8).Value = "State"
ActiveSheet.Cells(1, 9).Value = "Age"

ActiveSheet.Cells(1, 7).Font.Bold = True
ActiveSheet.Cells(1, 8).Font.Bold = True
ActiveSheet.Cells(1, 9).Font.Bold = True

ActiveSheet.Cells(1, 7).HorizontalAlignment = xlCenter
ActiveSheet.Cells(1, 8).HorizontalAlignment = xlCenter
ActiveSheet.Cells(1, 9).HorizontalAlignment = xlCenter

ActiveSheet.Cells(1, 7).Borders().LineStyle = xlContinuous
ActiveSheet.Cells(1, 8).Borders().LineStyle = xlContinuous
ActiveSheet.Cells(1, 9).Borders().LineStyle = xlContinuous

'Set Value
Do While counter < rowSize

If ActiveSheet.Cells(counter, 1).Value = Null Then Exit Do
If ActiveSheet.Cells(counter, 4).Value = "3" Then

    userId = ActiveSheet.Cells(counter, 2).Value
    vals = ActiveSheet.Cells(counter, 6).Value
    'MsgBox (vals)

    temp = Split(vals, ",")
    i = 0

    Do While i < 10
        targetCell = counter + i
        If ActiveSheet.Cells(targetCell, 2).Value = userId Then
           ActiveSheet.Cells(targetCell, 7).Value = temp(0)
           ActiveSheet.Cells(targetCell, 8).Value = temp(1)
           ActiveSheet.Cells(targetCell, 9).Value = temp(2)

           ActiveSheet.Cells(targetCell, 7).HorizontalAlignment = xlCenter
           ActiveSheet.Cells(targetCell, 8).HorizontalAlignment = xlCenter
           ActiveSheet.Cells(targetCell, 9).HorizontalAlignment = xlCenter

           ActiveSheet.Cells(targetCell, 7).Borders().LineStyle = xlContinuous
           ActiveSheet.Cells(targetCell, 8).Borders().LineStyle = xlContinuous
           ActiveSheet.Cells(targetCell, 9).Borders().LineStyle = xlContinuous
        End If
        i = i + 1
    Loop
    temp = Null
   'parsing_question_1(vals, userId)
End If

counter = counter + 1
Loop
End Sub

Спасибо!

Ответы [ 2 ]

2 голосов
/ 08 сентября 2011

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

Если вы хотите работать с рабочим листом в надстройке, вам нужно ссылаться на эти листы другим способом. Например, если вы хотите работать с первым листом в надстройке, вы можете использовать код, подобный

Me.Sheets(1).Rows.Count

Ключевое слово Me относится к классу, в котором вы находитесь. В этом случае вы находитесь в модуле ThisWorkbook надстройки, поэтому Me ссылается на объект Workbook, который является надстройкой.

Если вы хотите работать с конкретным листом, которого нет в надстройке, вы можете открыть эту книгу в открытом событии и обратиться к этому листу. Такие как

Dim sh As Worksheet

Set sh = Workbooks.Open("C:\MyPath\MyBook.xls").Sheets(1)

rowSize = sh.Rows.Count

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

Private WithEvents mApp As Application

Public Property Set App(oApp As Application)
    Set mApp = oApp
End Property

Public Property Get App() As Application
    Set App = mApp
End Property

Private Sub mApp_WorkbookOpen(ByVal wb As Workbook)
    FormatWorkbook wb
End Sub

'or to limit which workbook it runs on - in this example based on the path
'but you may use some other condition like the existence of a particular
'custom document property
Private Sub mApp_WorkbookOpen(ByVal wb As Workbook)
    If wb.Path = "\\Server1\mypath" Then
        FormatWorkbook wb
    End If
End Sub

В стандартный модуль введите этот код

Public clsAppEvents As CAppEvents

Sub Auto_Open()

    Set clsAppEvents = New CAppEvents
    Set clsAppEvents.App = Application

End Sub

Sub FormatWorkbook(wb As Workbook)

    Dim sh As Worksheet

    Set sh = wb.Sheets(1)

    'do stuff here

End Sub
2 голосов
/ 08 сентября 2011

Поскольку событие Woorkbook_Open надстройки запускается до открытия первого видимого листа, в этот момент времени активный лист отсутствует, поэтому ActiveSheet не установлено

Как сказал Тим, вам, вероятно, не нужен этот код в событии addin _Open в любом случае

Вот ссылка, которая показывает, как делать события приложения

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