Sub将Winner插入到O列

当用户从下拉列表中select单词累积奖金时,试图将胜利者单词插入到列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代码,保持文本input相同,没有过程覆盖它。

您正在查找的事件macros是Worksheet_Change ,而不是Worksheet_SelectionChange事件macros。

只要工作表上的任何值发生变化(而不是公式),就会触发Worksheet_Change,所以如果要使用Sub来更改列O中的值,则需要在进行更改时临时挂起事件处理,否则将风险让Worksheet_Change尝试在其上运行。

当工作表上的更改触发Worksheet_Change时,需要确定目标 (接收更改的单元)是否在您所关注的单元格范围内。 这是用相交方法完成的。 在下文中,Target中的一个或多个单元格必须位于第6行和第88行之间的第N列中。如果有一个或多个单元格,则使用For Each … Next语句遍历每个满足条件的单元格。

每个匹配的单元格都按顺序检查值。 Select Case语句轻松处理多个可能的结果。

把上面讨论的所有要点放在一起,你应该得到如下的代码。

 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语句。 这将需要你在使用它们之前声明你的variables。

我看到N6:N88填充了数据validation下拉列表。


¹ 在VBE工具中设置需要variables声明 ►选项►编辑器属性页面将把Option Explicit语句放在每个新创build的代码表的顶部。 这将避免像拼写错误这样的愚蠢的编码错误,也会影响你在variables声明中使用正确的variablestypes。 在没有声明的情况下即时创build的variables都是变体/对象types。 使用Option Explicit被广泛认为是“最佳实践”。

如果你使用了一个activeX控件combolist,那么你可以给它分配一个macros,它将运行在“更新”

检查这个

  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 

偏移量是错误的,但我首先去了别的地方….应该很容易让你找出那里的forms