Страницы: 1 2 След.
RSS
Как обновить макрос, чтобы работал на 64-bit
 
Доброго времени суток. Как поправить макрос, чтобы он работал и на 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.
 
у меня система отказалась его принимать
пишет вирус
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Ясно.
Тогда как заменить строчку кода
Код
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 битную версию ?
Изменено: Dalm - 26.09.2020 04:32:32
 
https://docs.microsoft.com/ru-ru/office/vba/language/reference/user-interface-help/declare-statement
По вопросам из тем форума, личку не читаю.
 
См. файл
Изменено: New - 26.09.2020 10:24:30
 
New, спасибо
 
А разговор о 64 - это про систему или про Офис?
 
это про функции WinAPI.
 
Я почему спрашиваю -  у меня некий микст: ОС 64, а Офис 32. И макрос работает.
 
Поскольку в теме есть неточности, давайте разберем этот пример. Цель: составить определение функции из сообщения #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 с большой долей вероятности завершится аварийно. Поэтому перед выполнением сохраняем все данные.
Изменено: sokol92 - 26.09.2020 15:39:34
Владимир
 
Спасибо
 
У меня тоже не работают макросы на 64 бит, помогите пожалуйста
 
Проект Вашего файла защищен паролем.
Владимир
 
Пароль: sikn31
 
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
Изменено: New - 23.08.2022 16:59:55
 
Цитата
New написал:
надо вот эти 2 строки в модуле заменить на вот эти
Точно заменить? Или все-же в блок If засунуть?
 
ну, в 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
Изменено: New - 23.08.2022 17:57:31
 
Цитата
New написал:
кого-то ещё осталась 32-битная система
Точнее, версия MS Office 2007 или более старая.
Владимир
 
изменил на #If Win64 Then. Всё равно, не знаю, кто сейчас работает на 32-битных машинах
Изменено: New - 23.08.2022 17:58:54
 
На 32-разрядных MS Windows мало кто работает, а на 32-разрядных MS Office - многие.
Изменено: sokol92 - 23.08.2022 18:13:41
Владимир
 
Цитата
написал:
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 Balikbayev - 24.08.2022 04:49:33
 
Добрый день. Уважаемые знатоки, проблема та же. Может кто-нибудь подсказать что поправить? Пробовал по аналогии из примеров выше- не вышло.
 
Операторы Declare должны быть в стандартном модуле (у Вас это module1), а не в модуле класса (у Вас это модуль листа Sheet2).

Код
#If VBA7 Then
Declare PtrSafe Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As LongPtr, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As LongPtr
#Else
Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" (ByVal hwnd As Long, ByVal lpOperation As String, ByVal lpFile As String, ByVal lpParameters As String, ByVal lpDirectory As String, ByVal nShowCmd As Long) As Long
#End If
Изменено: sokol92 - 21.07.2023 17:00:40
Владимир
 
Цитата
написал:
Операторы Declare должны быть в стандартном модуле (у Вас это module1), а не в модуле класса (у Вас это модуль листа Sheet2).
Прошу прощения, а куда именно вставлять написанное в module1? Макрос мне перешёл "по наследству" и моих знаний несколько не хватает.
 
В начало модуля (до функции).
Владимир
 
Спасибо.
 
Приветствую. Помогите перевести файл из 32б в 64 б систему

Private Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As Long) As Long
 
SYSADMINDEG,
Код
Private Declare PtrSafe Function CopyFile Lib "kernel32" Alias "CopyFileA" (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, ByVal bFailIfExists As LongPtr) As LongPtr
 
Здравствуйте.
Помогите мне тоже, пожалуйста.
Я простой обыватель, помочь некому. Такая же ошибка.  
 
Алина Н, Доброго времени суток. Вот полностью код для формы, раскройте спойлерю.
Код формы SRForm
Страницы: 1 2 След.
Наверх