在VBA中转置范围

时间:2012-11-01 10:14:30

标签: excel vba excel-vba

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

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

Range(InRng).Select
Set Range1 = Selection
Dim DestRange As Range
Set DestRange = Application.WorksheetFunction.Transpose(Range1)

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

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

6 个答案:

答案 0 :(得分:10)

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

Dim X() As Variant
Dim XT() As Variant
X = ActiveSheet.Range("InRng").Value2
XT = Application.Transpose(X)

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

答案 1 :(得分:5)

首先复制源范围,然后使用Transpose:= True,short sample:

复制目标范围
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

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

我将尝试解释'调用转置两次'的目的。 如果你在Excel中有行数据,例如“a1:h1”然后范围(“a1:h1”)。值 2D变体数组,其中dimmensions 1为1,1至8 。 当你调用转置(范围(“a1:h1”)。值)然后你得到转换 2D变体数组,尺寸 1到8,1到1 < / strong>即可。如果你调用转置(转置(范围(“a1:h1”)。值))你得到 1D变体数组,维度 1到8。

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

如果源范围包含更多行(列),例如“a1:h3”然后转置功能只会改变这样的尺寸: 1到3,1到8转换为1到8,1到3反之亦然。 < / p>

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

答案 2 :(得分:0)

您不需要这样做。以下是如何创建协方差方法:

http://www.youtube.com/watch?v=RqAfC4JXd4A

或者,您可以使用Excel具有的统计分析包。

答案 3 :(得分:0)

严格参考“转置”的前言,通过本书,任何一个都可以工作;即application.transpose()OR worksheetfunction.transpose(),根据经验,如果你真的喜欢打字,application.WorksheetFunction.Transpose()也会起作用 -

答案 4 :(得分:0)

这样的事情应该适合你。

Sub CombineColumns1()
    Dim xRng As Range
    Dim i As Long, j As Integer
    Dim xNextRow As Long
    Dim xTxt As String
    On Error Resume Next
    With ActiveSheet
        xTxt = .RangeSelection.Address
        Set xRng = Application.InputBox("please select the data range", "Kutools for Excel", xTxt, , , , , 8)
        If xRng Is Nothing Then Exit Sub
        j = xRng.Columns(1).Column
        For i = 4 To xRng.Columns.Count Step 3
            'Need to recalculate the last row, as some of the final columns may not have data in all rows
            xNextRow = .Cells(.Rows.Count, j).End(xlUp).Row + 1

            .Range(xRng.Cells(1, i), xRng.Cells(xRng.Rows.Count, i + 2)).Copy .Cells(xNextRow, j)
            .Range(xRng.Cells(1, i), xRng.Cells(xRng.Rows.Count, i + 2)).Clear
        Next
    End With
End Sub

你也可以这样做。

Sub TransposeFormulas()
    Dim vFormulas As Variant
    Dim oSel As Range
    If TypeName(Selection) <> "Range" Then
        MsgBox "Please select a range of cells first.", _
                vbOKOnly + vbInformation, "Transpose formulas"
        Exit Sub
    End If
    Set oSel = Selection
    vFormulas = oSel.Formula
    vFormulas = Application.WorksheetFunction.Transpose(vFormulas)
    oSel.Offset(oSel.Rows.Count + 2).Resize(oSel.Columns.Count, oSel.Rows.Count).Formula = vFormulas
End Sub

有关详细信息,请参阅此处。

http://bettersolutions.com/vba/arrays/transposing.htm

答案 5 :(得分:0)

如果您只想复制和转置剪贴板中的值,您可以使用以下 makro:

Sub PasteVal()
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=True
End Sub