Пользовательская форма Office 2010, обрабатывающая страницы в многостраничном элементе управления

#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