如何将 userform 添加到此代码而不是 msgbox?
How to add userform into this code instead of msgbox?
我目前有这个代码
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myCell As Range
For Each myCell In Range("G4:G160")
If (Not IsEmpty(myCell)) And myCell.Value <> 17521 And myCell.Value <> "" Then
DisplayUserForm
Exit Sub
End If
Next myCell
End Sub
并将此用于我的用户表单
Sub DisplayUserForm()
Dim form As New WarningBox
form.LOL.Caption = "INCORRECT!"
form.Show
Set form = Nothing
结束子
我还必须做些什么才能让它出现而不是 msgbox 来提醒输入数据的人将以粗体显示 "INCORRECT!" 并被红色包围。
请看下面我要展示的图片
请按照以下步骤操作:
- 通过右键单击您的 VBA 项目并在
Insert
选项下选择 UserForm
来插入一个新表单。
- 在创建的表单上单击一次,然后按``F4
key to open the
属性``` window。
- 在
Properties
window 上,表单的默认名称是 UserForm1
。根据需要将其更改为任何新值(例如 WarningBox)
- 从
ToolBox
window 中,将 Label
拖放到您的表单上并调整其大小、字体、字体颜色以及 [= 上存在的所有其他属性15=] window。请将标签重命名为 message
。稍后调用要显示的表单时,我将使用此名称。
- 如果您愿意,就像第 4 步一样,将
CommandButton
添加到您的表单并将其名称更改为例如 okButton
并根据需要调整其他属性。
- 双击按钮编写此按钮的代码。编写代码如下:
Private Sub okButton_Click()
'Close the form
Unload Me
End Sub
- 现在,按如下方式修改您的
DisplayUserForm()
子:
Sub DisplayUserForm()
Dim form As New warningBox
form.message.Caption = "write your message here"
form.Show
Set form = Nothing
End Sub
一切如你所愿!
Marc:如果您的 "Incorrect" 消息是 "LOL" object,您使用代码 form.LOL.Caption = "INCORRECT!"
修改了其标题,如果它是文本框 object。 Saeed Sayyadipour 的示例显示使用标签 object,用户无法编辑该标签(我 'second' 他对 "OK" 按钮的建议)。
此外,由于事件通过定义 "Target" 范围 object 告诉您更改了哪些单元格,您是否真的需要遍历所有 G4:G160,因为只有Target 中的单元格被用户更改了吗?也许使用 For Each MyCell in Intersect(Target,Range("G4:G160"))
,或者在适当的地方添加这些行:
Dim AffectedCells as Range
...
Set AffectedCells=Intersect(Target,Range("G4:G160"))
...
Set AffectedCells=Nothing
并将循环更改为:
For Each myCell in AffectedCells
...
Next myCell
如果更改的范围(目标)与您的 G4:G160 之间没有重叠,则不会发生任何事情并且您的代码会快速退出。
我目前有这个代码
Private Sub Worksheet_Change(ByVal Target As Range)
Dim myCell As Range
For Each myCell In Range("G4:G160")
If (Not IsEmpty(myCell)) And myCell.Value <> 17521 And myCell.Value <> "" Then
DisplayUserForm
Exit Sub
End If
Next myCell
End Sub
并将此用于我的用户表单
Sub DisplayUserForm()
Dim form As New WarningBox
form.LOL.Caption = "INCORRECT!"
form.Show
Set form = Nothing
结束子
我还必须做些什么才能让它出现而不是 msgbox 来提醒输入数据的人将以粗体显示 "INCORRECT!" 并被红色包围。
请看下面我要展示的图片
请按照以下步骤操作:
- 通过右键单击您的 VBA 项目并在
Insert
选项下选择UserForm
来插入一个新表单。 - 在创建的表单上单击一次,然后按``F4
key to open the
属性``` window。 - 在
Properties
window 上,表单的默认名称是UserForm1
。根据需要将其更改为任何新值(例如 WarningBox) - 从
ToolBox
window 中,将Label
拖放到您的表单上并调整其大小、字体、字体颜色以及 [= 上存在的所有其他属性15=] window。请将标签重命名为message
。稍后调用要显示的表单时,我将使用此名称。 - 如果您愿意,就像第 4 步一样,将
CommandButton
添加到您的表单并将其名称更改为例如okButton
并根据需要调整其他属性。 - 双击按钮编写此按钮的代码。编写代码如下:
Private Sub okButton_Click()
'Close the form
Unload Me
End Sub
- 现在,按如下方式修改您的
DisplayUserForm()
子:
Sub DisplayUserForm()
Dim form As New warningBox
form.message.Caption = "write your message here"
form.Show
Set form = Nothing
End Sub
一切如你所愿!
Marc:如果您的 "Incorrect" 消息是 "LOL" object,您使用代码 form.LOL.Caption = "INCORRECT!"
修改了其标题,如果它是文本框 object。 Saeed Sayyadipour 的示例显示使用标签 object,用户无法编辑该标签(我 'second' 他对 "OK" 按钮的建议)。
此外,由于事件通过定义 "Target" 范围 object 告诉您更改了哪些单元格,您是否真的需要遍历所有 G4:G160,因为只有Target 中的单元格被用户更改了吗?也许使用 For Each MyCell in Intersect(Target,Range("G4:G160"))
,或者在适当的地方添加这些行:
Dim AffectedCells as Range
...
Set AffectedCells=Intersect(Target,Range("G4:G160"))
...
Set AffectedCells=Nothing
并将循环更改为:
For Each myCell in AffectedCells
...
Next myCell
如果更改的范围(目标)与您的 G4:G160 之间没有重叠,则不会发生任何事情并且您的代码会快速退出。