2015-02-09 111 views
0

基本上我有一个动态范围,将永远是在列A:C在片1我试图写个人宏拷贝的动态范围和调换这到第2页到允许邮件合并能够读取第1行作为邮件合并字段。VBA移调的动态范围在Excel

目前出现在此行中的错误:

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 

任何帮助将不胜感激。

+0

心灵添加错误消息的问题是什么?如果错误号可能会帮助我们帮助你 – 2015-02-09 05:31:59

+0

。是'1004'的原因是你的列A是空可言,也没有用'0'因此充满'lastRow'变量结果的小区,你不能创建范围,行数为0 – 2015-02-09 06:51:29

+0

结束错误确实是1004。我用El Scripto建议的代码代替,现在错误是运行时'424' - 对象需要的错误。 这个错误发生在第一场合: Sheet2.Activate – 2015-02-11 01:18:58

回答

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的建议,非常感谢。

0

在你的代码,这样做的:

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,然后按下CTRL + C,它应该将错误详细信息以纯文本复制到剪贴板,以便您可以将其粘贴到此处。

+0

你的想法是错误的。原始的和你对'Set sourceRange ='的建议不能互换使用,都可以指完全不同的范围。 – 2015-02-09 07:29:45

+0

你说得对。 “我的错”。 我更新了我的答案,以便更好地匹配他的代码。 – 2015-02-09 08:09:32

+0

仍然没有正确的,但要好得多......你应该使用类似'...细胞(rows.count, “A”)。结束(xlup)...' – 2015-02-09 08:46:16