如何在Excel VBA中以编程方式移动或调整验证消息框的大小

如何在Excel VBA中以编程方式移动或调整验证消息框的大小,excel,vba,Excel,Vba,是否可以调整或移动验证单元格消息框 当一个工作表单元格有一些带有消息的验证规则时,可以调整或移动(使用VBA代码)验证单元格消息框,以便不覆盖其他单元格 谢谢 目前我的邮件非常大,覆盖了重要的单元格不,这是不可能的。解决方法是创建一个用户表单。请查看VBE中的“插入”菜单。不,这是不可能的。解决方法是创建一个用户表单。请查看VBE中的插入菜单。经过几个小时的工作,我想为我自己的问题提出一个解决方案 为此,我以另一个论坛提出的解决方案为基础,尽管有另一个目的。感谢作者们。我真诚地希望你觉得它有用

是否可以调整或移动验证单元格消息框

当一个工作表单元格有一些带有消息的验证规则时,可以调整或移动(使用VBA代码)验证单元格消息框,以便不覆盖其他单元格

谢谢


目前我的邮件非常大,覆盖了重要的单元格

不,这是不可能的。解决方法是创建一个用户表单。请查看VBE中的“插入”菜单。

不,这是不可能的。解决方法是创建一个用户表单。请查看VBE中的插入菜单。

经过几个小时的工作,我想为我自己的问题提出一个解决方案

为此,我以另一个论坛提出的解决方案为基础,尽管有另一个目的。感谢作者们。我真诚地希望你觉得它有用

这是我修改过的代码:

Option Explicit

    Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent _
    As Long, _
    ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long

    Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent _
    As Long) As Long

    Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

    Type POINTAPI
    x As Long
    Y As Long
    End Type

    Dim lngCurPos As POINTAPI
    Dim TimerOn As Boolean
    Dim TimerId As Long
    Dim newRange As Range
    Dim oldRange As Range

    Dim oToolTipHelp As OLEObject   'A label working as tool tip

    Dim wb As Workbook
    Dim ws As Worksheet

    Sub StartTimer()

        'Assign values to ws and wb, used in many parts
        Set wb = ThisWorkbook
        Set ws = wb.Sheets("CALCULOS")

        If Not TimerOn Then

            TimerId = SetTimer(0, 0, 0.01, AddressOf TimerProc)
            TimerOn = True

        Else

            MsgBox "Timer already On !", vbInformation
        End If

    End Sub

    '---------------------------------------------------------------------------------------
    ' Procedure : GetToolTipHelp
    ' Author    : INGENIERO
    ' Date      : 30/07/2019
    ' Purpose   : Creates LblToolTipHelp if does not exist
    '---------------------------------------------------------------------------------------
    '
    Function GetToolTipHelp(ws As Worksheet) As Object

        Dim shpObj As OLEObject

        For Each shpObj In ws.OLEObjects

            If shpObj.Name = "LblToolTipHelp" Then

                Set GetToolTipHelp = shpObj

                Exit Function

            End If

        Next shpObj

        'This part is only for my program. Measures are only for me.

        Dim lTop As Single
        Dim lLeft As Single
        Dim lWidth As Single
        Dim lHeight As Single

        lTop = ws.Cells(27, 8).top
        lLeft = ws.Cells(27, 8).left
        lWidth = ws.Cells(1, 18).left - ws.Cells(1, 8).left
        lHeight = ws.Cells(31, 1).top - ws.Cells(27, 1).top

        'Creates Help Label if does not exist
         ws.OLEObjects.Add(ClassType:="Forms.Label.1", Link:=False, _
            DisplayAsIcon:=False, left:=lLeft, _
                                    top:=lTop, _
                                    width:=lWidth, _
                                    height:=lHeight) _
                                    .Name = "LblToolTipHelp"

        With ws.OLEObjects("LblToolTipHelp")
            .Object.BackColor = RGB(255, 255, 192)
        End With

        Set GetToolTipHelp = shpObj

    End Function

    Sub TimerProc()

        If oToolTipHelp Is Nothing Then
        'Creates ToolTip if does not exist

            Set oToolTipHelp = GetToolTipHelp(ws)

        End If

        If oldRange Is Nothing Then

            Set oldRange = ws.Cells(1, 1) 'First set of oldRange
            Set newRange = ws.Cells(1, 1) 'First set of newRange

        Else

            GetCursorPos lngCurPos

            On Error Resume Next    'oldRange isn't set at first time

            Set newRange = ActiveWindow.RangeFromPoint(lngCurPos.x, lngCurPos.Y)

            If newRange Is Nothing Then

                Exit Sub

            Else

                If newRange.Address <> oldRange.Address Then

                    Set oldRange = newRange

                End If

            End If

        End If

        ChangeToolTip

    End Sub

    Sub StopTimer()

        If TimerOn Then

            KillTimer 0, TimerId

            TimerOn = False

        Else

            MsgBox "Timer already Off", vbInformation

        End If

    End Sub

    Sub ChangeToolTip()                        

        ws.OLEObjects("LblToolTipHelp").Object.Caption = newRange.Row & "," & newRange.Column

    End Sub
