2012-02-08 2 views
0

У меня есть подпрограмма «Дни», которая имеет переменные дни. Я хочу передать значения образуют что дни переменной в другой подпрограмме "GetDays"Передача значения переменной между несколькими подпрограммами

Для например:

Sub Day() Dim Days() как вариант дней = Array (1,3,5,7 , 10,11) End Sub

Sub GetDay() 'Как мне получить значения Days здесь? End Sub

ответ

1

Не совсем уверен, что я понимаю, что вам нужно, но я думаю, что вы хотите создать объект «DayClass», который сохраняет значения дней и возвращает их другим функциям, когда они необходимо:

(1) в редакторе VBA, вставить CLASS модуль с

(2) в окне свойств этого модуля, измените имя на (скажем) DayClass (переопределяя имя по умолчанию «Класс 1».)

(3) поместить этот код в модуль DayClass:

Private mDays As Variant ' member variable to hold the days array 

' initialization method to populate the array 
Private Sub Class_Initialize() 
    mDays = Array(1, 3, 5, 7, 10, 11) 
End Sub 

' little function to return a particular value from the array 
Public Property Get Day(i As Long) 
    Day = mDays(i) 
End Property 

(4) Для того, чтобы увидеть код, указанный выше в действии, вставить правильный модуль и поставить эту маленькую функцию в нем, который может быть вызван из строки формул (если вы хотите):

Public Function GetDays(i As Long) 
    Dim DC As New DayClass ' DC is dim'd of type DayClass 
          ' so via DC you can get at whatever is in there 
    GetDays = DC.Day(i)  ' this function returns the i'th value of the 
          ' array in DayClass, via DayClass's "Get Day" property    
End Function 

(5) Так как «GetDays» является публичной функции в обычном модуле кода, вы можете проверить это, введя следующую формулу в любую ячейку таблицы:

=GetDays(3) 

cell result = 7 
+0

Спасибо! это помогает. Однако массив mDays не является фиксированным и будет обновляться в соответствии с пользовательским вводом. Я знаю, что он будет иметь длину 5, но входы неизвестны – user793468

+0

Нет способа сделать это, не создавая объект? например, иметь массив mDays в модуле вместо модуля Class, а затем вызвать его в другом модуле? – user793468

+0

Вы можете сделать это и в модулях - и все будет выглядеть одинаково. Как бы то ни было, вы можете думать о каждом регулярном модуле кода как о «одноэлементном классе», который не нужно создавать перед использованием (например, статический класс в C#), и любая переменная, которую вы размещаете вверху, будет работать точно так же, как член класса переменные. Затем просто сделайте «Get Day» функцией, а не свойством, и до использования любого значения из mDays убедитесь, что он был инициализирован первым (например, тест для пустого и, если это так, вызовите процедуру инициализации). – tpascale

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