我试图通过VBA宏在Excel中转置一系列单元格,但是我遇到了一些错误,主要是错误91.
我对VBA很新,对功能也不太了解。
Range(InRng).Select
Set Range1 = Selection
Dim DestRange As Range
Set DestRange = Application.WorksheetFunction.Transpose(Range1)
经过几个论坛后,这就是我想出的。需要注意的一点是,我不必将它们复制到任何其他单元格中。
我想要实现的是创建一个协方差方法,在选项窗口中,用户可以选择范围,然后按列或行选择,这将影响生成的协方差矩阵。
答案 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)
答案 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
有关详细信息,请参阅此处。
答案 5 :(得分:0)
如果您只想复制和转置剪贴板中的值,您可以使用以下 makro:
Sub PasteVal()
Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
End Sub