对于VBA而言,我是一个全新的人,虽然不是一般的编程。似乎我有很长一段时间试图破译VBA。
我想要做的是,循环遍历列中未知数量的行,然后如果它包含特定的首字母缩略词,它将检查不同列中的同一行,它将根据第二个单元格附加两个字符串中的一个内容。这段代码似乎不起作用,但也许它有助于阐明我的目标。
Sub AppendMacro()
'
'Append Macro
'Keyboard Shortcut: Ctrl+l
'
Dim c As Range
For Each c In Range("S:S")
If c.Value = "USAA" Or c.Value = "U.S.A.A" Then
ActiveCell.Offset(0, 2).Select
If ActiveCell.Value = "AM" Then
ActiveCell.Value = ActiveCell.Value & "8-10"
End If
End If
Next c
End Sub
我知道的一件事是,单元格的价值并不完全是USAA或U.S.A.A,但会包含这些字符集。另外,我确信我误解了ActiveCell是如何工作的,但如果有什么能让我直截了当那就是你们。
答案 0 :(得分:3)
您的代码无效的唯一原因是您在调用ActiveCell
之前忘记激活相应的单元格。
If c.Value = "USAA" Or c.Value = "U.S.A.A" Then
c.Activate 'Aha!
ActiveCell.Offset(0, 2).Activate
[etc.]
当然,正如@GSerg指出的那样,这个Select
和ActiveCell
业务是不好的做法,会让你的生活更加复杂。 @ GSerg的解决方案运行良好。
你提到
单元格的值不完全是USAA或U.S.A.A,但会包含这些字符集。
因此,我认为展示如何预测拼写错误并让代码接受"US A A"
,"U.S.A,A"
或"U..S.A.. ,A"
之类的内容是合适的。
Dim c As Range
Dim s As String
For Each c In Range("S:S").Cells
' Get the cell content
s = c.Value
' Cleanse it of "noise" characters
s = Replace(s, ".", "")
s = Replace(s, ",", "")
s = Replace(s, " ", "")
s = Replace(s, "whatever other characters may pollute USAA", "")
' Does the cleansed string contain "USAA"?
If InStr(s, "USAA") <> 0 Then ' wink to @Issun
With c.Offset(0, 2)
If .Value = "AM" Then .Value = .Value & "8-10"
End With
End If
Next c
答案 1 :(得分:2)
Dim c As Range
For Each c In Range("S:S").Cells
If instr(c.Value, "USAA") > 0 Or instr(c.Value, "U.S.A.A") > 0 Then
With c.Offset(0, 2)
If .Value = "AM" then .Value = .Value & "8-10"
End With
End If
Next c
InStr
在另一个字符串中找到第一个字符串实例。ActiveCell
是活动窗口中当前选定的单元格,而不是循环计数器。建议避免在代码中使用ActiveCell
(和.Select
),除非您确实希望用户选择一个单元格然后对其进行操作。 With...End With
只是暂时捕获c.Offset(0, 2)
引用的一种方便方法,可以避免显式变量或连续三次调用它。没有这个块,它将是
If c.Offset(0, 2).Value = "AM" Then
c.Offset(0, 2).Value = c.Offset(0, 2).Value & "8-10"
End If