2014-09-02 51 views
0

我有结构(表名:表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) 

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

一个额外的问题:

为什么在MSDN的Excel参考指南描述列的属性;其中作为明确的“列”的使用显然需要参数

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

回答

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 
+0

这太神奇了。像魅力一样工作。只需要注意,当我将For循环内的语句“strTemp = rCurrRow.Range(,2)”更改为“strTemp = rCurrRow.Range(0,2)”时,它还会打印标题行值“MajorVersion”。你能否请请遮住一些灯光。虽然接受答案。 – Ayusman 2014-09-02 16:32:27

+0

'rCurrRow.Range(,2)'相当于'rCurrRow.Range(1,2)',它指向同一行和第二列。 0表示上面的行。 – Rory 2014-09-02 19:37:45

+0

非常感谢。说得通。 – Ayusman 2014-09-03 04:18:22

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,它没有任何参数,或者子范围,如Column或或Cells,该做的)和/或设置(如范围的.Interior.Color.Hidden状态)。他们通常是名词。

  • 方法是做的事情东西与/范围,因此通常是动词。像.Select(不带参数)或.Copy(带一个参数)或者甚至是.Speak

+0

感谢。但是我遍历每一行的意图仍然是访问当前行的其他部分。我知道我可以使用像FIND这样的东西来实现我想要做的事情。但是我所遵循的过程的概念/逻辑并没有错,至少我认为是这样。 – Ayusman 2014-09-02 11:26:08

相关问题