【问题标题】:Excel macro : loop and appendExcel宏:循环和追加
【发布时间】:2011-07-12 21:02:46
【问题描述】:

我是 VBA 和 excel 方面的新手,而不是一般的编程。似乎我有相当长的时间试图破译 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 的工作原理,但如果有什么能让我直截了当的话,那就是你们。

【问题讨论】:

    标签: excel vba loops


    【解决方案1】:

    您的代码不起作用的唯一原因是您在调用 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
    

    【讨论】:

      【解决方案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
        

      【讨论】:

      • 非常好的代码!如果我可以建议的话,我最近注意到在使用 Instr 时,检查不等式比检查值大于 0 时更快,因此您可以使用 " 0" 而不是 "> 0" 来稍微提高速度.当然,只有在对大量值使用代码时才会真正有所作为。
      • 并在第二行添加 .SpecialCells(xlCellTypeConstants) 将避免循环遍历列的空单元格,也节省了一些处理
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-03-09
      • 1970-01-01
      • 2011-07-15
      • 1970-01-01
      相关资源
      最近更新 更多