选项显式
声明函数SetTimer Lib“user32”(ByVal hwnd为Long,ByVal nIDEvent_
只要_
ByVal UELASS As Long,ByVal lpTimerFunc As Long)As Long
声明函数KillTimer Lib“user32”(ByVal hwnd为Long,ByVal nIDEvent_
只要)只要
将函数GetCursorPos Lib“user32”(lpPoint作为POINTAPI)声明为Long
类型POINTAPI
x尽可能长
只要
端型
作为POINTAPI的Dim lngCurPos
作为布尔的Dim TimerOn
暗淡的时光如长
将新范围变暗为范围
将旧范围变暗为范围
Dim OTOLTIPHELP作为OLEObject“一个用作工具提示的标签
将wb设置为工作簿
将ws设置为工作表
亚StartTimer()
'将值分配给ws和wb,用于许多部分
设置wb=ThisWorkbook
设置ws=wb.Sheets(“CALCULOS”)
如果不是TimerOn那么
TimerId=SetTimer(0,0,0.01,TimerProc的地址)
TimerOn=True
其他的
MsgBox“计时器已打开!”,vbInformation
如果结束
端接头
'---------------------------------------------------------------------------------------
'过程:GetToolTipHelp
作者:INGENIERO
日期:2019年7月30日
'目的:如果LBLTOLTIPHELP不存在,则创建LBLTOLTIPHELP
'---------------------------------------------------------------------------------------
'
函数GetToolTipHelp(ws-As工作表)作为对象
将shpObj作为对象进行调整
对于ws.OLEObjects中的每个shpObj
如果shpObj.Name=“LblToolTipHelp”,则
设置GetToolTipHelp=shpObj
退出功能
如果结束
下一个shpObj
“这部分内容只适用于我的节目。这些措施只适用于我。
将lTop设置为单个
单飞
单面暗宽
单曲
lTop=ws.Cells(27,8)。顶部
lLeft=ws.Cells(27,8)。左
lWidth=ws.Cells(1,18).左-ws.Cells(1,8).左
lHeight=ws.Cells(31,1).top-ws.Cells(27,1).top
'如果不存在,则创建帮助标签
添加(类类型:=“Forms.Label.1”,链接:=False_
DisplayAsIcon:=False,左:=lLeft_
顶部:=lTop_
宽度:=lWidth_
高度:=L高)_
.Name=“LblToolTipHelp”
使用ws.OLEObjects(“LblToolTipHelp”)
.Object.BackColor=RGB(255、255、192)
以
设置GetToolTipHelp=shpObj
端函数
子TimerProc()
如果OTOLTIPHELP什么都不是
'如果不存在,则创建工具提示
Set-oToolTipHelp=GetToolTipHelp(ws)
如果结束
如果oldRange不算什么,那么
Set oldRange=ws.Cells(1,1)'第一组oldRange
Set newRange=ws.Cells(1,1)'第一组newRange
其他的
GetCursorPos lngCurPos
出现错误时,第一次未设置“继续下一步”oldRange
设置newRange=ActiveWindow.RangeFromPoint(lngCurPos.x,lngCurPos.Y)
如果newRange什么都不是,那么
出口接头
其他的
如果是newRange.Address oldRange.Address,则
设置旧范围=新范围
如果结束
如果结束
如果结束
更改工具提示
端接头
子停止计时器()
如果是TimerOn那么
KillTimer 0,TimerId
TimerOn=False
其他的
MsgBox“计时器已关闭”,vbInformation
如果结束
端接头
子更改工具提示()
ws.OLEObjects(“LblToolTipHelp”).Object.Caption=newRange.Row&“,”&newRange.Column
端接头

在ChangeToolTip Sub上,您可以发布自己的消息

经过几个小时的工作,我想为我自己的问题提出一个解决方案

为此,我以另一个论坛提出的解决方案为基础,尽管有另一个目的。感谢作者们。我真诚地希望你觉得它有用

这是我修改过的代码:

