【问题标题】:VBA Transposing a dynamic range in excelVBA在excel中转​​置动态范围
【发布时间】:2015-02-12 12:19:20
【问题描述】:

基本上,我有一个动态范围,它将始终位于表格 1 的 A:C 列中。我正在尝试编写一个个人宏来复制动态范围并将其转置到表格​​ 2 上,以允许邮件合并能够将第 1 行读取为邮件合并字段。

目前错误出现在这一行:

Set sourceRange = ActiveSheet.Range(Cells(1, 1), Cells(lastRow, 1))

下面列出了整个代码。我可能遗漏了一个简单的错误,或者甚至可能有一种更简单的方法来实现我想要的结果,但这是我目前想出的。

Sub TrasposeData()
'
' TrasposeData Macro
' Takes the data from sheet one and transpose it to sheet 2 to allow for mail merge compatibility.

Sheet1.Activate

Dim sourceRange As Range
Dim targetRange As Range
Dim lastRow As Long

lastRow = WorksheetFunction.CountA(Range("A:A"))
Set sourceRange = ActiveSheet.Range(Cells(1, 1), Cells(lastRow, 1))

Sheet2.Activate

Set targetRange = ActiveSheet.Cells(1, 1)

Sheet1.Activate

sourceRange.Copy

Sheet2.Activate

targetRange.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=True

' Keyboard Shortcut: Ctrl+t
'
    Application.Run "PERSONAL.XLSB!TrasposeData"
    ActiveWindow.Close
End Sub

任何帮助将不胜感激。

【问题讨论】:

  • 介意在问题中添加错误信息吗?可以帮助我们帮助您
  • 如果错误没有。是1004 原因是您的A 列完全是空的,因此没有填充单元格,因此lastRow 变量结果为0,并且您无法创建以行号0 结尾的范围。
  • 错误确实是 1004。我替换了 El Scripto 建议的代码,现在错误是运行时 '424' - Object required 错误。第一次出现此错误:Sheet2.Activate

标签: vba excel


【解决方案1】:

所以我今天花了一点时间研究,终于让它工作了。脚本贴在下面:

Sub TransposeData()
'
' TransposeData Macro
' Traspose the data on sheet1 to sheet2 to allow for mail merge
'

Sheets("Sheet1").Select

Dim sourceRange As Range
Dim lastRow As Long

lastRow = Cells(Rows.Count, "A").End(xlUp).Row

Set sourceRange = ActiveSheet.Range("A1:C" & lastRow)

sourceRange.Copy

Sheets("Sheet2").Select

Cells(1, 1).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone,    SkipBlanks:=False, Transpose:=True

' Keyboard Shortcut: Ctrl+Shift+T
'
End Sub

感谢 El Scripto 和 KazJaw 的建议,非常感谢。

【讨论】:

    【解决方案2】:

    在你的代码中,做:

     lastRow = WorksheetFunction.CountA(Range("A:A"))
     Set sourceRange = ActiveSheet.Range(Cells(1, 1), Cells(lastRow, 1))
    

    计算非空单元格的数量,但它可能不会给您最后一个单元格(逻辑错误)。就像 KazJaw 上面写的那样,这也可能是导致错误的原因。

    更好的方法是使用(它替换上面两行):

      Set SourceRange = ActiveSheet.Range(Cells(1, 1), _
                             Cells(ActiveSheet.UsedRange.Rows.Count, 1))
    

    试一试,如果失败,请贴出错误信息。

    复制错误的简单方法是单击错误消息框,然后 按 CTRL+C,它会以纯文本的形式将错误详细信息复制到剪贴板,因此您可以将其粘贴到此处。

    【讨论】:

    • 你的想法是错误的。原始和您对Set sourceRange= 的提议不能互换使用,两者可以指完全不同的范围。
    • 你是对的。 “我的错”。我更新了我的答案以更好地匹配他的代码。
    • 仍然不正确,但要好得多......你应该使用类似...cells(rows.count, "A").end(xlup)...
    猜你喜欢
    • 1970-01-01
    • 2019-06-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-21
    • 1970-01-01
    相关资源
    最近更新 更多