Страницы: 1
RSS
При загрузке программы, Ексель уходит в ошибку., Прекращена работа программы Microsoft Excel
 
Уважаемые форумчане, прошу помощи!
В файле Excel разработал программу. В ней большая UserForm, много процедур.
Работало все прекрасно, последние две недели при загрузке программы, Ексель уходит в ошибку.
Если запускать программу пошагово [F8], загрузка выполняется без проблем.
Исследуя код в поисках возможной ошибки обратил внимание, что все записи (во  всех процедурах) со значением .Value  изменены на .value редактор VBA сам приводит их к такому формату.
Выложить файл не могу, он более 2 Мбайт весом.

Версия Windows  7 х64, Excel 2010.В программе используются функции API декларированные  
#If VBA7 Then
       #If Win64 Then #Else #End If
#Else
#End If
Также ссылки на библиотеки:
VBA|Visual Basic For Applications (VBE7.DLL); Excel|Microsoft Excel 14.0 Object Library; stdole|OLE Automation; Office|Microsoft Office 14.0 Object Library; MSForms|Microsoft Forms 2.0 Object Library; Word|Microsoft Word 14.0 Object Library; ADODB|Microsoft ActiveX Data Objects 6.0 Library; VBIDE|Microsoft Visual Basic for Applications Extensibility 5.3 (\VBE6EXT.OLB); MSHTML|Microsoft HTML Object Library; MSScriptControl|Microsoft Script Control 1.0

Подскажите, что произошло с программой, почему редактор VBA меняет код  .value  ?
Изменено: TSN - 30.11.2020 10:25:45
 
Отрезать лишнее из картинки - никак? 1/5 полезного...
 
Цитата
почему редактор VBA меняет код  .value
не обращайте на это внимания
возможно, где-то в вашем коде объявлена переменная value (с маленькой буквы)

Цитата
Ексель уходит в ошибку
одна из WinAPI функций объявлена неверно
или ей передаются недопустимые параметры при вызове
 
Цитата
Игорь написал:
одна из WinAPI функций объявлена неверно
Можете сказать правильно продекларированы WinAPI
Код
#If VBA7 Then
  #If Win64 Then '' Windows x64, Office 2010 - 2013 и выше
    '''API получить координаты ячейки экселя на экране компьютера
    Public Declare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As LongPtr) As LongPtr
    '''тайм аут
    Public Declare PtrSafe Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As LongPtr)
    '***** Работа с Clipboard Виндовс --- ClearClipboardApi
    Public Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
    Public Declare PtrSafe Function EmptyClipboard Lib "user32" () As LongPtr
    Public Declare PtrSafe Function CloseClipboard Lib "user32" () As LongPtr
    '*****Для скрытого запуска документов (проверка орфографии) CheckSpellingText
    Public Declare PtrSafe Function CoAllowSetForegroundWindow Lib "ole32.dll" (ByVal pUnk As Object, ByVal lpvReserved As LongPtr) As LongPtr
    '***** Переключение раскладки на украинскую если в данный момент раскладка английская или русская
    Public Declare PtrSafe Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As LongPtr
    Public Declare PtrSafe Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As LongPtr, ByVal flags As LongPtr) As LongPtr
    '' Декларируем для Всех Форм кнопки Свернуть Развернуть ---- Константы остались в формах
    Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongLong
    Public Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hwnd As LongPtr, ByVal nCmdShow As LongLong) As LongLong 'для отображения окон
    Public Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As LongPtr) As LongLong
    Public Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As LongPtr, ByVal nIndex As LongPtr, ByVal dwNewLong As LongLong) As LongLong
    Public Declare PtrSafe Function SetFocus Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
    '' Продублирована часть функций из класса clsFormChanger
'    Public Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, _
                                                                                     ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr
