2015-04-30 3 views
2

Я пытаюсь пройти через столбец в excel с помощью VBA, у меня проблема, потому что «W2» жестко закодирован в функции, так как я перебираю электронную таблицу, W2 необходимо изменить на W3, W4 W5 и т. Д.Loop через столбец

ниже - мой код.

Function GetTopDrTS(L_NumCellsFromEdge As Integer, L_NumOfCells As Integer) As Double 
    'Get Top Drive Side Triple Spot calculation 

    Dim val As Double 
    val = 0 

    'Select Cell W2 to set starting position 
    Range("W2").Select 

    'Read in the cells we need to average 
    Dim i As Integer 
    For i = 0 To L_NumOfCells - 1 
    val = val + Selection.Worksheet.Cells(Selection.Row, _ 
       Selection.Column + EdgePos + L_NumCellsFromEdge + i).Value 
    Next i 

    GetTopDrTS = val/L_NumOfCells 

end function 

ответ

0

Попробуйте это:

'Read in the cells we need to average 
    Dim i As Integer 
    For i = 0 To L_NumOfCells - 1 
    range("W" & i).select 
    val = val + Selection.Worksheet.Cells(Selection.Row, _ 
       Selection.Column + EdgePos + L_NumCellsFromEdge + i).Value 
    Next i 
+0

Вы имели в виду диапазон ("W2" и i) .выбрать? –

+0

Нет, я этого не делал. 'Range (" W2 ")' является жестко закодированной ссылкой на одну ячейку, и именно это заставляет ваш код не зацикливаться. 'Range (« W »& i)» удаляет номер жесткой кодированной строки и заменяет его переменной «i», которая каждый раз изменяется через ваш цикл. 'Range (« W2 »& i)» также не будет жестко закодирован, но даст вам строки «21-29», затем «210-299», затем «2100-2199» и т. Д., Так как «i» увеличивается - вероятно, не то, что вам нужно. Попробуйте, посмотрите, что произойдет, затем выполните код в отладчике (нажмите клавишу «F8»), чтобы выполнить одну строку за раз и посмотреть, какая ячейка выбрана. – FreeMan

1

Я не знаю, почему вы должны цикла вообще. Ваша функция просто вычисляет среднее значение, поэтому вместо этого используйте функцию Average. Это уменьшает вашу функцию в одну строку:

Function GetTopDrTS(L_NumCellsFromEdge As Integer, L_NumOfCells As Integer) As Double 

    GetTopDrTS = WorksheetFunction.Average(Range("W2:W" & L_NumOfCells + 1)) 

End Function 

Теперь, это точно одна строка, я бы избавиться от функции целиком и использовать только WorksheetFunction везде, где обычно называют GetTopDrTS.

Обратите внимание, что из вопроса или кода неясно, что должны быть EdgePos и L_NumCellsFromEdge - если они предназначены для замены жестко закодированного столбца «W», было бы довольно легко заменить его на смещение.

+0

Это только даст мне среднее значение w2, однако я хочу получить средний W2, w3, + .... + w1326. возможно, я должен опубликовать весь мой код –

+0

@BobbyJalloh - Нет, он даст среднее значение того диапазона, который он создает, на основе входного параметра 'L_NumOfCells'. Если вы 'L_NumOfCells = 100', он вычисляет значение« WorksheetFunction.Average (Range («W2: W101»)). – Comintern