2015-01-15 4 views
2

У меня есть, например, два значения, каждое из которых представлено средним и стандартным отклонением. Прямо сейчас первый находится в ячейке A1 и A2, а второй - в ячейках A4 и A5, представляя среднее и stddev для каждого из них. я рассчитает в столбце В и С каждый помощью:Excel новый тип данных

=NORM.INV(RAND();$A$1;$A$2) 
=NORM.INV(RAND();$A$4;$A$5) 

Теперь в колонке DI будет делать некоторые операции с обоих терминов и Е1 я получу среднее всех точек в столбце D, и E2 в STDDEV из всех точек в столбце D.

Я хочу инкапсулировать все, используя vba, но я бы предпочел иметь значение и stddev, которые являются двумя двойниками в одной ячейке.

Как создать этот тип данных, который поддерживает два числа - в идеале я хотел бы прочитать его как (mean, stddev).

Пример ячейки A1 является (21.0,3.2), как я могу получить каждое значение от функции, в которой есть A1?

+0

Я просто должен спросить. * Почему * вы хотите поместить две отдельные части данных в одну ячейку? Конечно, то, что вы хотите, может быть сделано, но мне нужно знать * почему * перед советом. – RubberDuck

ответ

0

Самый простой способ заключается в использовании Split функцию

Function ToArray(ByVal rng As Range, Optional ByVal sDelimit As String = ",") As Double() 
Dim sNumbers() As String 
Dim dNumbers() As Double, i As Integer 

sNumbers = Split(rng, sDelimit) 
ReDim Preserve dNumbers(UBound(sNumbers)) 
For i = LBound(sNumbers()) To UBound(sNumbers()) 
    dNumbers(i) = CDbl(sNumbers(i)) 
Next 

ToArray = dNumbers 

End Function 

Вы сможете использовать его в листе Excel:

=NORM.INV(RAND();ToArray($A$1)) 
3

Вы можете создать класс like this:

класс создается так же, как модуль. По умолчанию будет создан модуль под названием «Class1». Первая задача - перейти на вкладку свойств, а переименуйте ее в нечто разумное. Стандартное соглашение об именах - это clsYourClassName, однако я лично использую c prefix, а не cls. Этот класс-модуль является вашим конструктором класса vba.

Этот класс имеет два свойства:

Option Explicit 

Private dMean As Double 
Private dStddev As Double 

Public Property Get Mean() As Double 
    Mean = dMean 
End Property 

Public Property Let Mean(p As Double) 
    dMean = p 
End Property 

Public Property Get Stddev() As Double 
    Stddev = dStddev 
End Property 

Public Property Let Stddev(p As Double) 
    dStddev = p 
End Property 

Public Sub Assign(a As Double, b As Double) 
    Mean = a 
    Stddev = b 
End Sub 

Затем вам нужно создать экземпляр класса и присвоить значение.

Я полагаю, что значение Cells(1, 1).Value что-то вроде (21.0,3.2):

Option Explicit 
Sub test() 
    Dim mc As cMyClass 
    Set mc = New cMyClass() 
    mc.Assign(Cells(1, 1).Value) 
    ' do things 

    Set mc = Nothing 
End Sub 

[EDIT]

Как я уже писал, я полагаю, что значение Cells (1, 1) .Value что-то (21,0,3,2). Если нет, и будет возвращена только одна строка, нам нужно ее проанализировать, например, :

Public Sub Assign(str As String) 
    Dim ar() As String = Split(str, ",") 
    If UBound(ar) = 2 Then 
     Mean = CDbl(ar(0)) 
     Stddev = CDbl(ar(1)) 
    End If 
End Sub 
+0

подпись 'Assign' Sub ожидает 2 параметра, пока вы, кажется, передаете ему только один аргумент:' Ячейки (1, 1) .Value'. Разве что-то не так с этим связано? –

+1

@ vba4all: Спасибо за ответ. Я отредактировал свой ответ. – duDE