#vba #ms-office
#vba #ms-office
Вопрос:
В настоящее время я работаю над переходом с Office 2002 SP3 на Office 2010.
В книге Excel с интенсивным использованием VBA я сталкиваюсь со следующей проблемой:
Следующая функция работает как заклинание в 2002, но вылетает при открытии в 2010.
Private Function fktSeeall()
Dim pPage As Page, cCont As Control, mpMultiPage As Control
If Seeall Then
cbButton2.Caption = "Leere ausblenden"
Else
cbButton2.Caption = "Alle anzeigen"
End If
For Each mpMultiPage In Me.Controls
If TypeName(mpMultiPage) = "MultiPage" Then
For Each pPage In mpMultiPage.Pages
pPage.Visible = Seeall
For Each cCont In pPage.Controls
If TypeName(cCont) = "TextBox" And cCont.Text <> "" Then
pPage.Visible = True
mpMultiPage.Value = Right(pPage.Name, 1) - 1
End If
Next cCont
Next pPage
End If
Next
End Function
Логическое значение Seeall
задается вне функции.
Все страницы содержат одно текстовое поле. Если для параметра seeall установлено значение false, все страницы, кроме тех, которые содержат заполненные текстовые поля, будут скрыты. Если установлено значение true, все страницы отображаются снова.
Ошибка Office 2010 в строке For Each pPage In mpMultiPage.Pages
с кодом сообщения об ошибке 13 «Несоответствие типа»
Это также не удается, если я использую
For Each pPage In MultiPage1.Pages
pPage.Visible = Seeall
For Each cCont In pPage.Controls
If TypeName(cCont) = "TextBox" And cCont.Text <> "" Then
pPage.Visible = True
MultiPage1.Value = Right(pPage.Name, 1) - 1
End If
Next cCont
Next pPage
Я не понимаю, почему новая версия office выходит из строя на этом этапе моего кода.
Это скриншот пользовательской формы:
Комментарии:
1. Я пока не могу понять, почему, но скажите мне, работает ли это, если вы измените
Dim pPage As Page
наDim pPage As Object
Ответ №1:
Хорошо, разобрался!
Начиная с Excel 2007, объектная модель имеет объект под названием Page, который отличается от страницы Forms.
Явно ссылайтесь на свойство страницы формы, используя Dim pPage As msforms.Page
вместо Dim pPage As Page