从表中的每一行中选择一列

时间:2014-09-02 11:07:01

标签: vba excel-vba excel

我有一个表格结构(表名:表2),如下所示:

Table data

使用VBA,我想通过遍历每一行来选择当前行的单个列值。 这是代码,我写道:

Function findColumnValue(strColCombIdent As String, strColumnName As String) As String
    On Error Resume Next

       Dim strRetResult As String

        Dim wsMapMasterRefSheet As Worksheet
        'Referes to the table Table2.
        Dim loMapMaster As ListObject
        Set wsMapMasterRefSheet = ThisWorkbook.Worksheets("Sheet3")
        Set loMapMaster = wsMapMasterRefSheet.ListObjects("Table2")

        'All rows of the table Table2
        Dim rAllRows As Range
        Set rAllRows = loMapMaster.DataBodyRange

        'Holds one row from the databody range for processing.
        Dim rCurrRow As Range

        'Process data
        Dim strTemp As String

        For Each rCurrRow In rAllRows

            strTemp = rCurrRow.Columns(2)

            Debug.Print strTemp
        Next rCurrRow

    findColumnValue = strRetResult
End Function

我希望得到如下结果(仅限第2列的值):

1.5
1.5
1.8
4
3
3
1
2

10
12
5
7

相反,我最终会得到类似这样的内容(对于每个处理行,从第2列开始的所有值。)

1.5
0.045150462962963

1.5
4.52083333333333E-02

1.8
4.72685185185185E-02

4
0.168090277777778

3
3.1

3
8.47800925925926E-02

1
4.16666666666667E-02

2
8.33449074074074E-02




10
10.1.1.1

12
1.3.4.5

5
0.212511574074074

7
8.54166666666667E-02

使用

strTemp = rCurrRow.Columns(1, 2)

而不是

strTemp = rCurrRow.Columns(2)

导致运行时错误1004

因为每次迭代都指向For循环中的范围对象;我正在考虑使用

rCurrRow.Columns(2)

将指向当前Row的第2列,因此只打印列的值。 我的逻辑错位了吗?

另外一个问题:

为什么“MSDN Excel参考指南”将列描述为属性;清楚地显示"列"用法明确需要参数

以下是我提到的链接: http://msdn.microsoft.com/en-us/library/office/ff197454(v=office.15).aspx

2 个答案:

答案 0 :(得分:1)

指定要迭代行:

    For Each rCurrRow In rAllRows.Rows

或者只看一下ListRows:

Function findColumnValue(strColCombIdent As String, strColumnName As String) As String
    On Error Resume Next

       Dim strRetResult As String

        Dim wsMapMasterRefSheet As Worksheet
        'Referes to the table Table2.
        Dim loMapMaster As ListObject
        Set wsMapMasterRefSheet = ThisWorkbook.Worksheets("Sheet3")
        Set loMapMaster = wsMapMasterRefSheet.ListObjects("Table2")

        'All rows of the table Table2
        Dim rAllRows As ListRows
        Set rAllRows = loMapMaster.ListRows

        'Holds one row from the databody range for processing.
        Dim rCurrRow As ListRow

        'Process data
        Dim strTemp As String

        For Each rCurrRow In rAllRows

            strTemp = rCurrRow.Range(, 2)

            Debug.Print strTemp
        Next rCurrRow

    findColumnValue = strRetResult
End Function

答案 1 :(得分:0)

您可以随意调用变量rCurrRow; VBA仍然不知道你的意思是它包含整行范围rAllRows。它只是假设rCurrRow代表一个单元格,这样For Each rCurrRow In rAllRows表示"对于此范围内的每个单独的单元格"。

您需要做的是限制循环播放的范围。这应该工作;未经测试。

    For Each rCurrRow In rAllRows.Columns(2)
        strTemp = rCurrRow
        Debug.Print strTemp
    Next rCurrRow

事实上,我根本不会调用该变量rCurrRow;如果您打算以这种方式使用它,请将其称为而是cell

编辑:既然您已在下面的评论中澄清了您的问题,那么您可以这样做:

    For i = 1 To rAllRows.Rows.Count
        Set rCurrRow = rAllRows.Rows(i)
        strTemp = rCurrRow.Cells(1,2)
        Debug.Print strTemp
    Next i

但更好更快的是将整个范围一次加载到二维Variant数组,然后循环遍历该数组 - 比循环遍历许多单元格要快得多。

    Dim v As Variant
    v = rAllRows ' load entire range to a 2D array
    For i = 1 To UBound(v,1)
        strTemp = v(i,2)
        Debug.Print strTemp
    Next i        
  

为什么“MSDN Excel参考指南”将列描述为属性;清楚地显示"列"用法明确需要参数

方法和属性都可以使用参数。区别或多或少如下:

  • 属性是您可以获得的内容(例如范围' Address,不带参数,或子范围,例如ColumnRow或{{ 1}},其中和/或设置(如范围' s Cells.Interior.Color状态)。它们通常是名词。

  • 方法是事物的事物/范围,因此通常是动词。与.Hidden(不带参数)或.Select(带一个参数)甚至.Copy一样。