9

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

我对 VBA 很陌生,对函数也不太了解。

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

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

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

4

6 回答 6

17

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

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

要将转置后的值作为一个范围,您必须通过工作表传递它,如本答案所示。如果不了解协方差函数的工作原理,就很难看出您需要什么。

于 2012-11-01T11:45:46.590 回答
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

Transpose 函数采用 Variant 类型的参数并返回 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”,那么Range("a1:h1").Value是一个二维变量数组,维度为 1 到 1、1 到 8。当您调用Transpose(Range("a1:h1").Value)时,您会得到转置的二维变体数组,尺寸为 1 到 8、1 到 1。如果你调用Transpose(Transpose(Range("a1:h1").Value))你会得到维度为 1 到 8的一维变体数组。

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

如果源范围会有更多的行(列),例如“a1:h3”,那么转置函数只会像这样改变尺寸:1 到 3、1 到 8 转置到 1 到 8、1 到 3,反之亦然。

希望我没有让你感到困惑,我的英语很糟糕,对不起:-)。

于 2012-11-01T10:49:57.193 回答
0

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

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

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

于 2012-11-01T10:27:05.050 回答
0

严格按照书中的“转置”开头,任何一个都可以;即,application.transpose() 或 worksheetfunction.transpose(),根据经验,如果你真的喜欢打字,application.WorksheetFunction.Transpose() 也可以工作——

于 2014-07-25T17:26:16.517 回答
0

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

Sub PasteVal()
    Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks _
    :=False, Transpose:=True
End Sub
于 2021-07-14T10:08:00.290 回答
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

于 2017-01-15T15:33:42.630 回答