Excel VBA Возвращает номер строки / индекс из диапазона ("rngNme"). Столбцы (n). Ячейки - PullRequest
0 голосов
/ 11 ноября 2018

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

Я вставил несколько сообщений msgbox, чтобы перехватить данные, и механизм выхода, чтобы выйти из цикла. Это я прокомментировал ниже, а также строки данных, которые не работают. «cbdata» - это рабочая книга с именем B5: T4019. Отчет составляется на другом листе (activesheet). По какой-то неизвестной причине при циклическом обходе без вывода каких-либо данных «r» обновляется до некоторых ложных чисел, таких как 2421 (первый цикл), это как-то связано с данными в «cbdata». Первая запись фактически находится в строке 2388, поэтому она не соответствует индексируемой строке в диапазоне. Тем не менее, я думаю, прежде всего, мне нужно выяснить, что я могу сделать, чтобы получить соответствующий ряд, возвращаемый для каждого из моих проходов. «ky» возвращает все записи в столбцах (19), но меня интересуют только те, которые соответствуют «ledcdeyr», в данном случае это «2012017», этот бит работает, возвращая все записи, соответствующие в цикле. Получив согласующуюся ключевую информацию, как я могу связать это с номером строки, чтобы можно было извлечь другие данные из этой строки.

(cr is vbcrlf) (r должен быть номером строки получающего отчета)

Любые указатели будут с благодарностью.

Code:
r = r + 1    ' row 38 when entering process

For Each ky In Range("cbdata").Columns(19).Cells

'ans = MsgBox(ky & cr & r, vbOKCancel)
'If ans = vbCancel Then Exit Sub

If ky = ledcdeyr Then

ans = MsgBox(ky & cr & r, vbOKCancel)
If ans = vbCancel Then Exit Sub

 Cells(r, 2) = Range("cbdata").Cells(ky, 1)
'Cells(r, 3) = Range("cbdata").Columns(2).Cells
'Cells(r, 4) = Range("cbdata").Columns(3).Cells
'Cells(r, 5) = Range("cbdata").Columns(4).Cells
'Cells(r, 6) = Range("cbdata").Columns(5).Cells

ans = MsgBox(r, vbOKCancel + vbQuestion, title)
If ans = vbCancel Then Exit Sub

End If

r = r + 1
Next     

Ответы [ 2 ]

0 голосов
/ 11 ноября 2018

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

Public Sub Test()
    Dim ky As Range, counter As Long
    Dim loopRange As Range
    'Set loopRange = ThisWorkbook.Worksheets("Sheet1").Range("cbdata").Columns(19)
    Set loopRange = Range("cbdata").Columns(19) ' workbook range name
    For Each ky In loopRange.Cells
        counter = counter + 1
            'ans = MsgBox(counter & vbCrLf & ky & vbCrLf & ky.Row, vbOKCancel)
            'If ans = vbCancel Then Exit Sub
        If ky = 2012017 Then
            Debug.Print ky.Row, counter
            Debug.Print loopRange(counter).Address
        End If
    Next
End Sub

Результаты отладки при запуске приведенного выше кода для первых 4 записей были:

 2388          2384 
$CNK$5:$CNK$4091
 2408          2404 
$COE$5:$COE$4091
 2444          2440 
$CPO$5:$CPO$4091
 2450          2446 
$CPU$5:$CPU$4091

Цифры слева от ky.row правильные. Цифры справа каким-то образом относятся к счетчику, который здесь должен быть 1, 2, 3, 4. Это та же самая ситуация, которая произошла с моим «r» и, следовательно, не давала информацию, где я ожидал ее увидеть. Что заставило меня думать, что ky.row не работает. Также мой диапазон "cbdata" - B5: T4091. Строки верны, но есть "CNK" и т. Д. - я не знаю, откуда это взялось. Я думал, что просто вернусь к вам, где я нахожусь, и ваш ответ, безусловно, заставил меня взглянуть дальше, поскольку я, казалось, ходил кругами. Если у вас есть идеи, как счетчик будет действовать так злобно, то, возможно, вы дадите мне знать. Использование вашего кода само по себе устраняет любую проблему, так как нет проблем с любой другой частью моего кода. Еще раз спасибо.

0 голосов
/ 11 ноября 2018

Я не совсем уверен, что следую, но объект Range во время цикла равен ky.Строка для этой ячейки извлекается с помощью свойства .Row

ky.Row

Несколько случайный пример с условным тестом:

Option Explicit
Public Sub Test()
    Dim ky As Range, counter As Long
    Dim loopRange As Range
    Set loopRange = ThisWorkbook.Worksheets("Sheet1").Range("cbdata").Columns(19)
    For Each ky In loopRange.Cells
        counter = counter + 1
        If ky = 1 Then
            Debug.Print ky.Row, counter
            Debug.Print loopRange(counter).Address
        End If
    Next
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...