Скопируйте и вставьте данные на основе текста в ячейку рядом с ним - PullRequest
2 голосов
/ 15 апреля 2020

Я хочу, чтобы код проверял каждую ячейку в диапазоне «A3: AAA3» для определенного c текста. Если ячейка содержит этот текст, я хочу, чтобы он скопировал текст в ячейку справа в две строки выше (см. Иллюстрацию ниже):

enter image description here

Скопированный текст будет датой.

У меня уже есть фрагмент кода, который идентифицирует каждый столбец с этим текстом и устанавливает ширину столбца:

Dim c as Range
    For Each c In Range("A3:AAA3").Cells
        If c.Value = "TEXT" Then
            c.EntireColumn.ColumnWidth = 4
        End If
    Next c

Я могу использовать Скопируйте и вставьте, если ячейка уже выбрана:

Dim s As Range
Set s = Selection.Cells(1)

            s.Offset(0, 1).Copy
            s.Offset(-2, 0).PasteSpecial xlPasteAll

И я чувствую, что я должен быть в состоянии объединить два в нечто вроде ниже, так что он выбирает ячейку с текстом, а также копирует и вставляет ячейка рядом с ней, а затем зацикливается на следующей (что-то вроде ниже?), но все мои попытки не работают - она ​​не выдает сообщение об ошибке, просто ничего не делает.

Dim c As Range

    For Each c In Range("A3:AAA3").Cells
        If c.Value = "TEXT" Then
            c.Select
            c.Offset(0, 1).Copy
            c.Offset(-2, 0).PasteSpecial xlPasteAll
            End If
    Next c

Мысли? Я уверен, что это очень простое решение, но я немного застрял.

1 Ответ

2 голосов
/ 15 апреля 2020

c.Value = "TEXT" проверит, является ли значение точно TEXT, но в вашем примере это 1 TEXT, поэтому оно всего , как TEXT. Поэтому нам нужно использовать заполнитель и оператор like.

Dim c As Range
For Each c In Range("A3:AAA3").Cells
    If c.Value Like "*TEXT*" Then
        c.Offset(0, 1).Copy Destination:=c.Offset(-2, 0)
    End If
Next c

Обратите внимание, что вы можете копировать / вставлять в одну строку.
И вам не нужно c.Select (см. Как избежать использования Select в Excel VBA .)

Обратите внимание, что Excel не знает, в каком листе этот диапазон равен Range("A3:AAA3").Cells, лучше указать этот лист, как ThisWorkbook.Worksheets("MySheet").Range("A3:AAA3").Cells

Наконец, во всех случаях полезно, если вы шаг за шагом отлаживаете свой код с помощью F8, чтобы вы могли видеть, что ваш код делает на каждом шаге, и исследовать значения ваших переменных, чтобы увидеть, где именно он идет не так.


Off Topi c:

Я бы даже предпочел следующий стиль:

c.Offset(ColumnOffset:=1).Copy Destination:=c.Offset(RowOffset:=-2)

, который читается более интуитивно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...