2011-07-12 52 views
2

虽然对于VBA和Excel来说,我是一个总的新手,而不是一般的编程。似乎我有相当长的一段时间试图破译VBA。Excel宏:循环并追加

我想要做的是通过列中未知数量的行进行循环,然后如果它包含特定的首字母缩写词,它将检查不同列中的同一行,它将根据第二个字段追加两个字符串中的一个细胞的内容。这段代码似乎不起作用,但也许它将有助于阐明我所得到的结果。

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
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 
    
+0

很好的代码!如果我可以提出这个建议,我最近注意到,当使用Instr时,检查不等式的速度比值大于0的速度要快,因此您可以使用“<> 0”而不是“> 0”进行轻微的速度提升。当然,在大量值上使用代码时,它确实会有所作为。 – aevanko

+0

并且在第二行中添加.SpecialCells(xlCellTypeConstants)将避免循环遍历列的空单元格,同时也节省了一些处理 –

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