Находите точные строки, проходя через диапазон, используя VBA - PullRequest
3 голосов
/ 14 июня 2019

У меня есть следующий код, который проходит через таблицу.Когда он находит слово «Отчетность» в столбце C и «OSI» в столбце B, он создает диапазон с именем «OSIRep», идущий от столбца DEF для каждой строки, где критерии в столбцах B и C являются истинными.

Set sht = ThisWorkbook.Worksheets("Features")


'Reporting and OSI

Set featuresRng = sht.Range(sht.Range("B1"), sht.Range("C" & sht.Rows.Count).End(xlUp))
rngArray = featuresRng
ReDim NewArr(1 To 1)
y = 1
For i = 1 To UBound(rngArray)
    If rngArray(i, 2) = "Reporting" And rngArray(i, 1) = "OSI" Then
        ReDim Preserve NewArr(1 To y)
        NewArr(y) = featuresRng.Rows(i).Resize(1, 3).Offset(0, 2).Address
        y = y + 1

    End If
Next i

sRng = Join(NewArr, Application.DecimalSeparator)
ThisWorkbook.Names.Add "OSIRep", sht.Range(sRng)

Однако у меня есть две проблемы с этим: 1- Когда я изменяю слово на «Безопасность» и «OSI», чтобы создать диапазон «OSISec», я получаю сообщение об ошибке и незнаю, почему.Ошибка «Ошибка во время выполнения 1004 - Метод« Диапазон »объекта» _Worksheet «Сбой», и это происходит на sht.Range (sRng)

Диапазон, в котором он ищет, ничем не отличается и имя Iпытаюсь создать еще не существует.Есть идеи?

2- Когда я изменяю строки на «Отчетность» и «Поиск и фильтр», код создает диапазон, в котором любые ячейки, содержащие слова «Поиск» или «и» или «Фильтр», включаются вспектр.Как мне найти ТОЧНУЮ строку?Я полагаю, он использует Find и xlwhole?Я не уверен, как использовать это, хотя?

Я пытался взять защиту листа, разблокировать ячейки и исследовать код ошибки, но все безрезультатно.

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

1 Ответ

1 голос
/ 14 июня 2019

Я не совсем понимаю проблему, но, возможно, есть некоторые проблемы с вашими файлами Когда я использую эту настройку теста:

enter image description here

С этим кодом:

Sub SOCode()
Set sht = ThisWorkbook.Worksheets("Features")

Set featuresRng = sht.Range(sht.Range("B1"), sht.Range("C" & sht.Rows.Count).End(xlUp))
rngArray = featuresRng

ReDim NewArr(1 To 1)
y = 1
For i = 1 To UBound(rngArray)
    If rngArray(i, 2) = sht.Range("F2") And rngArray(i, 1) = sht.Range("F1") Then
        ReDim Preserve NewArr(1 To y)
        NewArr(y) = featuresRng.Rows(i).Resize(1, 3).Offset(0, 2).Address
        y = y + 1

    End If
Next i

'delete all named ranges first
Dim nm As Name
For Each nm In ThisWorkbook.Names
    nm.Delete
Next nm

sRng = Join(NewArr, Application.DecimalSeparator)
ThisWorkbook.Names.Add sht.Range("F3").Value, sht.Range(sRng)

'delete output of named ranges from last test
Range("H2:H1000").ClearContents

'paste named ranges in col "H"
i = 2
For Each nm In ThisWorkbook.Names
    Cells(i, 8).Value = nm.Name
    i = i + 1
Next nm
End Sub

Все возможные вами строки работают на моем сайте.

enter image description here Я хотел бы создать новый файл и проверить его снова. Я изменил ваш код только при чтении возможных строк из столбца F (OSI в F1, например, report = F2, rangeName = F3) и в конце вставил все созданные имена в столбец H только для отладки. Помните, что я получаю сообщение об ошибке, когда комбинация не найдена, поскольку создание именованного диапазона с пустой строкой в ​​«sRng» приводит к ошибке, конечно.

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