【问题标题】:VBA: turning a 1x1 matrix into an integerVBA:将 1x1 矩阵转换为整数
【发布时间】:2016-01-20 16:09:00
【问题描述】:

我有一个来自以下的 1x1 数组:

Dim wbottom As Variant
wbottom = WorksheetFunction.MMult(WorksheetFunction.transpose(e), wtop)

我正在尝试获取数组中的数字。 wbottom(0,0) 和 wbottom(1,1) 给出“下标超出范围”。当我尝试用 MsgBox 打印数字时,ReDim-ming 什么也没给出。我该如何解决这个问题?

【问题讨论】:

  • 你不能只访问矩阵的“第一个元素”而不是尝试携带“整个矩阵”[我知道这解决了同样的问题]?
  • 怎么样?将 x 调暗为整数; x = ???
  • 不应该只是x = WorksheetFunction.MMult(WorksheetFunction.transpose(e), wtop)(0,0)吗?在两个维度的列表中首先表示数组的元素?我假设矩阵函数自动使用从 0 开始的二维数组。
  • 同样的错误,下标超出范围。
  • VarType(wbottom) 的值是多少?

标签: vba excel


【解决方案1】:

如果结果矩阵是 1x1,则结果数组是一维的,唯一有效的下标是 1。见下文,其中 A1:E1A3:A7 分别包含 1x5 和 5x1 矩阵的值(这样乘法结果为 1x1 矩阵):

Sub mmultTest()
    Dim v As Variant
    v = WorksheetFunction.MMult(Range("A1:E1"), Range("A3:A7"))
    Debug.Print LBound(v)
    Debug.Print UBound(v)
    Debug.Print v(1)
End Sub

输出如下:

1
1
55

【讨论】:

    【解决方案2】:

    你可以试试

    wbottom = WorksheetFunction.SumProduct(e, wtop)
    

    将一列转换为一行,然后将其乘以一列以获得 1x1 矩阵,从而得到一个 1x1 矩阵,其唯一元素是两列的点积。函数SumProduct已经是点积了,不需要转置再解包。

    为了测试这一点,我设置了一个看起来像这样的工作表

        A  B
       ------
        1  4
        2  5
        3  6
    

    然后运行以下代码:

    Sub test()
        Dim A As Range, B As Range, product As Variant
    
        Set A = Range("A1:A3")
        Set B = Range("B1:B3")
    
        With Application.WorksheetFunction
            product = .MMult(.Transpose(A), B) 'what you have
            Debug.Print TypeName(product)
            Debug.Print product(1)
    
            product = .SumProduct(A, B)
            Debug.Print TypeName(product)
            Debug.Print product
        End With
    End Sub
    

    结果输出:

    Variant()
     32 
    Double
     32 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-11-25
      • 1970-01-01
      • 2015-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-29
      • 2019-02-06
      相关资源
      最近更新 更多