Microsoft visual basic for applications compile error the code in this

В приложениях Visual Basic for Application в Microsoft Office 2010 может возникнуть следующая ошибка: Compile error: The code in this pr...

В приложениях Visual Basic for Application в Microsoft Office 2010 может возникнуть следующая ошибка:

Compile error:
The code in this project must be updated for use on 64-bit systems.
Please review and update Declare statements and then mark them with the PtrSafe attribute.

Проблема известная, описана в базе знаний Microsoft как KB983043. Решается добавлением слова  PtrSafe после слова Declare. Для примера на рисунке было:

Private Declare Function URLDownloadToFile...

стало

Private Declare PtrSafe Function URLDownloadToFile...

Но согласно заметке http://msdn.microsoft.com/en-us/library/gg251723.aspx:

Adding the PtrSafe keyword to a Declare statement only signifies the Declare statement explicitly targets 64-bits, all data types within the statement that need to store 64-bits (including return values and parameters) must still be modified to hold 64-bit quantities using either LongLong for 64-bit integrals or LongPtr for pointers and handles.

потребуется изменение типов: LongLong для хранения любых целых чисел (но в 64-битовом представлении), и LongPtr для указателей и дескрипторов. Теперь заголовок функции выглядит так:

Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" ( _
 ByVal pCaller As LongLong, _
 ByVal szURL As String, _
 ByVal szFileName As String, _
 ByVal dwReserved As LongLong, _
 ByVal lpfnCB As LongLong) As LongLong

Чтобы избежать переделки кода на различных системах, правильно будет написать:

#If Win64 Then
 Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" ( _
  ByVal pCaller As LongLong, _
  ByVal szURL As String, _
  ByVal szFileName As String, _
  ByVal dwReserved As LongLong, _
  ByVal lpfnCB As LongLong) As LongLong
#Else
Private Declare PtrSafe Function URLDownloadToFile Lib "urlmon" Alias "URLDownloadToFileA" ( _
 ByVal pCaller As Long, _
 ByVal szURL As String, _
 ByVal szFileName As String, _
 ByVal dwReserved As Long, _
 ByVal lpfnCB As Long) As Long
#End If

Рекомендую также прочитать http://msdn.microsoft.com/en-us/library/ee691831.aspx.

 

Dalm

Пользователь

Сообщений: 247
Регистрация: 03.07.2020

Доброго времени суток. Как поправить макрос, чтобы он работал и на x64 тоже ?
Что делать — не знаю.

Сейчас выдает ошибку:
The code in this project must be updated for use on 64-bit systems.  Please review and update Declare statements and then mark them with the PtrSafe attribute.

Прикрепленные файлы

  • файл.xls (68.5 КБ)

 

у меня система отказалась его принимать
пишет вирус

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

Dalm

Пользователь

Сообщений: 247
Регистрация: 03.07.2020

#3

26.09.2020 04:31:47

Ясно.
Тогда как заменить строчку кода

Код
Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long

На его 64 битную версию ?

Изменено: Dalm26.09.2020 04:32:32

 

БМВ

Модератор

Сообщений: 20940
Регистрация: 28.12.2016

Excel 2013, 2016

 

New

Пользователь

Сообщений: 4402
Регистрация: 06.01.2013

См. файл

Изменено: New26.09.2020 10:24:30

 

Dalm

Пользователь

Сообщений: 247
Регистрация: 03.07.2020

 

Юрий М

Модератор

Сообщений: 60390
Регистрация: 14.09.2012

Контакты см. в профиле

А разговор о 64 — это про систему или про Офис?

 

New

Пользователь

Сообщений: 4402
Регистрация: 06.01.2013

 

Юрий М

Модератор

Сообщений: 60390
Регистрация: 14.09.2012

Контакты см. в профиле

Я почему спрашиваю —  у меня некий микст: ОС 64, а Офис 32. И макрос работает.

 

sokol92

Пользователь

Сообщений: 4429
Регистрация: 10.09.2017

#10

26.09.2020 15:33:39

Поскольку в теме есть неточности, давайте разберем этот пример. Цель: составить определение функции из сообщения #3 для версий офиса 2010+ (VBA7).
1. Ищем описание функции в файле

Win32API_PtrSafe.TXT

. К сожалению, этой функции там нет.
2. Ищем описание это функции в документации разработчика. Находим

здесь

.
3. Анализируем типы параметров и возвращаемое значение функции. Описание типов, используемых Microsoft в документации, можно найти

