2013-06-17 3 views
0

Итак, у меня есть это количество различных двухмерных массивов, которые содержат разные физические атрибуты потока (номер машины, температура и т. Д.). Мне нужно построить эти значения в excel и рассчитать разные средние значения. эти массивы объявлены глобально. Для этого я использовал для записи одну подпрограмму для каждого массива, но это не очень хороший способ, потому что вы должны держать ее как можно более общей?Передача глобальной переменной в vba функции

так, что я в конечном итоге это: подпрограмма передается массивы и соответствующий рабочий лист ...

или использовать указатели? также было бы интересно узнать, как вы решите это на других более продвинутых языках программирования (C++, ..), поскольку vba не совсем мое оружие выбора, но в этом случае оно необходимо.

Ошибки с «Несоответствие типа: ожидается массив или определенный пользователем тип!»

Когда я называю я использую:

Call WriteFlowVariable(ws_meridian_velocity, MeridSpeed(), average_MeridSpeed(), area_average_MeridSpeed(), mass_average_MeridSpeed()) 

Это подпрограмма:

Sub WriteFlowVariable(ws As Worksheet, FlowVariable() As Double, average_FlowVariable() As Double, area_average_FlowVariable(), mass_average_FlowVariable()) 

Dim i As Integer 
Dim j As Integer 

Dim sum_v As Double 
Dim FlowVariabledeltaA(1000, 300) As Double 
Dim FlowVariabledeltaA_added(1000) As Double 

Dim FlowVariabledeltaM(1000, 300) As Double 
Dim FlowVariabledeltaM_added(1000) As Double 

'write titles of the charts 
ws.Cells.Clear 

For j = 0 To SecNumber - 1 
    ws.Cells(1, j + 2).value = (j + 1) 
Next j 
ws.Cells(1, SecNumber + 2) = "Arithmetic Average" 
ws.Cells(1, SecNumber + 3) = "Area Average" 

For i = 0 To number_of_axial_positions - 1 

    sum_v = 0 

    'Write section number 
    ws.Cells(i + 2, 1).value = i + 1 

    'Write value and calculate arithmetic, mass and area average 
    For j = 0 To SecNumber - 1 
     ws.Cells(i + 2, j + 2).value = FlowVariable(i, j) 
     sum_v = sum_v + FlowVariable(i, j) 

     If j < SecNumber - 1 Then 

      FlowVariable(i, j) = FlowVariable(i, j) * deltaA(i, j) 

      FlowVariabledeltaA_added(i) = FlowVariabledeltaA_added(i) + FlowVariabledeltaA(i, j) 

      FlowVariabledeltaM(i, j) = FlowVariable(i, j) * deltaM(i, j) 

      FlowVariabledeltaM_added(i) = FlowVariabledeltaM_added(i) + FlowVariabledeltaM(i, j) 

     End If 

    Next j 

    average_FlowVariable(i) = sum_v/SecNumber 
    'Write arithmetic average to the third last column 
    ws.Cells(i + 2, SecNumber + 2) = average_FlowVariable(i) 

    area_average_FlowVariable(i) = FlowVariabledeltaA_added(i)/crosssectionareaInput(i) 
    'Write area average to the second last column 
    ws.Cells(i + 2, SecNumber + 3) = area_average_FlowVariable(i) 

    mass_average_FlowVariable(i) = FlowVariabledeltaM_added(i)/crosssectionareaInput(i) 
    'Write mass average to the last column 
    ws.Cells(i + 2, SecNumber + 4) = mass_average_FlowVariable(i) 
Next i 

End Sub 

ответ

0

я не рассматривал свой Sub слишком близко на всех, но при условии,

FlowVariable(,) As Double 
average_FlowVariable(,) As Double 
area_average_FlowVariable(,) 
mass_average_FlowVariable(,) 

все считаются правильно считающимися глобальными переменными, ваш вызов должен выглядеть следующим образом:

Call WriteFlowVariable(ws_meridian_velocity, MeridSpeed, average_MeridSpeed, area_average_MeridSpeed, mass_average_MeridSpeed) 

... Иными словами, удалите ().

Кроме того, поскольку эти 2-мерные массивы, ваш Sub должны выглядеть следующим образом:

Sub WriteFlowVariable(ws As Worksheet, FlowVariable(,) As Double, average_FlowVariable(,) As Double, area_average_FlowVariable(,), mass_average_FlowVariable(,))Dim i As Integer 

Надеется, что это делает трюк, в противном случае, Леммы знать, и я буду смотреть ближе.

+0

спасибо! он работает для меня, если вы оставите запятые в скобках для 2D-массивов. они являются статическими массивами, может быть, это и есть причина? – user2493761

+0

Nope - Это был только я, идиот :) - Вам не нужны запятые в объявлении функции, но вы определенно не можете иметь '()' в вызове функции. Рад, что ты заработал! –

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