Excelmacros:循环和追加

当谈到VBA和excel时,我是一个总的新手,而不是一般的编程。 看来我有相当一段时间试图破译VBA。

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

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 = "USAA" 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或USAA,而是包含这些字符集。 另外,我确定我误解了ActiveCell的工作方式,但是如果有什么东西能够让我变得更直观的话,那么我们将会是你们。

您的代码不起作用的唯一原因是您在调用ActiveCell之前忘记激活相应的单元格。

 If c.Value = "USAA" Or c.Value = "USAA" Then c.Activate 'Aha! ActiveCell.Offset(0, 2).Activate [etc.] 

当然,正如@GSerg所指出的,这个SelectActiveCell业务是不好的做法,让你的生活变得更加复杂。 @ GSerg的解决scheme工作正常。

你提到这一点

细胞的价值并不是USAA或USAA,而是包含这些字符集。

因此,我认为这是适当的,以显示如何预测错别字,并使您的代码接受像"US AA""USA,A""U..SA. ,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 
 Dim c As Range For Each c In Range("S:S").Cells If instr(c.Value, "USAA") > 0 Or instr(c.Value, "USAA") > 0 Then With c.Offset(0, 2) If .Value = "AM" then .Value = .Value & "8-10" End With End If Next c 
  • InStr在另一个string中查找一个string的第一个实例。
  • ActiveCell是活动窗口中当前选定的单元格,而不是循环计数器。 在代码中避免使用ActiveCell (和.Select )是明智的,除非你真的希望用户select一个单元,然后对其进行操作。
  • With...End With只是暂时捕获对c.Offset(0, 2)的引用的一个方便的方法,以避免显式variables或连续调用它三次。 没有这个块,那就是了

     If c.Offset(0, 2).Value = "AM" Then c.Offset(0, 2).Value = c.Offset(0, 2).Value & "8-10" End If