Excel VBA从Range(“ rngNme”)。Columns(n).Cells返回行号/索引

时间:2018-11-10 21:13:32

标签: excel vba

我想生成一个与密钥匹配的多个项目的小型报告。在我的循环中,我得到了返回的键,但无法理解如何访问其他列中保存的报表中所需的数据。

我放入了一些msgbox来捕获数据,并使用了转义机制来退出循环。我在下面注释了这些内容以及无效的数据行。 “ cbdata”是一个名为B5:T4019的工作簿。该报告正在另一张表(活动表)上进行编译。由于某些未知原因,在不输出任何数据的情况下进行循环遍历,“ r”被更新为一些虚假数字,例如2421(第一个循环),这似乎以某种方式链接到了“ cbdata”中的数据。第一个条目实际上在行2388中,因此它实际上与该范围中的索引行不相关。但是,我认为首先我需要弄清楚我该怎么做才能使我的每个通行证返回对应的行。 “ ky”返回column(19)中的所有条目,但我只对那些与“ ledcdeyr”匹配的对象感兴趣,在本例中为“ 2012017”,该位可以返回循环中所有匹配的条目。 取得关键信息的同意后,如何将其与行号相关联,以便可以从该行中提取其他数据。

(cr是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 :(得分:1)

我不确定是否完全遵循,但是循环期间的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

答案 1 :(得分:0)

我在我的项目上运行了被略微修改的代码,但是它产生了一些虚假的结果。 我已经尝试过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条记录的Debug结果为:

 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”等-我不知道那是从哪里来的。 我以为我会反馈给您我现在所在的位置,您的回信无疑使我看起来更进一步,因为我似乎在转圈。 如果您知道柜台的行为会如此虚假,那么也许您可以让我知道。单独使用您的代码可以解决任何问题,而我的代码的任何其他部分都不会出现问题。再次感谢。