转换2张数据

时间:2014-10-02 20:20:54

标签: excel-vba transpose vba excel

从某种意义上说,在溢出时,这个问题有两个答案。所以,我想问一下哪个更好"

可在此处找到第一个解决方案 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)),但显然必须先选择工作表才能将范围设置为它。

我希望有人可以解释为什么一个比另一个好。

2 个答案:

答案 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. 更少的代码。只需两行。
  2. 速度更快。
  3. 选项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 相比,它有更多的代码行。