2014-09-02 22 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

相關問題