Option Explicit

    Declare Function SetTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent _
    As Long, _
    ByVal uElapse As Long, ByVal lpTimerFunc As Long) As Long

    Declare Function KillTimer Lib "user32" (ByVal hwnd As Long, ByVal nIDEvent _
    As Long) As Long

    Declare Function GetCursorPos Lib "user32" (lpPoint As POINTAPI) As Long

    Type POINTAPI
    x As Long
    Y As Long
    End Type

    Dim lngCurPos As POINTAPI
    Dim TimerOn As Boolean
    Dim TimerId As Long
    Dim newRange As Range
    Dim oldRange As Range

    Dim oToolTipHelp As OLEObject   'A label working as tool tip

    Dim wb As Workbook
    Dim ws As Worksheet

    Sub StartTimer()

        'Assign values to ws and wb, used in many parts
        Set wb = ThisWorkbook
        Set ws = wb.Sheets("CALCULOS")

        If Not TimerOn Then

            TimerId = SetTimer(0, 0, 0.01, AddressOf TimerProc)
            TimerOn = True

        Else

            MsgBox "Timer already On !", vbInformation
        End If

    End Sub

    '---------------------------------------------------------------------------------------
    ' Procedure : GetToolTipHelp
    ' Author    : INGENIERO
    ' Date      : 30/07/2019
    ' Purpose   : Creates LblToolTipHelp if does not exist
    '---------------------------------------------------------------------------------------
    '
    Function GetToolTipHelp(ws As Worksheet) As Object

        Dim shpObj As OLEObject

        For Each shpObj In ws.OLEObjects

            If shpObj.Name = "LblToolTipHelp" Then

                Set GetToolTipHelp = shpObj

                Exit Function

            End If

        Next shpObj

        'This part is only for my program. Measures are only for me.

        Dim lTop As Single
        Dim lLeft As Single
        Dim lWidth As Single
        Dim lHeight As Single

        lTop = ws.Cells(27, 8).top
        lLeft = ws.Cells(27, 8).left
        lWidth = ws.Cells(1, 18).left - ws.Cells(1, 8).left
        lHeight = ws.Cells(31, 1).top - ws.Cells(27, 1).top

        'Creates Help Label if does not exist
         ws.OLEObjects.Add(ClassType:="Forms.Label.1", Link:=False, _
            DisplayAsIcon:=False, left:=lLeft, _
                                    top:=lTop, _
                                    width:=lWidth, _
                                    height:=lHeight) _
                                    .Name = "LblToolTipHelp"

        With ws.OLEObjects("LblToolTipHelp")
            .Object.BackColor = RGB(255, 255, 192)
        End With

        Set GetToolTipHelp = shpObj

    End Function

    Sub TimerProc()

        If oToolTipHelp Is Nothing Then
        'Creates ToolTip if does not exist

            Set oToolTipHelp = GetToolTipHelp(ws)

        End If

        If oldRange Is Nothing Then

            Set oldRange = ws.Cells(1, 1) 'First set of oldRange
            Set newRange = ws.Cells(1, 1) 'First set of newRange

        Else

            GetCursorPos lngCurPos

            On Error Resume Next    'oldRange isn't set at first time

            Set newRange = ActiveWindow.RangeFromPoint(lngCurPos.x, lngCurPos.Y)

            If newRange Is Nothing Then

                Exit Sub

            Else

                If newRange.Address <> oldRange.Address Then

                    Set oldRange = newRange

                End If

            End If

        End If

        ChangeToolTip

    End Sub

    Sub StopTimer()

        If TimerOn Then

            KillTimer 0, TimerId

            TimerOn = False

        Else

            MsgBox "Timer already Off", vbInformation

        End If

    End Sub

    Sub ChangeToolTip()                        

        ws.OLEObjects("LblToolTipHelp").Object.Caption = newRange.Row & "," & newRange.Column

    End Sub
选项显式
声明函数SetTimer Lib“user32”(ByVal hwnd为Long,ByVal nIDEvent_
只要_
ByVal UELASS As Long,ByVal lpTimerFunc As Long)As Long
声明函数KillTimer Lib“user32”(ByVal hwnd为Long,ByVal nIDEvent_
只要)只要
将函数GetCursorPos Lib“user32”(lpPoint作为POINTAPI)声明为Long
类型POINTAPI
x尽可能长
只要
端型
作为POINTAPI的Dim lngCurPos
作为布尔的Dim TimerOn
暗淡的时光如长
将新范围变暗为范围
将旧范围变暗为范围
Dim OTOLTIPHELP作为OLEObject“一个用作工具提示的标签
将wb设置为工作簿
将ws设置为工作表
亚StartTimer()
'将值分配给ws和wb,用于许多部分
设置wb=ThisWorkbook
设置ws=wb.Sheets(“CALCULOS”)
如果不是TimerOn那么
TimerId=SetTimer(0,0,0.01,TimerProc的地址)
TimerOn=True
其他的