我正在尝试创建一个excel宏,它可能最终变得非常大,为了让事情变得更容易,我一次只能解决它。到目前为止,我有......
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
我希望它能够做到以下几点......
目前它工作正常,直到粘贴到这个新创建的列,然后我得到
'Run-time error '438'; - Object doesn't support this property or method'
有人可以建议我哪里出错吗?
答案 0 :(得分:4)
您的错误是:
Range(rngAddress, rngAddress.End(xlDown)).Select
从列顶部向下选择第一个空白单元格的正上方。插入件将柱的这一部分向右移动,使其余部分移动到原位。当您再次选择时,您可能会获得更大的范围,因为您混合了两列。复制失败,因为您正在尝试将值复制到值的顶部。
如果这没有意义,请使用F8逐步查看宏,看看每一步发生了什么。
当您了解当前宏无效的原因时,请尝试以下操作:
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
注意:
With Sheets("XXX")
... End With
。回答第二个问题
宏录像机不擅长如何系统地处理单个细胞。
With Sheets("xxxx")
.Cells(RowNum,ColNum).Value = "product_name 1"
End With
以上使用我推荐的With
。注意细胞前面的点。
下面的内容适用于活动表。
Cells(RowNum,ColNum).Value = "product_name 1"
RowNum必须是数字。 ColNum可以是数字(例如5)或字母(例如“E”)。
在你的情况下,RowNum为1,ColNum为ColToBeCopied,ColToBeCopied为+。
<强> P.S。强>
我忘了提到要找到列的botton行:
RowLast = Range(Rows.Count, ColNum).End(xlUp).Row
这是从底部向上而不是从顶部向上移动。
<强> P.S。 2 强>
使用单元格指定范围:
.Range(.Cells(Top,Left),.Cells(Bottom,Right))
点必须匹配:全部三个或没有。
答案 1 :(得分:0)
我不确定你要复制到哪里,
但是当你想要粘贴时,你需要做出选择,然后再进行选择
的 ActiveSheet.Paste 强>
例如:
/您的代码/
Selection.Copy
范围。( “O:O”)选择
ActiveSheet.Paste
答案 2 :(得分:0)
如果您只想传输值,我会完全避免复制/粘贴。
例如,而不是:
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