2016-04-05 27 views
0

我對VBA相當陌生,所以我的許多代碼就是我在互聯網上研究並放在一起的代碼。有點背景,我試圖實現: -對象所需的運行時錯誤VBA搜索不同的工作簿時

我有兩本作品的書有相同的佈局。一本工作手冊是我原來的VBA代碼保存的,另一本是一種覆蓋文檔。我在Overlay中有一個帶有代碼的列,並且如果找到該代碼,則需要搜索原始工作簿的相同列,然後將整個行從疊加層複製到原始層中,並刪除在原始層中找到的行(如果未找到它)原來只是爲了複製行。

的代碼,我得到的運行時錯誤的路線是: -

Set rngFound = Workbooks("OverLay").Worksheets("Overlay").Range("G:G").Find(What:=r.Value, LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) 

下面是我使用的代碼的摘錄。雖然它看起來像你的搜索欄

Dim originalWS  As Worksheet '// give your variables meaningful names! 
Dim overlayWS  As Worksheet 
Dim rngSearchParam As Range 
Dim rngFound  As Range 

Set originalWS = Workbooks("Original").Sheets("Formatted") 
Set overlayWS = Workbooks("Overlay").Sheets("Overlay") 

With overlayWS 
    For Each rngSearchParam In Intersect(.Range("G:G"), .UsedRange) 

     Set rngFound = .Range("G:G").Find(rngSearchParam.Value, LookIn:=xlValues, _ 
      SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) 

     If Not rngFound Is Nothing Then 
      originalWS.Range(rngFound.Address).Value = rngFound.Value 
     End If 
    Next 
End With 

,用於:

Dim sht1 As Worksheet 'Current active worksheet (original version) 
Dim sht2 As Worksheet 'Worksheet in OverLay 
Dim rngFound As Range 

Set sht2 = Workbooks("Overlay").Worksheets("Overlay") 

With Workbooks("Original").Worksheets("Formatted") 
    lastRow = .Range("G" & .Rows.Count).End(xlUp).Row 
End With 

With sht2 
    For Each Row In .Range("G:G") 
     Set rngFound = Workbooks("OverLay").Worksheets("Overlay").Range("G:G").Find(What:=r.Value, LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) 
     If Not rngFound Is Nothing Then 
      rngFound.Copy 
      Workbooks("Original").Worksheets("Formatted").Range(rngFound).PasteSpecial 
     End If 
    Next 
End With 
+0

引用工作簿時使用擴展名。例如'Set rngFound = Workbooks(「OverLay.xlsx」)....'。您可以通過激活工作簿並在即時窗口中使用'?activeworkbook.name'來獲取正確的名稱。 – Jeeped

+0

@Jeeped我按照你的建議做了修改,但是我仍然得到那個錯誤 – user3088476

+3

你試圖找到哪個'r'的「價值」是什麼?看起來你會輸入'Row' – user3598756

回答

0

,我會向您展示什麼是錯的開始:

Dim sht1 As Worksheet '// <~~ This never gets used? 
Dim sht2 As Worksheet 'Worksheet in OverLay 
Dim rngFound As Range 

Set sht2 = Workbooks("Overlay").Worksheets("Overlay") 

With Workbooks("Original").Worksheets("Formatted") 
    lastRow = .Range("G" & .Rows.Count).End(xlUp).Row 
End With 

With sht2 
    For Each Row In .Range("G:G") 
'// 'Row' in the above line will be treated as a variant as it hasn't been declared. 
'// As such, it will most likely default to a Range object, which means you are 
'// actually looping through each cell in that column. The lesson here is "be explicit" 
'// and make sure the code is looking at exactly what you want it to look at. 
     Set rngFound = Workbooks("OverLay").Worksheets("Overlay").Range("G:G").Find(What:=r.Value, LookIn:=xlValues, SearchOrder:=xlByRows, SearchDirection:=xlNext, MatchCase:=False) 
'// You've already set this sheet to 'sht2' so just use that instead. Also, as 
'// we know - 'r' has not been set and so causes an error. 
     If Not rngFound Is Nothing Then 
      rngFound.Copy 
      Workbooks("Original").Worksheets("Formatted").Range(rngFound).PasteSpecial 
'// 'rngFound' is already a range object, no need to wrap it in a Range() method. 
     End If 
    Next 
End With 

這可以被重新寫成這樣由同一列中的單元格定義的值 - 因此不確定「最終目標」在這裏。希望它能夠澄清您一直有的問題

+0

我可以問這是什麼部分的代碼: - 如果不是rngFound沒有然後 originalWS.Range(rngFound.Address).Value = rngFound.Value我不知道我的理解,行originalWS.Range(rngFound)....正在做 – user3088476

+0

我想要做到這一點,如果行被發現,然後從原始刪除它,然後從覆蓋從複製行進入到原來的,如果沒有找到,那就直接複製行。 – user3088476

相關問題