2016-04-05 10 views
0

私はVBAをかなり新しくしていますので、私のコードの多くはインターネットで調査してまとめたものです。私が達成しようとしていることの少し背景: -オブジェクト必要なランタイムエラー異なるワークブックを検索するときのVBA

私は同じレイアウトを持つ2つの作品の本があります。 1つのワークブックはVBAコードが保持され、もう1つはオーバーレイ文書の一種です。オーバーレイにコードがある列があり、そのコードが見つかった場合は元のワークブールの同じ列を検索してオーバーレイから元の行にコピーし、元の行を削除する必要があります。元の行をコピーするだけです。

私は実行時エラーを取得していたコードの行がある: -

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

は、私が使用していたコードの抜粋です。

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 

これは以下のような再書き込みすることができます。

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 

それはあなたが列を検索するように思えるが、ために同じ列のセルで定義された値 - ここでは「最終目標」が何であるかは不明です。うまくいけば、それはあなたが持っている問題を明確にします

+0

コードのこのセクションで何をするのか尋ねることができます: - rngFoundが何もない場合 originalWS.Range(rngFound.Address).Value = rngFound.Value私は、元のWS.Range(rngFound)....という行が理解しているかどうか分かりません – user3088476

+0

行が見つかったら元の行から削除してから、行をオーバーレイからコピーします元に戻し、それが見つからない場合は、行をまっすぐにコピーしてください。 – user3088476

関連する問題