我试图让 Excel 工作表在 B 列中输入名称时自动在 A 列中输入字符串。
我在单元格 A1 中使用此公式使其完全按照 Google 表格中的预期工作:
={"P#";ArrayFormula(IF(LEN(B2:B), SWITCH(B2:B,"Alpha", "PX", "Bravo", "P1", "Charlie", "P7", "!!"), ""))}
但我没有看到在 Excel 中执行相同操作的简单方法,除非将稍微不同(且较大)的嵌套 IF 混乱复制/粘贴到每个连续单元格中。我相信每当修改 B 列中的单元格时我应该能够运行脚本,但我以前没有使用过 VBS。
下面的脚本似乎接近我需要的,因为它仅在单元格 B2 或以下输入文本时运行,但它只返回默认情况。
Sub Worksheet_Change(ByVal Target As Range)
If Not Target.Column = 2 Then Exit Sub
Application.EnableEvents = False 'prevent endless loop
On Error GoTo Finalize 'resume events
Dim LastRow As Long, i As Long, pName As String 'initialize variables
LastRow = Range("B" & Rows.Count).End(xlUp).Row 'get range
For i = 2 To LastRow
pName = Range("B" & i).Value
Select Case pName
Case pName = "Alpha", pName = "Bravo"
Range("A" & i).Value = "P1"
Case pName = "Charlie"
Range("A" & i).Value = "P2"
Case Else 'other values
Range("A" & i).Value = "!!"
End Select
Next i
Finalize:
Application.EnableEvents = True
End Sub
鉴于输入:
Alpha, Charlie, Bravo, Xenon
预期输出为:
P1, P2, P1, !!
但输出是:
!!, !!, !!, !!
任何帮助/澄清将不胜感激。
看来问题是我对VBS不熟悉。
我已经更正了 switch 语句的语法,它现在似乎可以工作了:
Sub Worksheet_Change(ByVal Target As Range)
If Not Target.Column = 2 Then Exit Sub
Application.EnableEvents = False 'prevent endless loop
On Error GoTo Finalize 'resume events
Dim LastRow As Long, i As Long, pName As String 'initialize variables
LastRow = Range("B" & Rows.Count).End(xlUp).Row 'get range
For i = 2 To LastRow
pName = Range("B" & i).Value
Select Case pName
Case "Alpha", "Bravo":
Range("A" & i).Value = "P1"
Case "Charlie":
Range("A" & i).Value = "P2"
Case Else: 'other values
Range("A" & i).Value = "!!"
End Select
Next i
Finalize:
Application.EnableEvents = True
End Sub