Excel宏:循环和追加

时间:2011-07-12 21:02:46

标签: excel vba loops

对于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是如何工作的,但如果有什么能让我直截了当那就是你们。

2 个答案:

答案 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指出的那样,这个SelectActiveCell业务是不好的做法,会让你的生活更加复杂。 @ 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