2015-05-27 1 views
0

У меня есть вектор (как строка и столбец), так и я хочу вычислить определенную функцию (например, x + 5) для каждого значения в этом векторе, а I хотите, чтобы он отображался в указанном массиве ячеек. Я написал функцию, и в Excel она работает для одной ячейки или для вектора строки. Но когда я пытаюсь использовать его на векторе столбца, он возвращает значение, вычисленное для первой ячейки для всех значений в массиве. Не могли бы вы помочь мне, что я сделал неправильно или почему он не работает? Мой код lookd как этотVBA: Как я могу заставить свою функцию работать как для вертикального, так и для горизонтального вектора

Option Base 1

Public Function TestFunction(arr As Range) As Variant 
Dim i As Integer 
Dim j As Integer 
Dim NoCols As Integer 
Dim NoRws As Integer 
Dim FV() As Double 

NoCols = arr.Columns.Count 
NoRws = arr.Rows.Count 


If NoCols = 1 Then 
    ReDim FV(NoRws) 
    For i = 1 To NoRws 
     x = arr.Rows(i) 
     FV(i) = x + 5 
    Next i 

Else 
ReDim FV(NoCols) 
    For j = 1 To NoCols 
    y = arr.Columns(j) 
    FV(j) = y + 5 
    Next j 

End If 

TestFunction = FV() 

End Function 
+0

что такое 'FX' в вашем коде, Вы имели в виду, чтобы иметь' FV' вместо – Jeanno

+0

Вы ReDim FX, но объявляете и возвращаете FV. Я не понимаю, как это будет работать в любом случае. Является ли этот код точной копией вашего рабочего кода? – Sobigen

+0

Да, я имел в виду FV, просто набрав ошибку. Я уже исправил это. в моем исходном коде это то же самое, и он не работает –

ответ

0

Я подозреваю, что это будет его возвращать вектор-строку, если вектор-строка задается и вектор-столбец, если вектор-столбец задается. Если да, то:

Public Function TestFunction(arr As Range) As Variant 
Dim i As Integer 
Dim j As Integer 
Dim NoCols As Integer 
Dim NoRws As Integer 
Dim FV() As Double 

NoCols = arr.Columns.Count 
NoRws = arr.Rows.Count 

If NoCols = 1 Then 
    ReDim FV(1 To NoRws, 1 To 1) ' column vector = multiple rows, 1 column = FV(row, 1), using (1 to ...) DIMs to avoid Option Base 1 
    For i = 1 To NoRws 
    x = arr.Cells(i, 1) 
    FV(i, 1) = x + 5 
    Next i 
ElseIf NoRws = 1 Then 
    ReDim FV(1 To 1, 1 To NoCols) ' row vector = 1 row, multiple columns = FV(1, column) 
    For j = 1 To NoCols 
    y = arr.Cells(1, j) 
    FV(1, j) = y + 5 
    Next j 
End If 

TestFunction = FV() 

End Function 
+0

Большое вам спасибо, это именно то, что мне нужно. У меня есть вопрос, хотя ... почему я должен избегать использования «Option Base 1»? это просто меньше, чем одна строка в коде или может вызвать какие-либо проблемы? –

+0

Это просто мое соглашение, потому что я не могу полагаться на базу опций. См. Https://msdn.microsoft.com/en-us/library/aa266179%28v=vs.60%29.aspx: «База опций не влияет на ParamArray (или функцию массива, если она имеет имя с ее именем библиотека, например VBA.Array) ". И объекты извне модуля также не будут затронуты. Поэтому, на мой взгляд, лучше сразу объявить LBound. –

0

Не бороться против использования два размерных массив.

Это будет работать для одной строки или одного столбца или блока ячеек:

Option Base 1 

Public Function TestFunction(arr As Range) As Variant 
    Dim i As Long 
    Dim j As Long 
    Dim NoCols As Long 
    Dim NoRws As Long 
    Dim FV() 

    NoCols = arr.Columns.Count 
    NoRws = arr.Rows.Count 
    FV = arr 

    For i = 1 To NoRws 
     For j = 1 To NoCols 
     FV(i, j) = FV(i, j) + 5 
     Next j 
    Next i 

    TestFunction = FV() 

End Function 

enter image description here

+0

В этом специальном случае ваше решение лучше. Но вы также работаете с двухмерным массивом. И нужно знать, как работают такие типы массивов. Что делать, если он явно не работает с блоком ячеек? И/Или, если функция для векторов строк отличается от функции для векторов столбцов? –

+0

@AxelRichter. Вы правы .............. особые случаи. Требуются специальные подходы .............. для опубликованного примера добавления ** 5 * * к произвольному массиву мой подход будет работать независимо от того, является ли вход одной строкой или одним столбцом или простым блоком ячеек. ** Ячейки функций должны быть вставлены в устройство, которое изоморфно входной схеме. ** –

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