'    Public Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hwnd As LongPtr) As LongPtr
'    Public Declare PtrSafe Function GetSystemMenu Lib "user32" (ByVal hwnd As LongPtr, ByVal bRevert As LongLong) As LongLong
'    Public Declare PtrSafe Function DeleteMenu Lib "user32" (ByVal hMenu As LongLong, ByVal nPosition As LongLong, ByVal wFlags As LongLong) As LongLong
'    Public Declare PtrSafe Function EnableWindow Lib "user32" (ByVal hwnd As LongPtr, ByVal fEnable As LongLong) As LongLong
'    Public Declare PtrSafe Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As LongLong, ByVal lpszExeFileName As String, ByVal nIconIndex As LongLong) As LongLong
'    Public Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As LongPtr, ByVal wMsg As LongLong, ByVal wParam As Integer, ByVal lParam As LongLong) As LongLong
'    Public Declare PtrSafe Function LockWindowUpdate Lib "user32" (ByVal hWndLock As LongPtr) As LongPtr
    '' Сделать ексель  прозрачным во время работы с формой (быстро или постепенно)
  ' Public Declare Function GetWindowLong Lib "USER32" Alias "GetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As LongPtr) As LongPtr
  ' Public Declare Function SetWindowLong Lib "USER32" Alias "SetWindowLongA" (ByVal hWnd As LongPtr, ByVal nIndex As LongPtr, ByVal dwNewLong As LongPtr) As LongPtr
    Public Declare PtrSafe Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As LongPtr, ByVal crKey As LongPtr, ByVal bAlpha As Byte, ByVal dwFlags As LongPtr) As LongPtr
    '' Отображения формы поверх всех окон:
    Public Declare PtrSafe Function GetActiveWindow Lib "user32" () As LongPtr
    Public Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, _
                                                                ByVal x As LongPtr, ByVal y As LongPtr, ByVal cx As LongPtr, _
                                                                ByVal cy As LongPtr, ByVal wFlags As LongPtr) As LongPtr
 #Else '' Windows x86, Office 2010 - 2013 и выше
    '''API получить координаты ячейки экселя на экране компьютера
    Public Declare PtrSafe Function GetSystemMetrics Lib "user32" (ByVal nIndex As Long) As LongPtr
    '''тайм аут
    Public Declare PtrSafe Sub Sleep Lib "kernel32.dll" (ByVal dwMilliseconds As Long)
    '***** Работа с Clipboard Виндовс --- ClearClipboardApi
    Public Declare PtrSafe Function OpenClipboard Lib "user32" (ByVal hwnd As Long) As LongPtr
    Public Declare PtrSafe Function EmptyClipboard Lib "user32" () As LongPtr
    Public Declare PtrSafe Function CloseClipboard Lib "user32" () As LongPtr
    '*****Для скрытого запуска документов (проверка орфографии) CheckSpellingText
    Public Declare PtrSafe Function CoAllowSetForegroundWindow Lib "ole32.dll" (ByVal pUnk As Object, ByVal lpvReserved As LongPtr) As LongPtr
    '***** Переключение раскладки на украинскую если в данный момент раскладка английская или русская
    Public Declare PtrSafe Function GetKeyboardLayoutName Lib "user32" Alias "GetKeyboardLayoutNameA" (ByVal pwszKLID As String) As LongPtr
    Public Declare PtrSafe Function ActivateKeyboardLayout Lib "user32" (ByVal HKL As LongPtr, ByVal flags As LongPtr) As LongPtr
    '' Декларируем для Всех Форм кнопки Свернуть Развернуть ---- Константы остались в формах
    Public Declare PtrSafe Function SetFocus Lib "user32" (ByVal hwnd As Long) As Long
    Public Declare PtrSafe Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPtr
    Public Declare PtrSafe Function ShowWindow Lib "user32" (ByVal hwnd As Long, ByVal nCmdShow As LongPtr) As LongPtr 'для отображения окон
    Public Declare PtrSafe Function GetWindowLong Lib "user32" Alias "GetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long) As LongPtr
    Public Declare PtrSafe Function SetWindowLong Lib "user32" Alias "SetWindowLongA" (ByVal hwnd As Long, ByVal nIndex As Long, ByVal dwNewLong As LongPtr) As LongPtr
    '' Продублирована часть функций из класса clsFormChanger
'    Public Declare PtrSafe Function FindWindowEx Lib "user32" Alias "FindWindowExA" (ByVal hWnd1 As LongPtr, ByVal hWnd2 As LongPtr, _
                                                                                     ByVal lpsz1 As String, ByVal lpsz2 As String) As LongPtr
'    Public Declare PtrSafe Function DrawMenuBar Lib "user32" (ByVal hwnd As Long) As LongPtr
'    Public Declare PtrSafe Function GetSystemMenu Lib "user32" (ByVal hwnd As Long, ByVal bRevert As LongPtr) As LongPtr
'    Public Declare PtrSafe Function DeleteMenu Lib "user32" (ByVal hMenu As LongPtr, ByVal nPosition As LongPtr, ByVal wFlags As LongPtr) As LongPtr
'    Public Declare PtrSafe Function EnableWindow Lib "user32" (ByVal hwnd As Long, ByVal fEnable As LongPtr) As LongPtr
'    Public Declare PtrSafe Function ExtractIcon Lib "shell32.dll" Alias "ExtractIconA" (ByVal hInst As LongPtr, ByVal lpszExeFileName As String, ByVal nIconIndex As LongPtr) As LongPtr
'    Public Declare PtrSafe Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As LongPtr, ByVal wParam As Integer, ByVal lParam As LongPtr) As LongPtr
'    Public Declare PtrSafe Function LockWindowUpdate Lib "user32" (ByVal hWndLock As LongPtr) As LongPtr
      '' Сделать ексель  прозрачным во время работы с формой (быстро или постепенно)
  ' Public Declare Function GetWindowLong Lib "USER32" Alias "GetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long) As Long
  ' Public Declare Function SetWindowLong Lib "USER32" Alias "SetWindowLongA" (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
    Public Declare PtrSafe Function SetLayeredWindowAttributes Lib "user32" (ByVal hwnd As Long, ByVal crKey As LongPtr, ByVal bAlpha As Byte, ByVal dwFlags As LongPtr) As LongPtr
    Public Declare PtrSafe Function GetActiveWindow Lib "user32" () As Long
    Public Declare PtrSafe Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As LongPtr, _
                                                                ByVal x As LongPtr, ByVal y As LongPtr, ByVal cx As LongPtr, _
                                                                ByVal cy As LongPtr, ByVal wFlags As LongPtr) As LongPtr
  #End If