здесь

(в дальнейшем — Типы). Итак:

  • параметр Hwnd типа HWND. Согласно Типам, HWND — это HANDLE, а HANDLE — указатель. Для указателей в VBA7 используется LongPtr.
  • параметр crKey типа COLORREF. Согласно Типам это 32-разрядное целое, в VBA  — Long
  • параметр bAlpha типа BYTE. Согласно Типам 1-байтовое целое, в VBA — Byte
  • параметр dwFlags типа DWORD. Согласно Типам 32-разрядное целое, в VBA — Long (практически все параметры с префиксом «dw» имеют тип Long)
  • возвращаемое значение описано как BOOL, согласно типам это int — 32-разрядное целое, в VBA — Long

Теперь составляем описание:

Код
#If VBA7 Then  ' версии MS Officе, начиная с 2010
  Private Declare PtrSafe Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As LongPtr, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
#Else
  Private Declare Function SetLayeredWindowAttributes Lib "user32" (ByVal hWnd As Long, ByVal crKey As Long, ByVal bAlpha As Byte, ByVal dwFlags As Long) As Long
#End If

Если мы все-таки ошиблись в описании какой-либо функции, то выполнение Excel с большой долей вероятности завершится аварийно. Поэтому перед выполнением сохраняем все данные.

Изменено: sokol9226.09.2020 15:39:34

Владимир

 

Dalm

Пользователь

Сообщений: 247
Регистрация: 03.07.2020

 

У меня тоже не работают макросы на 64 бит, помогите пожалуйста

 

sokol92

Пользователь

Сообщений: 4429
Регистрация: 10.09.2017

Проект Вашего файла защищен паролем.

 
 

New

Пользователь

Сообщений: 4402
Регистрация: 06.01.2013

#15

23.08.2022 16:57:55

Abu Balikbayev, надо вот эти 2 строки в модуле ClearToData

Код
Private Declare Function mciExecute Lib "user32" "winmm.dll" (ByVal lpstrCommand As String) As Long
Declare Function beep Lib "user32" "kernel32" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long

заменить на вот эти

Код
Declare PtrSafe Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
Declare PtrSafe Function beep Lib "kernel32" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long

Изменено: New23.08.2022 16:59:55

 

RAN

Пользователь

Сообщений: 7081
Регистрация: 21.12.2012

#16

23.08.2022 17:46:16

Цитата
New написал:
надо вот эти 2 строки в модуле заменить на вот эти

Точно заменить? Или все-же в блок If засунуть?

 

New

Пользователь

Сообщений: 4402
Регистрация: 06.01.2013

#17

23.08.2022 17:53:30

ну, в 12-м сообщении написано, что макрос не работает, значит у Abu система 64-битная, поэтому ему можно просто заменить. А если у кого-то ещё осталась 32-битная система, то

Код
#If Win64 Then
    Declare PtrSafe Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
    Declare PtrSafe Function beep Lib "kernel32" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
#Else
    Declare Function mciExecute Lib "user32" "winmm.dll" (ByVal lpstrCommand As String) As Long
    Declare Function beep Lib "user32" "kernel32" Alias "Beep" (ByVal dwFreq As Long, ByVal dwDuration As Long) As Long
#End If

Изменено: New23.08.2022 17:57:31

 

sokol92

Пользователь

Сообщений: 4429
Регистрация: 10.09.2017

#18

23.08.2022 17:56:02

Цитата
New написал:
кого-то ещё осталась 32-битная система

Точнее, версия MS Office 2007 или более старая.

Владимир

 

New

Пользователь

Сообщений: 4402
Регистрация: 06.01.2013

изменил на #If Win64 Then. Всё равно, не знаю, кто сейчас работает на 32-битных машинах

Изменено: New23.08.2022 17:58:54

 

sokol92

Пользователь

Сообщений: 4429
Регистрация: 10.09.2017

На 32-разрядных MS Windows мало кто работает, а на 32-разрядных MS Office — многие.

Изменено: sokol9223.08.2022 18:13:41

 

Abu Balikbayev

Пользователь

Сообщений: 3
Регистрация: 22.08.2022

#21

24.08.2022 04:48:39

Цитата
написал:
Abu Balikbayev, надо вот эти 2 строки в модуле ClearToData

