Excelmacros在粘贴时出错
我正在尝试创build一个可能最终变得相当庞大的excelmacros,为了让事情变得更容易,我正在一次性地处理它。 到目前为止,我有….
Sub Macro4() ' ' Test Macro ' 'Selects the product_name column by header name Dim rngAddress As Range Set rngAddress = Range("A1:Z1").Find("product_name") If rngAddress Is Nothing Then MsgBox "The product_name column was not found." Exit Sub End If Range(rngAddress, rngAddress.End(xlDown)).Select 'Inserts new column to the left of the product_name column Selection.Insert Shift:=xlToRight 'Re-selects the product_name column Range(rngAddress, rngAddress.End(xlDown)).Select 'Copys the contents of the product_name column Selection.Copy Selection.Paste End Sub
我想要它做以下…
- 在电子表格中search标题名称“product_name”
- 在“product_name”列的左侧插入一个空白列
- 复制'product_name'列的内容
- 将它们粘贴到新创build的空白列中
- 将此新列中的标题名称更改为“product_name_2”
目前它工作正常,直到粘贴到这个新创build的列,然后我得到一个
'Run-time error '438'; - Object doesn't support this property or method'
任何人都可以build议我去哪里错了吗?
你的错误是:
Range(rngAddress, rngAddress.End(xlDown)).Select
这从列顶部select到第一个空白单元之上。 插入将列的这一部分向右移动,而将其余的部分留下。 当你再次select你可能会得到一个更大的范围,因为你有两列混合。 复制失败,因为您然后试图将值复制到值的顶部。
如果没有任何意义的话,用F8单步执行macros,看看每一步发生了什么。
当你明白为什么你当前的macros不起作用时,试试这个:
Sub Macro5() Dim rngAddress As Range Dim ColToBeCopied As Integer Set rngAddress = Range("A1:Z1").Find("'product_name") If rngAddress Is Nothing Then MsgBox "The product_name column was not found." Exit Sub End If ColToBeCopied = rngAddress.Column Columns(ColToBeCopied).EntireColumn.Insert Columns(ColToBeCopied + 1).Copy Destination:=Columns(ColToBeCopied) End Sub
注意:
- 我没有select任何东西。
- 我已经把代码运行在活动页面上了,但是最好使用
With Sheets("XXX")
…End With
。
回答第二个问题
macroslogging器不擅长显示如何系统地处理个别单元格。
With Sheets("xxxx") .Cells(RowNum,ColNum).Value = "product_name 1" End With
以上用途我推荐。 注意单元格前面的点。
下面的一个在活动页面上运行。
Cells(RowNum,ColNum).Value = "product_name 1"
RowNum必须是一个数字。 ColNum可以是一个数字(比如5)或者一个字母(比如“E”)。
在你的情况RowNum是1,ColNum是ColToBeCopied和ColToBeCopied + 1。
PS
我忘记提到要find一列的botton行使用:
RowLast = Range(Rows.Count, ColNum).End(xlUp).Row
这是从底部向上而不是从顶部向下。
PS 2
使用“单元格”指定范围:
.Range(.Cells(Top,Left),.Cells(Bottom,Right))
点必须匹配:所有三个或没有。
我不确定你想拷贝到哪里,但是当你想粘贴时,你需要做一个select然后
ActiveSheet.Paste
例如:
/你的代码/
Selection.Copy
范围。( “O:O”)select
ActiveSheet.Paste
如果您只想传输值,我会避免完全复制/粘贴。
例如,而不是:
Range("B1:B100").Copy Destination:=Range("A1")
我会用:
Range("A1:A100").Value = Range("B1:B100").Value
如果我们要把它代入你的代码,并且包括Tony提出的一些评论:
Sub Macro4() Dim colFound As Integer Dim rowLast As Long Const rowSearch As Integer = 1 'Find the product_name column colFound = Rows(rowSearch).Find("product_name").Column If colFound = 0 Then MsgBox "The product_name column was not found." Exit Sub End If 'Find the last non-empty row rowLast = Cells(Rows.Count, colFound).End(xlUp).Row 'Inserts new column to the left of the product_name column Columns(colFound).EntireColumn.Insert 'Transfer the contents of the product_name column to the newly inserted one Range(Cells(rowSearch, colFound), Cells(rowLast, colFound)).Value = _ Range(Cells(rowSearch, colFound + 1), Cells(rowLast, colFound + 1)).Value 'Rename the new column Cells(rowSearch, colFound).Value = Cells(rowSearch, colFound).Value & "_2" End Sub