#Else 
 
Если объявляете через PtrSafe, то LonlLong и Long лишнее - надо везде объявлять как LongPtr, VBA сам преобразует в нужный тип. А у Вас каша какая-то: то LongPtr, то LongLong, то Long. Либо уж убирайте PtrSafe и назначайте конкретные типы: Long и LongLong(но для этого надо очень хорошо знать входной тип каждой функции для каждой системы).
Изменено: Дмитрий(The_Prist) Щербаков - 30.11.2020 10:42:32
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
нет, не правильно
(не везде надо LongPtr писать вместо Long)

пример правильного написания:
Код
#If VBA7 Then
    Private Declare PtrSafe Function SetWindowPos _
        Lib "user32" (ByVal hwnd As LongPtr, ByVal hWndInsertAfter As LongPtr, _
        ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
#Else
    Private Declare Function SetWindowPos Lib "user32" (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, _
        ByVal X As Long, ByVal Y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As Long
#End If


думаю, там ещё в вызовах функций есть ошибки
короче, исправлять много и долго
 
Цитата
Дмитрий(The_Prist) Щербаков написал:
Если объявляете через PtrSafe, то LonlLong лишнее - надо везде объявлять как LongPtr
Спасибо, сейчас исправлю. Я запутался с этими декларациями WinApi
 
Добрый день, уважаемые форумчане.
Хочу выразить благодарность Всем, кто откликнулся, благодаря вашим подсказкам декларации WinApi более детально изучены и переосмыслены.

Что касается первого поста с основным вопросом по сбою программы, была проведена работа по поиску возникающей ошибки:
- переписаны WinApi, также в процессе было полное отключение всех WinApi вместе с вызовами их функций, форма стала менее красивой и функциональной, но сбой остался, могу с уверенностью сказать WinApi были не причем;
- частично изменен и переписан код (логика) загрузки формы, не помогло (прикольно смотреть на свой код спустя несколько лет,  думаю сейчас лучше стало, но время покажет.);
- написан класс логирования загрузки программы, который помог найти участок кода со странной на мой взгляд причиной, а именно после инициализации и загрузки формы выполнялась загрузка данных в листбоксы и комбобоксы, в один из листбоксов загружался текст
Код
If .cmbxOptionService.ListCount = 0 Then
      .cmbxOptionService.AddItem "Витяг з Річного плану закупівель по підрозділам"
      .cmbxOptionService.AddItem "Зміни в річний план закупівель"
      .cmbxOptionService.AddItem "Звіт по проведеним договорам"
      .cmbxOptionService.ListIndex = 0
End If
Где  len ("Витяг з Річного плану закупівель по підрозділам") =  47
на этой строке возникал сбой  :(
Заменив строку на .cmbxOptionService.AddItem "Витяг з РПЗ по підрозділам"  len ("")  =  26
Также
Код
'   If .cmbxRadioOnline.ListCount = 0 Then
'      ReDim arr(1 To 5, 1 To 2)
'      arr(1, 1) = "ROKS FM"
'      arr(1, 2) = "http://online-radioroks.tavrmedia.ua/RadioROKS_HD"
'      arr(2, 1) = "Record"
'      arr(2, 2) = "http://online.radiorecord.ru:8101/rr_128"
'      arr(3, 1) = "Кисс ФМ Украина"
'      arr(3, 2) = "http://online-kissfm.tavrmedia.ua/KissFM"
'      arr(4, 1) = "Хит ФМ Украина"
'      arr(4, 2) = "http://online-hitfm.tavrmedia.ua/HitFM"
'      arr(5, 1) = "Просто Радио"
'      arr(5, 2) = "http://62.80.190.246:8000/PRK128"
'      .cmbxRadioOnline.ColumnWidths = "90;1"
'      .cmbxRadioOnline.List = arr
'      .cmbxRadioOnline.ListIndex = 0
'   End If
 len("http://online-radioroks.tavrmedia.ua/RadioROKS_HD") = 49
Закоментировав  данный участок кода
Программа стала работать без сбоев, полет нормальный с 15.02.2021.

Есть загрузка в другие листбоксы, где  len  =  46 и сбой не возникает, изменив на большую длину текста до 50 символов, тоже возникает сбой,  свойства контролов стандартные, ограничений на длину текста нет.

Смущает факт того, что сбой возникает, только когда проект закрыт паролем для просмотра и редактирования, при удалении защиты все работает.
Если честно, я не понимаю взаимосвязи возникающей ошибки и защиты с паролированием проекта, но возможно, кто-то из гуру форума подскажет в чем кроется данная ошибка.
 
Вы заходите на форум за помощью, а форуму помочь не хотите... Где реакция на сообщение №2? Картинку обрезать - рука не поднимается?
Страницы: 1
Наверх