2012-01-02 106 views
1

我正在嘗試創建一個可能最終變得相當大的excel宏,以使事情變得更容易我正在一次處理它。到目前爲止,我有....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' 

任何人都可以提出我要去哪裏錯了嗎?

+0

您是否嘗試記錄過程?記錄宏函數通常會提示您出錯的地方。嘗試複製某些東西並粘貼到其他地方,同時記錄並研究該代碼。 – Default 2012-01-02 15:15:06

回答

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

答到第二個問題

宏錄製不擅長展示瞭如何系統地解決單個細胞。

With Sheets("xxxx") 
    .Cells(RowNum,ColNum).Value = "product_name 1" 
End With 

上述用途With我建議。注意Cells前面的點。

下面的一個在活動工作表上運行。

Cells(RowNum,ColNum).Value = "product_name 1" 

RowNum必須是數字。 ColNum可以是一個數字(比如5)或者一個字母(比如「E」)。

在你的情況ROWNUM爲1,ColNum被ColToBeCopied和ColToBeCopied + 1

附:

我忘了提,找到一列使用的鈕行:

RowLast = Range(Rows.Count, ColNum).End(xlUp).Row 

也就是說從底部從頂部不上下移動。

P.S. 2

要使用的細胞指定一個範圍:

.Range(.Cells(Top,Left),.Cells(Bottom,Right)) 

的點必須匹配:所有三個或無。

+0

謝謝,這工作完美。感謝您解釋我哪裏錯了!我現在正忙於重命名,因爲我有兩列名爲'product_name',我怎麼能讓其中一個名稱改爲product_name_1,另一個是product_name_2? – fightstarr20 2012-01-02 16:42:59

+0

我已爲您的額外問題添加了答案。希望這是明確的。如果你接受我的回答,我將不勝感激。我必須承認我是這樣做的,而不是愛我的同胞或女人。 – 2012-01-02 17:22:13

+0

完美:)謝謝! – fightstarr20 2012-01-02 17:27:33

0

我不知道你在哪裏試圖複製到, 但是當你要粘貼你需要做一個選擇,然後
ActiveSheet.Paste
例如:

/您代碼/
Selection.Copy

範圍。( 「O:O」)選擇
ActiveSheet.Paste

0

如果您只想傳輸值,我會完全避免複製/粘貼。

,而不是例如:

Range("B1:B100").Copy Destination:=Range("A1") 

我會用:

Range("A1:A100").Value = Range("B1:B100").Value 

如果我們替代品進入你的代碼,包括一些由託尼提出的意見:

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