2016-07-28 14 views
0

これで、基本的にvlookupのように動作し、ワークシート2の列Aの同じ値に対して列Aのセルでセルを検索し、すべての情報をコピーしますその行のワークシート1の最初の列に移動します。VBA .Findオブジェクト変数が設定されていませんエラー

基本的に私は何をしているのか分かりませんが、約95%の機能があります。私の唯一の問題は、ワークシート1の列Aの値をワークシート2の列Aで見つけることができなくなることです。次の値にスキップするにはどうすればよいですか?

私の場合...他にも、その値をスキップする必死の試みがありましたが、明らかに機能しませんでした。

Sub ProLookUp() 

Dim ColALastRow As Long 
Dim ColALastRow2 As Long 


ColALastRow = Worksheets(1).Columns("A:A").End(xlDown).Row 
MsgBox ColALastRow 

ColALastRow2 = Worksheets(2).Columns("A:A").End(xlDown).Row 
MsgBox ColALastRow2 

Dim i As Long 
Dim Pro As String 
Dim Pro2 As Long 

For i = 1 To ColALastRow 
Pro = Worksheets(1).Cells(i, 1).Value 

'With Worksheets(2).Range("A1:A" & ColALastRow2)' 'ignore this part' 

With Worksheets(2).Range("A1:A10000") 

'the below is where my issue is, once it finds a value in column A that it 
'cannot match in sheet 2 it returns the error 
'Object variable or With block variable not set 

If Pro = .Find(Pro, LookIn:=xlValues).Value Then 
    Pro2 = .Find(Pro, LookIn:=xlValues).Row 
Else 
    i = i + 1 
End If 


    Dim LastColA As Integer 
    Dim CopyRange As Range 
    Dim a As Range 
    Dim b As Range 

     With Worksheets(2) 
      LastColA = .Cells(Pro2, .Columns.Count).End(xlToLeft).Column 
      Set a = .Cells(Pro2, 2) 
      Set b = .Cells(Pro2, LastColA) 
      Set CopyRange = Range(a, b) 
     End With 

    Dim PasteRange As Range 
    Dim LastColumnB As Integer 
     With Worksheets(1) 
      LastColumnB = .Cells(i, .Columns.Count).End(xlToLeft).Column 
      LastColumnB = LastColumnB + 1 
      Set PasteRange = .Cells(i, LastColumnB) 
      MsgBox PasteRange.Address 

     End With 

Worksheets(2).Select 
    CopyRange.Select 
    Selection.Copy 
Worksheets(1).Select 
    PasteRange.Activate 
    ActiveCell.PasteSpecial 

End With  
Next i 
End Sub 

答えて

1

他のコードを書き直しました。

i = i + 1のIf文は、あなたが考えるとは思わないでしょう。

findの結果を範囲変数にロードしました。 findが何も見つからない場合、結果の範囲変数はNothingになります。 Nothingでメソッドを呼び出せないため、エラー91が発生します。これを解決するには、ブロックIfNothingをテストし、エラーを回避します。

範囲変数Is Not Nothingが確実にテストされていることを確認します。 Nothingが見つかった場合は、コードをスキップしてNext iに直接進みます。

ifを使用して1をiに追加しようとすると、Forループの次の繰り返しは発生しません。コードはまだ実行しようとし、実際に行をスキップして反復しようとします。

コピー&ペーストするだけで用紙と範囲を有効にする必要はありません。

Sub ProLookUp() 

Dim ColALastRow As Long 
Dim ColALastRow2 As Long 


ColALastRow = Worksheets(1).Columns("A:A").End(xlDown).Row 
MsgBox ColALastRow 

ColALastRow2 = Worksheets(2).Columns("A:A").End(xlDown).Row 
MsgBox ColALastRow2 

Dim i As Long 
Dim Pro As String 
Dim fnd As Range 
Dim Pro2 As Long 

For i = 1 To ColALastRow 
    Pro = Worksheets(1).Cells(i, 1).Value 

    'With Worksheets(2).Range("A1:A" & ColALastRow2)' 'ignore this part' 

    With Worksheets(2).Range("A1:A10000") 

     'the below is where my issue is, once it finds a value in column A that it 
     'cannot match in sheet 2 it returns the error 
     'Object variable or With block variable not set 
     Set fnd = .Find(Pro, LookIn:=xlValues) 
    End With 
    If Not fnd Is Nothing Then 
     Pro2 = fnd.Row 
     Dim LastColA As Integer 
     Dim CopyRange As Range 
     Dim a As Range 
     Dim b As Range 

     With Worksheets(2) 
      LastColA = .Cells(Pro2, .Columns.Count).End(xlToLeft).Column 
      Set a = .Cells(Pro2, 2) 
      Set b = .Cells(Pro2, LastColA) 
      Set CopyRange = Range(a, b) 
     End With 

     Dim PasteRange As Range 
     Dim LastColumnB As Integer 

     With Worksheets(1) 
      LastColumnB = .Cells(i, .Columns.Count).End(xlToLeft).Column 
      LastColumnB = LastColumnB + 1 
      Set PasteRange = .Cells(i, LastColumnB) 
      MsgBox PasteRange.Address 
     End With 


     CopyRange.Copy PasteRange 

    End If 


Next i 
End Sub 
+0

うわー、ありがとうございます。それは完全に動作します。 –

+0

@PeteUlrich答えにチェックマークをつけて、正しいものとしてマークしてください。質問を提出した人だけができることです。 –

+0

更新しました。もう1つの質問ですが、ワークシート2の列Aが、ワークシート1の番号と一致しない番号全体を表示するようなサイズになっていない場合、その理由は何ですか?私は開始する前にその列のサイズを変更する行を含めるだけでいいですか? –

関連する問題