可在此处找到第一个解决方案 Excel VBA - Range.Copy transpose paste 基本上它暗示了这个
Worksheets("Sheet1").Range("A1:A5").Copy
Worksheets("Sheet2").Range("A1").PasteSpecial Transpose:=True
我还没有把它绑起来,但它看起来好像应该有效
可在此处找到下一个解决方案 Transpose a range in VBA 并使用此方法
Sub transposeTest()
Dim transposedVariant As Variant
Dim sourceRowRange As Range
Dim sourceRowRangeVariant As Variant
Sheets("Sheet1").Select ' NOTE: I added this
Set sourceRowRange = Range("A1:H1") ' one row, eight columns
sourceRowRangeVariant = sourceRowRange.Value
transposedVariant = Application.Transpose(sourceRowRangeVariant)
Sheets("Sheet2").Select ' NOTE: I added this
Dim rangeFilledWithTransposedData As Range
Set rangeFilledWithTransposedData = Range("I1:I8") ' eight rows, one column
rangeFilledWithTransposedData.Value = transposedVariant
End Sub
我已经使用了这个,是的确有效,尽管我必须使用表格(" Sheet1")。选择和表格(" Sheet2")。在上面的空白处选择。我在一个声明中尝试了所有 设置sourceRowRange =表格(" Sheet1")。范围(单元格(1,1),单元格(1,8)),但显然必须先选择工作表才能将范围设置为它。
我希望有人可以解释为什么一个比另一个好。
答案 0 :(得分:1)
不是答案,但对评论来说太大了......
没有工作表限定符的 Cells()
始终默认为当前的活动工作表,因此您应该执行以下操作:
With Sheets("Sheet1")
Set sourceRowRange = .Range(.Cells(1,1), .Cells(1, 8))
End With
或(更简单):
Set sourceRowRange = Sheets("Sheet1").Cells(1,1).Resize(1,8)
答案 1 :(得分:1)
在这么小的一组数据上,你不能说哪个更好。在您的方案中,我个人的选择是 Option1 。为什么?因为代码较少。 :)
选项1的优点
选项1的缺点
使用剪贴板,如果不明智地使用,可能会产生问题。
例如
Worksheets("Sheet1").Range("A1:A5").Copy
Worksheets("Sheet1").Range("X1").Value= "Sid"
Worksheets("Sheet2").Range("A1").PasteSpecial Transpose:=True
如果您执行任何操作(例如写入单元格),Excel将清除剪贴板,因此下一个PasteSpecial
行将失败,因为它在剪贴板中找不到任何内容。有些情况下,即使以下两行也会因大量数据而失败。
Worksheets("Sheet1").Range("A1:A5").Copy
Worksheets("Sheet2").Range("A1").PasteSpecial Transpose:=True
原因是,数据尚未完全放在剪贴板中并且下一行被执行并且因为它没有在剪贴板中找到任何内容而失败。因此,为了对抗它,可以使用以下方法
Worksheets("Sheet1").Range("A1:A5").Copy
DoEvents
Worksheets("Sheet2").Range("A1").PasteSpecial Transpose:=True
选项2的优点
不使用剪贴板。数据存储在数组中。存储数据后,可以多次使用。如果剪贴板被清除,您不必一次又一次地“复制”数据,如果 Option1 ,则可能需要这样做。
选项2的缺点
与 Option1 相比,它有更多的代码行。