Код
    [URL=#]?[/URL]       1  2      Private   Declare   Function   mciExecute   Lib   "user32"   "winmm.dll"   (  ByVal   lpstrCommand   As   String  )   As   Long    Declare   Function   beep   Lib   "user32"   "kernel32"   Alias   "Beep"   (  ByVal   dwFreq   As   Long  ,   ByVal   dwDuration   As   Long  )   As   Long   

 
заменить на вот эти

Код
    [URL=#]?[/URL]       1  2      Declare   PtrSafe   Function   mciExecute   Lib   "winmm.dll"   (  ByVal   lpstrCommand   As   String  )   As   Long    Declare   PtrSafe   Function   beep   Lib   "kernel32"   Alias   "Beep"   (  ByVal   dwFreq   As   Long  ,   ByVal   dwDuration   As   Long  )   As   Long   

 

Как раз с помощью этого форума я решил эту проблему. А там еще до хрена ошибок на других макросах…

Изменено: Abu Balikbayev24.08.2022 04:49:33

In Excel 2016 I am trying to use the «move and click mouse» macro listed in the below link that simulates mouse click actions in Excel via VBA.
Link: https://excelhelphq.com/how-to-move-and-click-the-mouse-in-vba/

However, after pasting this code in to VBA the first two lines of code are highlighted in red font with an error window popping up with the following message:
Error Window:

Microsoft Vidual Basic Applications

Compile error:

The code in this project must be updated to use on 64-bit systems. Please review and update Declare statements and then mark them with the PtrSafe attribute.

Code lines highlighted in red:

Code:

Public Declare Function SetCursorPos Lib "user32.dll" (ByVal x As Long, ByVal y As Long) As Long
Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)

For reference, the complete macro code is listed below:

Code:

Public Declare Function SetCursorPos Lib "user32" (ByVal x As Long, ByVal y As Long) As Long
Public Declare Sub mouse_event Lib "user32" (ByVal dwFlags As Long, ByVal dx As Long, ByVal dy As Long, ByVal cButtons As Long, ByVal dwExtraInfo As Long)
Public Const MOUSEEVENTF_LEFTDOWN = &H2
Public Const MOUSEEVENTF_LEFTUP = &H4
Public Const MOUSEEVENTF_RIGHTDOWN As Long = &H8
Public Const MOUSEEVENTF_RIGHTUP As Long = &H10

Private Sub SingleClick()
  SetCursorPos 100, 100 'x and y position
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub

Private Sub DoubleClick()
  'Double click as a quick series of two clicks
  SetCursorPos 100, 100 'x and y position
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_LEFTUP, 0, 0, 0, 0
End Sub

Private Sub RightClick()
  'Right click
  SetCursorPos 200, 200 'x and y position
  mouse_event MOUSEEVENTF_RIGHTDOWN, 0, 0, 0, 0
  mouse_event MOUSEEVENTF_RIGHTUP, 0, 0, 0, 0
End Sub

For reference, I am running Excel 2016 on Windows 10 (64-bit).

How would I correct the above code, so that it works?

  • #1

Доброго времени суток, есть макрос написанный на visual basic в таблице эксель.
На одном из компьютеров макрос отказывается работать выдавая ошибку:

Код:

Compile error:
The code in this project must be updated for use on 64-bit systems.
Please rewiew and update Declare statements and then mark them with the PtrSafe attribute.

Я не очень в этом разбираюсь но подозреваю что дело в разрядности ms office или ms windows.
Подскажите как быть и что делать? Может какую то dll надо подрубить?

Surf_rider


  • #2

Так в итоге то где работает и где не работает?

Surf_rider


  • #4

Установлен наверняка 64 разрядный офис. Какая винда? Давайте конкретнее как то..
Товарищи там же написано — добавьте атрибут PtrSafe
Ну и код vb скрипта было бы не плохо…

UEF

UEF

Модератор

Команда форума


  • #6

Попробуйте в таком формате, вставьте PtrSafe как вам посоветовали выше..

Код:

Private Declare PtrSafe Function CoCreateGuid Lib "OLE64.DLL" _

Понравилась статья? Поделить с друзьями:
  • Microsoft visual basic compile error can t find project or library
  • Microsoft visual c runtime library runtime error this application has requested the runtime
  • Microsoft visual c runtime library runtime error r6002 floating point support not loaded
  • Microsoft visual c runtime library runtime error program c r6025 pure virtual function call ок
  • Microsoft vbscript runtime error invalid procedure call or argument