Есть ли способ в VBA скопировать строку на другой лист, если одна из ячеек в строке содержит «Color AP»? - PullRequest
1 голос
/ 31 октября 2019

По сути, у меня есть один лист в Excel с огромной диаграммой, на которой написано, что продукт XX запущен, и какие типы проверок он должен был выполнить, прежде чем пройти. Я хочу скопировать каждую строку с проверкой Цвета, однако это может быть в разных столбцах внизу строки, так как это может быть не первая проверка, которая была выполнена.

Я уже прошел несколько различныхвещи, сталкивающиеся с similair и другие проблемы: .AutoFilter: независимо от того, какой столбец фильтруется первым, он удаляется из других возможных столбцов, в которых может быть отмечена проверка «Цвет». Я создавал один из них, но потом продумал логику и понял, что это не сработает.

    Dim wsData As Worksheet
    Dim wsDest As Worksheet
    Dim ColorAP() As String
    Set wsData = Sheets("Reactor 8 New Way")    'Copying FROM this worksheet (it contains your data)
    Set wsDest = Sheets("Color AP Analysis")
    ReDim ColorAP(1 To 3)
    ColorAP(1) = "Color AP"
    ColorAP(2) = "Color AP"
    ColorAP(3) = "Color AP"
    With wsData.Range("A1", wsData.Cells(wsData.Rows.Count, "A").End(xlUp))
        .AutoFilter 1, ColorAP, xlFilterValues   'Filter using the array, this avoids having to do a loop`

        'Copy the filtered data (except the header row) and paste it as values
        .Offset(1).EntireRow.Copy
        wsDest.Cells(wsDest.Rows.Count, "A").End(xlUp).Offset(1).PasteSpecial xlPasteValues
        Application.CutCopyMode = False     'Remove the CutCopy border
        .AutoFilter     'Remove the filter
    End With

Проблема, с которой я сталкиваюсь при каждой попытке, заключается в невозможности просмотреть каждый столбец перед копированием. Я действительно не хочу делать огромный вложенный оператор if с циклом, который проверяет каждый столбец в строке, чтобы увидеть, говорит ли он «Цвет». Я бы лучше проверил каждый столбец, чтобы найти все «Цвет» и скопировал эти строки, однако некоторыепродукты будут проверяться на «Цвет» более одного раза, и я не хочу дубликатов. Кроме того, для скопированных строк я не хочу, чтобы все столбцы на странице были только первые 26. Я делаю это на рабочем ноутбуке, который не способен выполнять сотни строк кода, поэтому на всех других моих кодах япопытаться найти самый маленький способ сделать это. Изображение листа ниже

https://imgur.com/a/aFPFaOG

1 Ответ

0 голосов
/ 31 октября 2019

быстрый пример моих комментариев (не проверено):

dim rng as range, rc as long, cc as long, i as long
dim r as long, c as long, match_arr as variant, data_arr as variant
set rng = activesheet.usedrange
rc = rng.rows.count
cc = rng.columns.count
data_arr = rng.value
redim match_arr(rc) 'safety net in case all have it
i = 1
for c = 1 to cc
    for r = 1 to rc
        if ucase(data_arr(r,c)) = "COLOR AP" then
            match_arr(i) = r
            i = i+1
            exit for
        end if
    next r
next c

exit for в цикле строк, так как вы ищете только строки для копирования, будет вашим ключом к скорости. Затем вы можете использовать rows(match_arr()) для цикла и dest.value=src.value.

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