Макрос Excel: цикл и добавление - PullRequest
2 голосов
/ 13 июля 2011

Я абсолютный новичок, когда дело доходит до 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 илиUSAA, но будет содержать эти наборы символов.Кроме того, я уверен, что неправильно понимаю, как работает ActiveCell, но если что-то и поможет, то это вы, ребята.

Ответы [ 2 ]

3 голосов
/ 13 июля 2011

Единственная причина, по которой ваш код не работал, это то, что вы забыли активировать соответствующую ячейку перед вызовом 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 или USAA, но будет содержать эти наборы символов.

Поэтому я подумал, что было бы целесообразно показать, как вы можете предвидеть опечатки и заставить свой код принимать такие вещи, как "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 голосов
/ 13 июля 2011
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
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...