当用户从下拉列表中选择"大奖"一词时,尝试将单词"Winner"插入"O列
"Private Sub Worksheet_SelectionChange(ByVal Target As Range)
For x = 6 To 88
If Cells(x, 14).Value = "Jackpot" Then
Cells(x, 15).Value = "Winnner"
ElseIf Cells(x, 14).Value <> "High" Then
Cells(x, 15).Value = " "
End If
Next x
End Sub
我遇到的问题是,当用户用任何文本填充 O 列时,该过程不应覆盖文本条目。
我不知道如何编写一个VBA代码,使文本条目保持不变,并且不让过程覆盖它。
查找的事件宏是Worksheet_Change,而不是Worksheet_SelectionChange事件宏。
每当工作表上的任何值更改(但不是由公式更改)时,都会触发Worksheet_Change,因此,如果要使用 Sub 更改 O 列中的值,则需要在进行更改时暂时暂停事件处理,否则Worksheet_Change可能会尝试在其自身上运行。
当工作表上的更改触发Worksheet_Change时,您需要确定目标(接收更改的一个或多个单元格)是否在您关注的单元格范围内。这是使用相交方法完成的。在下文中,Target 中的一个或多个单元格必须位于第 6 行和第 88 行之间的第 N 列中。如果有一个或多个,则每个...Next 语句用于遍历满足条件的每个单元格。
每个匹配的单元格都按顺序检查其值。"选择案例"语句可轻松处理多种可能的结果。
将上面讨论的所有要点放在一起,您应该最终得到如下所示的代码。
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim x As Long
If Not Intersect(Target, Columns(14), Range("6:88")) Is Nothing Then
On Error GoTo bm_Safe_Exit
Application.EnableEvents = False
Dim win As Range
For Each win In Intersect(Target, Columns(14), Range("6:88"))
Select Case LCase(win.Value2)
Case "jackpot"
win.Offset(0, 1) = "Winnner" '<~~ ?? spelling...??
Case "high"
' do nothing...?
Case Else
win.Offset(0, 1).ClearContents
End Select
Next win
End If
bm_Safe_Exit:
Application.EnableEvents = True
End Sub
我添加了选项代码表顶部的显式语句¹。这将要求您在使用变量之前声明变量。
我看到 N6:N88 填充了数据验证下拉列表。
¹ 在 VBE 的工具中设置需要变量声明 ► 选项 ► 编辑器属性页将放置选项每个新创建的代码表顶部的显式语句。这将避免愚蠢的编码错误,如拼写错误,并影响您在变量中使用正确的变量类型声明。不带声明的动态创建的变量都是变体/对象类型。使用选项显式是被广泛认为是"最佳实践"。
如果您使用 activeX 控件组合列表,则可以为其分配一个将在"更新"上运行的宏
检查这个
Private Sub ComboBox1_Change()
If ComboBox1.Value = "JackPot" Then
Range("o1").Offset(0, 1).Value = "Winner"
End If
End Sub
Private Sub ComboBox1_DropButtonClick()
With Me.ComboBox1
.AddItem "JackPot"
.AddItem "high"
End With
End Sub
偏移是错误的,但我一开始带着它去了其他地方......应该很容易让你在那里找出表格