我有一个表格结构(表名:表2),如下所示:
使用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
答案 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
,不带参数,或子范围,例如Column
或Row
或{{ 1}},其中和/或设置(如范围' s Cells
或.Interior.Color
状态)。它们通常是名词。
方法是做事物的事物/范围,因此通常是动词。与.Hidden
(不带参数)或.Select
(带一个参数)甚至.Copy
一样。