Почему я не могу скрыть строку заголовка на панели прогресса? - PullRequest
1 голос
/ 02 октября 2019

Я пытаюсь использовать код из здесь . Я проверил на некоторых форумах по программированию, и, кажется, все в порядке. Но я получаю ошибку 438 при отображении пользовательской формы, используемой в качестве индикатора выполнения. У меня нет никаких знаний о том, как использовать библиотеки (это мой первый раз).

Код заголовка:

Option Explicit
Option Private Module

' FROM https://wellsr.com/vba/2017/excel/beautiful-vba-progress-bar-with-step-by-step-instructions/
Public Const GWL_STYLE = -16
Public Const WS_CAPTION = &HC00000
#If VBA7 Then
    Public Declare PtrSafe Function GetWindowLong _
                           Lib "user32" Alias "GetWindowLongA" ( _
                           ByVal hWnd As Long, _
                           ByVal nIndex As Long) As Long
    Public Declare PtrSafe Function SetWindowLong _
                           Lib "user32" Alias "SetWindowLongA" ( _
                           ByVal hWnd As Long, _
                           ByVal nIndex As Long, _
                           ByVal dwNewLong As Long) As Long
    Public Declare PtrSafe Function DrawMenuBar _
                           Lib "user32" ( _
                           ByVal hWnd As Long) As Long
    Public Declare PtrSafe Function FindWindowA _
                           Lib "user32" (ByVal lpClassName As String, _
                           ByVal lpWindowName As String) As Long
#Else
    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 Function DrawMenuBar _
                           Lib "user32" ( _
                           ByVal hWnd As Long) As Long
    Public Declare Function FindWindowA _
                           Lib "user32" (ByVal lpClassName As String, _
                           ByVal lpWindowName As String) As Long
#End If

Процедура скрытия строки заголовка

Sub HideTitleBar(frm As Object)
    Dim lngWindow As Long
    Dim lFrmHdl As Long

    lFrmHdl = FindWindowA(vbNullString, frm.Caption)
    lngWindow = GetWindowLong(lFrmHdl, GWL_STYLE)
    lngWindow = lngWindow And (Not WS_CAPTION)
    Call SetWindowLong(lFrmHdl, GWL_STYLE, lngWindow)
    Call DrawMenuBar(lFrmHdl)
End Sub

Когда я пытаюсь показать пользовательскую форму, я получаю постоянную ошибку 438 в строке: lFrmHdl = FindWindowA(vbNullString, frm.Caption). Я не нашел, почему.

Макрос, который я создал для вызова этой пользовательской формы:

Sub Delete_Zero()
Dim LastRow As Long
Dim LastCol As Long
Dim i As Long
Dim j As Long
Dim pctdone As Single


'(Step 1) Display your Progress Bar
ufProgress.LabelProgress.Width = 0
ufProgress.Show vbModeless

LastRow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
LastCol = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Column
For i = 1 To LastRow
    For j = 1 To LastCol
        If Cells(i, j).Value2 = 0 Or Cells(i, j).Value2 = "" Then
            Cells(i, j).ClearContents
        End If
    Next j
    '(Step 2) Update Progress Bar
    pctdone = i / LastRow
    With ufProgress
        .LabelCaption.Caption = "Processing Row " & i & " of " & LastRow
        .LabelProgress.Width = pctdone * (.FrameProgress.Width)
    End With
    ufProgress.Repaint
    '(Step 3) Unload Progress Bar
    If i = LastRow Then Unload ufProgress
Next i

End Sub

Любая помощь будет оценена.

ОБНОВЛЕНИЕ 1: Я забыл прикрепитькод в пользовательской форме:

Private Sub UserForm_Initialize()
    Me.Height = Me.Height - 10
    HideTitleBar.HideTitleBar Me
End Sub

1 Ответ

1 голос
/ 02 октября 2019

Если вы просто хотите, чтобы пользователь не нажимал кнопку закрытия X, вам не нужно прыгать через несколько обручей, чтобы скрыть строку заголовка. Просто запишите событие и отмените запрос.

В свой модуль кода пользовательской формы вставьте этот код:

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

    Cancel = True

End Sub

И это все, что нужно.


Хотите сделать это более изощренным? Ну, вы можете сначала подсказать пользователю.

Private Sub UserForm_QueryClose(Cancel As Integer, CloseMode As Integer)

    if Inputbox("If you are sure you want to stop the procedure, please type the " & _
                                                    "word 'STOP'") = "STOP" then
        Cancel = False

    Else

        Cancel = True

    End If

End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...