2014-01-13 24 views
0

我正在嘗試做這項工作,但它說Type mismatch。任何幫助我做錯了什麼? (我是很新的這一點)複製範圍的類型不匹配錯誤。

Sub Copy_paste_XP() 

Dim wsI As Worksheet 
Dim aCell As Range, rngCopyFrom As Range, rng As Range 
Dim lRow As Long 

Set wsI = ThisWorkbook.Sheets("Move containers XP") 

Set rng = ("E2:E500") 

For Each aCell In rng 
    If Len(Trim(aCell.Value)) <> 0 Then 
     If rngCopyFrom Is Nothing Then 
      Set rngCopyFrom = aCell 
     Else 
      Set rngCopyFrom = Union(rngCopyFrom, aCell) 
     End If 
    End If 
Next 

If Not rngCopyFrom Is Nothing Then rngCopyFrom.Copy 

Range("K2").Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
:=False, Transpose:=False 
Set rng = ("F2:F500") 

For Each aCell In rng 
    If Len(Trim(aCell.Value)) <> 0 Then 
     If rngCopyFrom Is Nothing Then 
      Set rngCopyFrom = aCell 
     Else 
      Set rngCopyFrom = Union(rngCopyFrom, aCell) 
     End If 
    End If 
Next 

If Not rngCopyFrom Is Nothing Then rngCopyFrom.Copy 
Range("K501").Select 
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ 
:=False, Transpose:=False 

End Sub 
+0

當它引發錯誤時,哪一行會突出顯示?另外,我看到你從本質上重複了你的代碼*兩次。你能解釋一下你想做什麼嗎?我相信有一種更有效的方法。 :) – Manhattan

+0

哪行有'類型不匹配'? – L42

+0

Sub Copy_paste_XP()<---突出顯示爲黃色 – Forbidden

回答

1

首先,你沒有正確設置變量。您使用Set rng = ("E2:E500")時應該是Set rng = wsI.Range("E2:E500")

此外,宏可以變得更加靈活。下面的代碼應該工作:

Sub CopyNotZero(SrcRng As Range, DestRng As Range) 
    Dim Cell As Range, RngToCopy As Range 
    For Each Cell In SrcRng 
     If Cell.Value <> 0 And Len(Cell.Value) <> 0 Then 
      If RngToCopy Is Nothing Then 
       Set RngToCopy = Cell 
      Else 
       Set RngToCopy = Union(RngToCopy, Cell) 
      End If 
     End If 
    Next Cell 
    If Not RngToCopy Is Nothing Then 
     RngToCopy.Copy 
     DestRng.PasteSpecial xlPasteValues 
    End If 
    Set RngToCopy = Nothing 
End Sub 

使用方法如下:

Sub Test() 
    Dim wsI As Worksheet: Set wsI = ThisWorkbook.Sheets("Move containers XP") 
    With wsI 
     CopyNotZero .Range("E1:E500"), .Range("K2") 
     CopyNotZero .Range("F1:F500"), .Range("K501") 
    End With 
End Sub 

這將跳過所有細胞0值或者根本沒有值。

截圖:

設置:

enter image description here

運行Test()後結果:

enter image description here

希望這會有所幫助。

編輯:

要叫你粘貼到$A$2這個宏每次,下面的代碼就可以了(相應的修改):

Private Sub Worksheet_Change(ByVal Target As Range) 
    If Target.Address = "$A$2" Then 
     CopyNotZero Range("A1:A500"), Range("K2") 
    End If 
End Sub 

希望這有助於。

+0

只是好奇......爲什麼'在錯誤恢復下一個「? –

+0

@SiddharthRout:哎呀。另外,忘了一些東西。現在編輯。 – Manhattan

+1

另外'RngToCopy.Copy DestRng'將失敗,如果'RngToCopy'什麼都不是。你需要額外的檢查'如果不rngCopyFrom是沒有然後RngToCopy.Copy DestRng' –

0

E2:E500 < ----這是選擇了我。我試圖讓它複製e2:e500並在K2中粘貼值然後複製f2:f500,然後通過K501中的值粘貼它們,同時排除0或空格 - 禁止9分鐘前

Set rng =(「E2: E500「)

您錯過了Range這個詞。將其更改爲

Set rng = wsI.Range("E2:E500") 

編輯

同樣,對於Set rng = ("F2:F500")

而且這似乎是從你PREV問題進行隨訪。我看你仍在使用.Select;)

+0

哈哈是啊。你的方法爲我工作,除了某些原因它複製0和其他原因它粘貼在K和L. – Forbidden