2014-09-02 2 views
0

У меня есть таблица, структурированная (Table Name: Table2), как показано ниже:Выбор одного столбца из каждой строки в таблице

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

С каждой итерации указывает на объект диапазона в цикл; Я думал, используя

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

это потрясающе. Работал как шарм. Просто обратите внимание, что когда я изменяю оператор «strTemp = rCurrRow.Range (, 2)» внутри Для цикла к «strTemp = rCurrRow.Range (0, 2)» он также печатает значение строки заголовка «MajorVersion». Не могли бы вы, пожалуйста, затенить свет. Принимая ответ, хотя. – Ayusman

+0

'rCurrRow.Range (, 2)' эквивалентно 'rCurrRow.Range (1, 2)', который относится к той же строке и ко второму столбцу. 0 относится к строке выше. – Rory

+0

большое спасибо. Имеет смысл. – Ayusman

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.

EDIT: Теперь, когда вы прояснили свой вопрос в комментарии ниже, вы можете сделать это:

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

Смежные вопросы