Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.09.2016, 18:38   #1
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию Объявление переменных для 64-разрядного excel 2013

Здравствуйте Уважаемые программисты!
Подскажите пожалуйста, как исправить 2 кода (отмечено ниже подчеркиванием), чтобы они работали в 32-разрядной и 64-разрядной версии excel (2013, vba)?
Заранее спасибо!

1код:
Код:
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
    (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" _
    (ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
    (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32.dll" (ByVal hWnd As Long) As Long

Private Sub UserForm_Initialize()
    Dim ihWnd As Long, iStyle As Long
    ihWnd = FindWindow(vbNullString, Me.Caption)
    iStyle = GetWindowLong(ihWnd, -16&)
    SetWindowLong ihWnd, -16&, iStyle And Not &HC00000
    DrawMenuBar ihWnd
End Sub
2 код:
Код:
Private Declare Function GetVolumeInformation _
  Lib "kernel32" Alias "GetVolumeInformationA" _
  (ByVal lpRootPathName As String, _
  ByVal lpVolumeNameBuffer As String, _
  ByVal nVolumeNameSize As Long, _
  lpVolumeSerialNumber As Long, _
  lpMaximumComponentLength As Long, _
  lpFileSystemFlags As Long, _
  ByVal lpFileSystemNameBuffer As String, _
  ByVal nFileSystemNameSize As Long) As Long

Public Function Drive_C_SerialNumber() As String
   Dim sDrive As String
   Dim VolumeName As String
   Dim SerialNumber As Long

   sDrive = "c:\"
   VolumeName = Space$(128)
   Call GetVolumeInformation(sDrive, vbNullString, 128&, SerialNumber, ByVal 0&, ByVal 0&, vbNullString, 0)
   VolumeName = Left$(VolumeName, InStr(VolumeName, Chr$(0)))
End Function

Последний раз редактировалось ольгаг; 20.09.2016 в 19:07.
ольгаг вне форума Ответить с цитированием
Старый 20.09.2016, 19:30   #2
IgorGO
Новичок
СтарожилДжуниор
 
Аватар для IgorGO
 
Регистрация: 05.02.2008
Сообщений: 9,487
По умолчанию

как-то так (у меня проверить не на чем((((
#if win64 then
Private Declare PtrSafe Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As LongLong

' аналогично остальные
'Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long
'Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
'Private Declare Function DrawMenuBar Lib "user32.dll" (ByVal hWnd As Long) As Long
#else
Private Declare Function FindWindow Lib "user32.dll" Alias "FindWindowA" _
(ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function GetWindowLong Lib "user32.dll" Alias "GetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long) As Long
Private Declare Function SetWindowLong Lib "user32.dll" Alias "SetWindowLongA" _
(ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
Private Declare Function DrawMenuBar Lib "user32.dll" (ByVal hWnd As Long) As Long
#end if
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете
IgorGO вне форума Ответить с цитированием
Старый 20.09.2016, 19:38   #3
tools
Форумчанин
 
Регистрация: 07.10.2008
Сообщений: 213
По умолчанию

Список всех основных функций (Таблица "Declarations by API function", первая в каждом ряду - 32bit, вторая - 64)
tools вне форума Ответить с цитированием
Старый 20.09.2016, 20:26   #4
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

+1 IgorGO. Использую #IF WIN64 ... с PtrSafe
https://msdn.microsoft.com/ru-ru/lib...ffice.14).aspx
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 21.09.2016, 12:37   #5
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию

Спасибо!
Подскажите пожалуйста где в коде ниже ошибка, сейчас этот код выдает "Compile error: Type mismatch" на строке "ihWnd = FindWindow(vbNullString, Me.Caption)" (64-разрядный excel 2013)?

Код:
Option Explicit

#If Win64 Then
   Private Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
     ByVal lpWindowName As String) As LongPtr
   Private Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongPtrA" (ByVal hWnd As LongPtr, _
     ByVal nIndex As Long) As LongPtr
   Private Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongPtrA" (ByVal hWnd As LongPtr, _
     ByVal nIndex As Long, ByVal dwNewLong As Long) As LongPtr
   Private Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hWnd As LongPtr) As Long
#Else
   Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, _
     ByVal lpWindowName As String) As Long
   Private Declare Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hWnd As Long, _
     ByVal nIndex As Long) As Long
   Private Declare Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hWnd As Long, _
     ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
   Private Declare Function DrawMenuBar Lib "user32" (ByVal hWnd As Long) As Long
#End If

Private Sub UserForm_Initialize()
    Dim ihWnd As Long, iStyle As Long
    ihWnd = FindWindow(vbNullString, Me.Caption)
    iStyle = GetWindowLong(ihWnd, -16&)
    SetWindowLong ihWnd, -16&, iStyle And Not &HC00000
    DrawMenuBar ihWnd
End Sub
Спасибо!

Последний раз редактировалось ольгаг; 21.09.2016 в 12:40.
ольгаг вне форума Ответить с цитированием
Старый 21.09.2016, 12:46   #6
Aleksandr H.
2 the Nation Glory
Старожил
 
Аватар для Aleksandr H.
 
Регистрация: 27.05.2014
Сообщений: 3,289
По умолчанию

В каких модулях код? В одном или каждый в своем: обявление в отдельном модуле, инициализация в модуле формы?
Кто умер, но не забыт, тот бессмертен.
Лао-Цзы.
Aleksandr H. вне форума Ответить с цитированием
Старый 21.09.2016, 13:25   #7
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию

Извините,
инициализация в модуле формы.
ольгаг вне форума Ответить с цитированием
Старый 22.09.2016, 01:18   #8
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

вот здесь ошибка: Dim ihWnd As Long
напишите просто Dim ihWnd

или так:
Код:
#If Win64 Then
   Dim ihWnd As LongPtr, iStyle As Long
#Else
   Dim ihWnd As Long, iStyle As Long
#End If
EducatedFool вне форума Ответить с цитированием
Старый 22.09.2016, 13:29   #9
ольгаг
Форумчанин
 
Регистрация: 22.02.2010
Сообщений: 325
По умолчанию

Спасибо!
ольгаг вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Excel + VBA 2013 + Access 2013 ESTerekhov Microsoft Office Excel 1 04.06.2014 16:24
объявление переменных в delphi irradiator Общие вопросы Delphi 5 28.05.2014 14:32
MVC - объявление переменных Nikirinka PHP 4 03.02.2012 20:39
Объявление ссылочных переменных _-Re@l-_ Общие вопросы C/C++ 5 14.03.2011 12:32
Объявление переменных Hemul Общие вопросы C/C++ 11 06.02.2011 16:37