当用户从下拉列表中选择单词Jackpot时,尝试将单词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代码,使文本条目保持不变,并且没有覆盖它的过程。
答案 0 :(得分:1)
您要查找的事件宏是Worksheet_Change,而不是Worksheet_SelectionChange事件宏。
只要工作表上的任何值发生更改(但不是公式),就会触发Worksheet_Change,因此,如果要使用Sub更改O列中的值,则需要在进行更改时暂时挂起事件处理或者你有可能让Worksheet_Change试图在自己的基础上运行。
当工作表上的更改触发Worksheet_Change时,您需要确定目标(接收更改的一个或多个单元格)是否在您关注的单元格范围内。这是通过Intersect method完成的。在下文中,Target中的一个或多个单元必须位于第6行和第88行之间的N列中。如果有一个或多个,则使用For Each...Next Statement来遍历满足条件的每个单元格。< / p>
每个匹配的单元格都按顺序检查它的值。 Select Case statement可以轻松处理多种可能的结果。
将上面讨论的所有要点放在一起,你应该得到如下代码。
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
我在代码表¹的顶部添加了 Option Explicit 语句。这将要求您在使用变量之前声明变量。
我看到N6:N88填充了数据验证下拉列表。
¹在VBE的工具►选项►编辑器属性页面中设置需要变量声明会将 Option Explicit 语句放在每个新的顶部创建代码表。这个 将避免像拼写错误那样愚蠢地编码错误以及影响你在变量中使用正确的变量类型 宣言。在没有声明的情况下即时创建的变量都是变体/对象类型。使用选项显式是 被广泛认为是“最佳实践”。
答案 1 :(得分:0)
IF 你使用了一个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
偏移是错误的,但我一开始就去了其他地方....应该很容易让你弄清楚那里的形式