В приложениях 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 |
Доброго времени суток. Как поправить макрос, чтобы он работал и на x64 тоже ? Сейчас выдает ошибку: Прикрепленные файлы
|
у меня система отказалась его принимать Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете! |
|
Dalm Пользователь Сообщений: 247 |
#3 26.09.2020 04:31:47 Ясно.
На его 64 битную версию ? Изменено: Dalm — 26.09.2020 04:32:32 |
||
БМВ Модератор Сообщений: 20940 Excel 2013, 2016 |
|
New Пользователь Сообщений: 4402 |
См. файл Изменено: New — 26.09.2020 10:24:30 |
Dalm Пользователь Сообщений: 247 |
|
Юрий М Модератор Сообщений: 60390 Контакты см. в профиле |
А разговор о 64 — это про систему или про Офис? |
New Пользователь Сообщений: 4402 |
|
Юрий М Модератор Сообщений: 60390 Контакты см. в профиле |
Я почему спрашиваю — у меня некий микст: ОС 64, а Офис 32. И макрос работает. |
sokol92 Пользователь Сообщений: 4429 |
#10 26.09.2020 15:33:39 Поскольку в теме есть неточности, давайте разберем этот пример. Цель: составить определение функции из сообщения #3 для версий офиса 2010+ (VBA7). Win32API_PtrSafe.TXT . К сожалению, этой функции там нет. здесь . здесь (в дальнейшем — Типы). Итак:
Теперь составляем описание:
Если мы все-таки ошиблись в описании какой-либо функции, то выполнение Excel с большой долей вероятности завершится аварийно. Поэтому перед выполнением сохраняем все данные. Изменено: sokol92 — 26.09.2020 15:39:34 Владимир |
||
Dalm Пользователь Сообщений: 247 |
|
У меня тоже не работают макросы на 64 бит, помогите пожалуйста |
|
sokol92 Пользователь Сообщений: 4429 |
Проект Вашего файла защищен паролем. |
New Пользователь Сообщений: 4402 |
#15 23.08.2022 16:57:55 Abu Balikbayev, надо вот эти 2 строки в модуле ClearToData
заменить на вот эти
Изменено: New — 23.08.2022 16:59:55 |
||||
RAN Пользователь Сообщений: 7081 |
#16 23.08.2022 17:46:16
Точно заменить? Или все-же в блок If засунуть? |
||
New Пользователь Сообщений: 4402 |
#17 23.08.2022 17:53:30 ну, в 12-м сообщении написано, что макрос не работает, значит у Abu система 64-битная, поэтому ему можно просто заменить. А если у кого-то ещё осталась 32-битная система, то
Изменено: New — 23.08.2022 17:57:31 |
||
sokol92 Пользователь Сообщений: 4429 |
#18 23.08.2022 17:56:02
Точнее, версия MS Office 2007 или более старая. Владимир |
||
New Пользователь Сообщений: 4402 |
изменил на #If Win64 Then. Всё равно, не знаю, кто сейчас работает на 32-битных машинах Изменено: New — 23.08.2022 17:58:54 |
sokol92 Пользователь Сообщений: 4429 |
На 32-разрядных MS Windows мало кто работает, а на 32-разрядных MS Office — многие. Изменено: sokol92 — 23.08.2022 18:13:41 |
Abu Balikbayev Пользователь Сообщений: 3 |
#21 24.08.2022 04:48:39
Как раз с помощью этого форума я решил эту проблему. А там еще до хрена ошибок на других макросах… Изменено: Abu Balikbayev — 24.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 надо подрубить?
-
#2
Так в итоге то где работает и где не работает?
-
#4
Установлен наверняка 64 разрядный офис. Какая винда? Давайте конкретнее как то..
Товарищи там же написано — добавьте атрибут PtrSafe
Ну и код vb скрипта было бы не плохо…
UEF
Модератор
Команда форума
-
#6
Попробуйте в таком формате, вставьте PtrSafe как вам посоветовали выше..
Код:
Private Declare PtrSafe Function CoCreateGuid Lib "OLE64.DLL" _