Каковы различия между VBA 6.0 и VBA 7.0?

39

Я заметил, что Office 2010 поставляется с Visual Basic для приложений 7.0. Однако я не могу найти много документации о том, какие изменения были внесены. Кто-нибудь имеет сводку изменений или любые ресурсы, описывающие различия?

Теги:
ms-office
office-2010

4 ответа

38
Лучший ответ

Там не так много, что изменилось между VBA6 и VBA7. VBA7 был представлен для поддержки 64-разрядных версий Office и Windows (см. Ниже, что это за различия). Вот ключевые изменения:

  • 64-разрядная поддержка, в первую очередь для API звонки. Это также используется для того, чтобы ваш код работал с вашей версией OS/Office, а также с другими (т.е. Кто-то из Office 2003/WinXP).

    • Если вы используете 64-битную версию Windows, но находятся на 32-битной версии Office, вы можете объявлять вызовы API как показано ниже. .

      #If Win64 Then
          Declare PtrSafe Function GetTickCount64 Lib "kernel32"() As LongLong
      #Else
          Declare PtrSafe Function GetTickCount Lib "kernel32" () As Long
      #End If
    • Если вы используете 64-битную версию Windows, и находятся на 64-битной версии Office, вы можете объявлять вызовы API как: .

      #If VBA7 Then
         Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" ( _
             ByVal lpClassName As String, _
             ByVal lpWindowName As String) As LongPtr
       #Else
         Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal _
             lpClassName As String, ByVal lpWindowName As String) As Long
      #End If
  • Чтобы поддержать это, есть:

    • Три новых ключевых слова (2 типа данных и 1): LongPtr, LongLong и PtrSafe

    • Одна новая функция: CLngLng() (т. Int64)

    • Новые константы компиляции, используемые выше: VBA7 и Win64

  • 7
    @Todd Я просто хочу отметить, что LongPtr - это псевдоним, который указывает на правильный тип данных при использовании 64-битного или 32-битного слова. Таким образом, LongPtr будет указывать на LongLong в 64-битном офисе и Long на 32-битном офисе. Приведенное ниже заявление будет работать как на 32-х, так и на 64-х битных офисах. Объявить функцию PtrSafe GetTickCount Lib "kernel32" () как LongPtr
  • 0
    @ Сайлер, это хороший момент. Я еще не проверял, но имеет смысл то, что вы сказали.
9

В этой статье в MSDN есть больше об изменениях в VBA 7 для Office 2010:

http://msdn.microsoft.com/en-us/library/ee691831(loband).aspx#odc_office2010_Compatibility32bit64bit_IntroducingVBA7CodeBase

  • 6
    Хотя эта ссылка может ответить на вопрос, лучше включить здесь основные части ответа и предоставить ссылку для справки. Ответы, содержащие только ссылки, могут стать недействительными в случае изменения связанной страницы.
  • 2
    Вы, конечно, правы, но помните, что это был ответ с относительно ранних дней SO, прежде чем такие соглашения были действительно кодифицированы. Подумайте, принятый ответ, и этот в значительной степени охватывает вещи :)
Показать ещё 2 комментария
5

VBA7 совместим с 64-разрядными версиями Office.

0

Есть и другие изменения... У меня есть пользователи в полевом отчете, что код, который правильно функционировал в 2007 году, больше не работает и показывает ошибки.

Пример: это работает в VBA6 (Excel 2007)

PRINT STRING$(80,"=")
mynewdata = MID$(mydata, 15,4)

Он печатает строку, состоящую из символов =, как визуальный разрыв, затем смотрит mydata​​strong > , перескакивает символы 15 и получает 4 из них, результат сохраняется в mynewdata​​strong > . Он не работает в VBA7 (Excel 2010).

Я нашел потенциальное обходное решение...

PRINT VBA.STRING$(80,"=")
mynewdata = VBA.MID$(mydata, 15,4)

ИЛИ

PRINT VBA.STRING(80,"=")
mynewdata = VBA.MID(mydata, 15,4)

Полный список изменений по-прежнему будет полезен... и/или файловый конвертер.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню