Range.Find работает с отдельной ячейкой, но пропускает ее при цикле - PullRequest
0 голосов
/ 26 марта 2020

Вот полный код. Он берет ключевое слово или фразу из нижней части листа, находит его в верхней части листа и вставляет соседнюю ячейку рядом с ключевым словом. Таким образом, если внизу написано «Население», оно находит население вверху, проходит одну ячейку, чтобы получить 35 987, и вставляет 35 987 рядом с Населением внизу листа. (На самом деле это вставка формулы, но проблема не в копировании / вставке).

Sub FindTest()
'
' FindTest Macro
'
Dim cArray As Variant
Dim rArray As Variant


Application.ScreenUpdating = False
cArray = Array(1, 3, 5, 7, 9, 11)
rArray = Array(1, 2, 4, 6, 8, 10, 12, 14, 16, 18, 20, 22, 24, 26, 28, 30, 32, 34, 36, 42, 44, 46, 48, 54, 56, 58, 60, 63, 65, 67, 69, 71, 73, 75, 77, 79)
For Each i In cArray
    For Each j In rArray
'Start one cell up and one cell to the left of BI ILF
        Range("Q141").Offset(j, i).Select
        fname = Selection.Text
'Range for floc is entire original Attributes section
        Set floc = Range("P5:Y130").Find(fname, LookIn:=xlValues, LookAt:=xlWhole)
        If Not floc Is Nothing Then
            faddy = floc.Address
            Range(faddy).Offset(0, 1).Select
            Selection.Cut
'Range matches original starting cell
            Range("Q141").Offset(j, i + 1).Activate
            ActiveSheet.Paste
        Else
            GoTo Skip
        End If
Skip:
    Next j
Next i

Application.ScreenUpdating = True
End Sub

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

Sub Searcher()
'
' FindTest Macro
'
        Range("AF153").Select
        fname = Selection.Text
'Range for floc is entire original Attributes section
        Set floc = Range("P5:Y130").Find(fname, LookIn:=xlValues, LookAt:=xlWhole)
        If Not floc Is Nothing Then
            faddy = floc.Address
            Range(faddy).Offset(0, 1).Select
            Selection.Cut
'Range matches original starting cell
            Range("AG153").Activate
            ActiveSheet.Paste

        End If
End Sub

Итак: Почему это сработало, когда я жестко кодирую конкретную ячейку, но пропускаю ее, когда она выполняет ту же функцию, но внутри al oop? Диапазон ключевых слов, которые не работают, варьируется от отдельных слов до коротких фраз alphanumeri c. Напомним, что оригинальный код находит около 60% ключевых слов.

Спасибо!

1 Ответ

0 голосов
/ 26 марта 2020

Как насчет этого?

for i = 1 to 11 step 2
    for j = 2 to 79 step 2
        ''Your code
    next j
next i

Не думаю, что вам нужен массив, если разница между двумя переменными одинакова.

Но если вы хотите определить массив, тогда сделать это так:

dim rArray(1 to 6) as integer
rArray(1) = 1
rArray(2) = 3
rArray(3) = 5 
rArray(4) = 7
rArray(5) = 9
rArray(6) = 11
''Do same for cArray
    for i = 1 to 6
        '' Your code
        range("Q141").offset(rArray(j),cArray(i))
    next i

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