gpt4 book ai didi

vba - 如何编写一个控件来减少VBA代码模块中的单元格值

转载 作者:行者123 更新时间:2023-12-02 08:18:08 24 4
gpt4 key购买 nike

我有一个代码模块,在其中按特定键创建一个文本框,并将当前选定的单元格值减少文本框中插入的数量。我已经到了创建文本框的阶段了。现在我需要访问工作表模块外部文本框的事件。我发现我可以使用 WihtEvents 属性创建一个类模块。不幸的是这似乎不起作用。这里是执行控制的代码:

Dim objControl As BankingEventSink

Private Sub ReduceCell()
If IsNumeric(ActiveCell.Text) Then
Dim value As Double
value = CDbl(ActiveCell.Text)
ActiveSheet.Shapes.AddOLEObject(ClassType:="Forms.TextBox.1").Name = "ReduceCellTextBox"
With ActiveSheet.OLEObjects("ReduceCellTextBox")
.Top = ActiveCell.Top + ActiveCell.Height
.Left = ActiveCell.Left
End With
ActiveSheet.OLEObjects("ReduceCellTextBox").Activate
Set objControl = New BankingEventSink
objControl.Init (ActiveSheet.OLEObjects("ReduceCellTextBox").Object)
Else
RethrowKeys ("{BS}{-}")
End If
End Sub

类模块的代码:

Dim WithEvents objOLEControl As MSForms.TextBox

Public Sub Init(oleControl As MSForms.TextBox)
Set objOLEControl = oleControl
End Sub

Private Sub ReduceCellTextBox_Change()
MsgBox "Changed"
End Sub

Private Sub ReduceCellTextBox_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, _
ByVal Shift As Integer)
MsgBox "Key down: " & KeyCode
End Sub

无论我在文本框中写什么,都不会触发任何事件。哪里错了?

最佳答案

要从 VBA 用户窗体中删除标题栏,您需要使用 API 的 FindWindow , SetWindowLong , GetWindowLongSetWindowPosHERE是我获取 API 的一站式平台

创建您的用户表单并在其中放置一个文本框。例如

enter image description here

接下来将此代码粘贴到用户表单中。

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" ( _
ByVal lpClassName As String, ByVal lpWindowName As String) 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 GetWindowLong Lib "user32" _
Alias "GetWindowLongA" (ByVal hwnd As Long, _
ByVal nIndex As Long) As Long

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

Private Const GWL_STYLE = (-16)
Private Const WS_CAPTION = &HC00000
Private Const WS_BORDER = &H800000

Private Enum ESetWindowPosStyles
SWP_SHOWWINDOW = &H40
SWP_HIDEWINDOW = &H80
SWP_FRAMECHANGED = &H20
SWP_NOACTIVATE = &H10
SWP_NOCOPYBITS = &H100
SWP_NOMOVE = &H2
SWP_NOOWNERZORDER = &H200
SWP_NOREDRAW = &H8
SWP_NOREPOSITION = SWP_NOOWNERZORDER
SWP_NOSIZE = &H1
SWP_NOZORDER = &H4
SWP_DRAWFRAME = SWP_FRAMECHANGED
HWND_NOTOPMOST = -2
End Enum

Private Type RECT
Left As Long
Top As Long
Right As Long
Bottom As Long
End Type

Dim FrmWndh As Long, lStyle As Long
Dim tR As RECT

Private Sub UserForm_Activate()
FrmWndh = FindWindow(vbNullString, Me.Caption)

lStyle = GetWindowLong(FrmWndh, GWL_STYLE)

lStyle = lStyle And Not WS_CAPTION
SetWindowLong FrmWndh, GWL_STYLE, lStyle

SetWindowPos FrmWndh, 0, tR.Left, tR.Top, _
tR.Right - tR.Left, tR.Bottom - tR.Top, _
SWP_NOREPOSITION Or SWP_NOZORDER Or SWP_FRAMECHANGED Or WS_BORDER

Me.Repaint
End Sub

Private Sub TextBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
If KeyCode = 27 Then Unload Me
End Sub

当您现在运行用户表单时,它将如下所示。由于我们删除了用户窗体的标题栏,因此我添加了一段代码,以便当您从文本框中按 ESC 时,用户窗体将卸载。您可以将其更改为您喜欢的任何(合理的)内容。

enter image description here

关于vba - 如何编写一个控件来减少VBA代码模块中的单元格值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21205040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com