在VBA中转置范围

Abh*_*Net 6 excel vba excel-vba

我试图通过VBA宏在Excel中转​​置一系列单元格,但我收到一些错误,主要是错误91.

我对VBA很新,对功能也不太了解.

Range(InRng).Select
Set Range1 = Selection
Dim DestRange As Range
Set DestRange = Application.WorksheetFunction.Transpose(Range1)
Run Code Online (Sandbox Code Playgroud)

经过几个论坛后,这就是我想出的.需要注意的一点是,我不必将它们复制到任何其他单元格中.

我想要实现的是创建一个协方差方法,在选项窗口中,用户可以选择范围,然后按列或行选择,这将影响生成的协方差矩阵.

Jam*_*ull 10

这会将X和X'作为可以传递给另一个函数的变量数组.

Dim X() As Variant
Dim XT() As Variant
X = ActiveSheet.Range("InRng").Value2
XT = Application.Transpose(X)
Run Code Online (Sandbox Code Playgroud)

要将转置值作为范围,您必须通过工作表传递它,如本答案中所示.如果没有看到你的协方差函数如何工作,很难看出你需要什么.

  • 不应该是Application.WorksheetFunction.Transpose(X) (3认同)

dee*_*dee 6

首先复制源范围,然后使用Transpose:= True,短样本粘贴特殊目标范围:

Option Explicit

Sub test()
  Dim sourceRange As Range
  Dim targetRange As Range

  Set sourceRange = ActiveSheet.Range(Cells(1, 1), Cells(5, 1))
  Set targetRange = ActiveSheet.Cells(6, 1)

  sourceRange.Copy
  targetRange.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True
End Sub
Run Code Online (Sandbox Code Playgroud)

Transpose函数接受Varaiant类型的参数并返回Variant.

  Sub transposeTest()
    Dim transposedVariant As Variant
    Dim sourceRowRange As Range
    Dim sourceRowRangeVariant As Variant

    Set sourceRowRange = Range("A1:H1") ' one row, eight columns
    sourceRowRangeVariant = sourceRowRange.Value
    transposedVariant = Application.Transpose(sourceRowRangeVariant)

    Dim rangeFilledWithTransposedData As Range
    Set rangeFilledWithTransposedData = Range("I1:I8") ' eight rows, one column
    rangeFilledWithTransposedData.Value = transposedVariant
  End Sub
Run Code Online (Sandbox Code Playgroud)

我将尝试解释" 调用两次转置 " 的目的.如果您在Excel中有行数据,例如"a1:h1",那么范围("a1:h1").值2D变体数组,其中dimmensions为1到1,1到8.当你调用Transpose(Range("a1:h1").Value)然后你得到转换的2D Variant Array,其尺寸为1到8,1到1.如果你调用Transpose(Transpose(Range("a1:h1").Value))你得到1D变体数组,其大小为1到8.

第一个转置将行更改为列,第二个转置将列更改回行但只有一个维度.

如果源范围将有更多行(列),例如"a1:h3",则转置功能只会改变这样的尺寸:1到3,1到8转换为1到8,1到3,反之亦然.

希望我没有混淆你,我的英语很糟糕,对不起:-).