簡體   English   中英

Excel VBA-確定陣列UDF的列或行目標

[英]Excel VBA - Determining Column or Row Target of Array UDF

我有一個簡單的Excel UDF,用於將質量值數組轉換為摩爾分數。 大多數情況下,輸出將是一個列數組(n行乘1列)。

如何在VBA環境中確定工作表上目標單元格的尺寸,以確保應按n行乘1列而不是n行乘1行的方式返回工作表?

Function molPct(chemsAndMassPctsRng As Range)

Dim chemsRng As Range
Dim massPctsRng As Range
Dim molarMasses()
Dim molPcts()

Set chemsRng = chemsAndMassPctsRng.Columns(1)
Set massPctsRng = chemsAndMassPctsRng.Columns(2)

chems = oneDimArrayZeroBasedFromRange(chemsRng) 
massPcts = oneDimArrayZeroBasedFromRange(massPctsRng)

'oneDimArrayZeroBasedFromRange is a UDF to return a zero-based array from a range.

ReDim molarMasses(UBound(chems))
ReDim molPcts(UBound(chems))

totMolarMass = 0

For chemNo = LBound(chems) To UBound(chems)

    molarMasses(chemNo) = massPcts(chemNo) / mw(chems(chemNo))
    totMolarMass = totMolarMass + molarMasses(chemNo)

Next chemNo

For chemNo = LBound(chems) To UBound(chems)

    molPcts(chemNo) = Round(molarMasses(chemNo) / totMolarMass, 2)

Next chemNo

molPct = Application.WorksheetFunction.Transpose(molPcts)

End Function

我了解,如果沒有其他問題,如果return應該作為行數組,則可以有一個輸入參數來標記。 我希望不要走那條路。

這是一個UDF()的小例子:

  1. 接受可變數量的輸入范圍
  2. 提取這些范圍內的唯一值
  3. 創建一個合適的輸出數組(列,行或塊)
  4. 將唯一值轉儲到該區域

Public Function ExtractUniques(ParamArray Rng()) As Variant
    Dim i As Long, r As Range, c As Collection, OutPut
    Dim rr As Range, k As Long, j As Long

    Set c = New Collection
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    '   First grab all the data and make a Collection of uniques
    '
    '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    On Error Resume Next
        For i = LBound(Rng) To UBound(Rng)
            Set r = Rng(i)
            For Each rr In r
                c.Add rr.Value, CStr(rr.Value)
            Next rr
        Next i
    On Error GoTo 0
   '''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
   '
   '    next create an output array the same size and shape
   '    as the worksheet output area
   '
   ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    k = 1
    With Application.Caller
        ReDim OutPut(1 To .Rows.Count, 1 To .Columns.Count)
    End With

    For i = LBound(OutPut, 1) To UBound(OutPut, 1)
        For j = LBound(OutPut, 2) To UBound(OutPut, 2)
            If k < c.Count + 1 Then
                OutPut(i, j) = c.Item(k)
                k = k + 1
            Else
                OutPut(i, j) = ""
            End If
        Next j
    Next i
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''
    '
    '   put the data on the sheet
    '
    ''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''''

    ExtractUniques = OutPut
End Function

您應該返回二維數組:行的n×1,列向量的n×1。

所以你需要

Redim molPcts(1, Ubound(chems) + 1)

要么

Redim molPcts(Ubound(chems) + 1, 1)

要引用它們,您需要使用兩個索引:

molPcts(1, chemNo + 1)

要么

molPcts(chemNo + 1, 1)

如果您更喜歡基於0的數組,則redim應該如下所示:

Redim molPcts(0 To 0, 0 To Ubound(chems))
Redim molPcts(0 To Ubound(chems), 0 To 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM