Excel宏在粘贴时给出错误

时间:2012-01-02 14:39:47

标签: excel vba excel-vba

我正在尝试创建一个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

我希望它能够做到以下几点......

  • 在电子表格中搜索标题名称'product_name'
  • 'product_name'
  • 的左侧插入一个空白列
  • 复制'product_name'
  • 的内容
  • 将它们粘贴到新创建的空白列
  • 将此新列中的标题名称更改为'product_name_2'

目前它工作正常,直到粘贴到这个新创建的列,然后我得到

'Run-time error '438'; - Object doesn't support this property or method'

有人可以建议我哪里出错吗?

3 个答案:

答案 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

注意:

  1. 我没有选择任何东西。
  2. 我已将代码保留在活动工作表上,但最好使用With Sheets("XXX") ... End With
  3. 回答第二个问题

    宏录像机不擅长如何系统地处理单个细胞。

    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