2017-01-26 26 views
0

私はこのほとんどの日に取り組んでおり、それを理解しているようには見えません。ここで(非常にシンプルでなければなりません)私がしようとしているものです:VBA - アプリケーション定義またはオブジェクト定義エラー?

二ワークブック:1が既に(はThisWorkbook)をオープンし、1つはApplication.FileDialog(msoFileDialogOpen)を介して開かれた(私たちは、このワークブック2と呼びます)

  1. このワークブックで列Kが空白の場合、 "Sheet1"は、ワークブック2の列Mと列Pの値を検索します。 "503 Sundry"、列BとGをそれぞれ検索します。
  2. 値がWorkbook2で一致する場合は、「503 Sundry」を選択して、列Hと列Iの値をコピーしてThisWorkbookの "Sheet1"、列Iと列Kにそれぞれ貼り付けます。

これは私がこれまで行ってきたことですが、以下の太字のコード行に "アプリケーション定義またはオブジェクト定義エラー"というエラーメッセージが表示され続けます。

Sub JPlan() 

    Dim wb1 As Workbook 
    Dim wb2 As Workbook 
    Dim cell1 As Range, rng1 As Range, cell2 As Range, rng2 As Range 
    Dim Cel As Range 
    Dim Sht1 As Worksheet 
    Dim SundrySht As Worksheet 

    Set wb1 = ThisWorkbook 

    With Application.FileDialog(msoFileDialogOpen) 
     .AllowMultiSelect = False 
     If .Show Then 
      Filename = .SelectedItems(1) 
      Set wb2 = Workbooks.Open(Filename) 
     Else 
      Exit Sub 
     End If 
    End With 

    Set Sht1 = wb1.Sheets("Sheet1") 
    Set SundrySht = wb2.Sheets("503 Sundry") 

    Set Cel = Sht1.Range("P2") 
    Set rng1 = Range(Cel, Cel.Offset(Sht1.Cells.Rows.Count - Cel.Row, 0).End(xlUp)) 
    Set Cel = SundrySht.Range("G2") 
    Set rng2 = Range(Cel, Cel.Offset(SundrySht.Cells.Rows.Count - Cel.Row, 0).End(xlUp)) 

    If Sht1.Cells(i, 11) = "" Then 'if current cell in column 11 is empty then... 
    For Each cell2 In rng2  'for each cell in range 2 defined above (column G in "503 Sundry")... 
     For Each cell1 In rng1  'for each cell in range 1 defined above (column P in Sheet 1)... 
     If cell2.Value = cell1.Value And cell2.Offset(0, -5) = cell1.Offset(0, -3).Value Then 'if the value of cell2 equals the value of cell1 AND the value of cell2 (offset by 5 columns) equals the value of cell1 (offset by 3 columns) then... 
      cell1.Offset(0, -7).Value = cell2.Offset(0, 1).Value 'from to Sundry column H to Sheet1 column I 
      cell1.Offset(0, -5).Value = cell2.Offset(0, 2).Value 'from to Sundry column I to Sheet1 column K 
      Exit For 
     End If 
     Next 
    Next 
    End If 

End Sub 
+0

コードビューは、構文の強調表示を行い、あなたが適用している可能性のあるボールドは失われます。あなたはエラーを指し示す他の方法を見つけることができますか? – teylyn

+1

正確なエラーメッセージを含む[938その他の既存の投稿](http://stackoverflow.com/search?q=%5Bvba%5D+application+defined+or+object+defined+error)があります。彼らのうち何人があなたの質問に対する回答があるかどうかを確認してから、もう1つ質問を投稿してください。 –

+0

は、if節の一部でwb2のみを設定するようです。あなたがそれを設定しないとどうなりますか?ほとんどの場合、1004エラーが発生する可能性があります。 –

答えて

0

あなたの1004エラーが発生しているラインを示すためにあなたの質問では何も存在しないので、私はそれがIf Sht1.Cells(i, 11) = "" Thenを言っラインで発生していることを前提としています。この行は、変数iを宣言しておらず、さらに重要なことに値を割り当てていないので失敗します。したがって、iVariant(それについて特に悪いことはありませんが、使用する変数タイプについてExcelが推測するのは良い値ではありません)と仮定しています。 Excelは "行0"の概念を理解していないため、1004エラーがスローされます。

これらの問題は、各コードモジュールの最初の行にOption Explicitを含めることで回避できます(または少なくとも減らすことができます)。これは、コードで明示的に宣言していない変数を強調表示するエラーをスローするようにコンパイラに指示します。 (それはまた、あなたが変数Filenameを宣言していないという事実を強調するだろう。)

次リファクタリングコードは2つの現在宣言されていない変数のいずれかの必要性を回避:

'In order to prevent mistakes due to undefined variables, 
'include this as the first line in each code module 
Option Explicit 

Sub JPlan() 
    Dim wb1 As Workbook 
    Dim wb2 As Workbook 
    Dim cell1 As Range, rng1 As Range, cell2 As Range, rng2 As Range 

    Set wb1 = ThisWorkbook 

    With Application.FileDialog(msoFileDialogOpen) 
     .AllowMultiSelect = False 
     If .Show Then 
      '"Filename" wasn't declared, so I just merged the two lines 
      ' rather than adding a "Dim Filename As String" line 
      Set wb2 = Workbooks.Open(.SelectedItems(1)) 
     Else 
      Exit Sub 
     End If 
    End With 

    With wb1.Sheets("Sheet1") 
     Set rng1 = .Range(.Cells(2, "P"), .Cells(.Rows.Count, "P").End(xlUp)) 
    End With 
    With wb2.Sheets("503 Sundry") 
     Set rng2 = .Range(.Cells(2, "G"), .Cells(.Rows.Count, "G").End(xlUp)) 
    End With 

    'Changing the order of the loops avoids the need for the variable "i" 
    For Each cell1 In rng1  'for each cell in range 1 defined above (column P in Sheet 1)... 
     If cell1.Offset(0, -5).Value = "" Then 'if current cell in column 11 is empty then... 
      For Each cell2 In rng2  'for each cell in range 2 defined above (column G in "503 Sundry")... 
       If cell2.Value = cell1.Value And _ 
        cell2.Offset(0, -5).Value = cell1.Offset(0, -3).Value Then 'if the value of cell2 equals the value of cell1 AND the value of cell2 (offset by 5 columns) equals the value of cell1 (offset by 3 columns) then... 
        cell1.Offset(0, -7).Value = cell2.Offset(0, 1).Value 'from to Sundry column H to Sheet1 column I 
        cell1.Offset(0, -5).Value = cell2.Offset(0, 2).Value 'from to Sundry column I to Sheet1 column K 
        Exit For 
       End If 
      Next 
     End If 
    Next 

End Sub 
+0

そう...良いニュースはあなたのコードの作品です...しかし、私はいくつかの大きな問題を抱えて、私はそれがフォーマットしていると信じています。もし私がコピーしてランダムなNHAとPNを列MとPにコピーしてコードを実行すると、データが取り込まれます。ただし、Woorkbook1から同じNHAとPNを引き出し、それを列MとPに貼り付けて実行するとコードではデータを取得しません。それはどのように意味がありますか?書式設定の問題ですか? @ YowE3K – CC268

+0

@ CC268「NHA」と「PN」の内容はわかりませんが、書式設定についてのあなたのコメントは、1つのシートにテキストがあり、別のシートに数字があると思うように思えます。もしそうなら、 'cell2.Value = cell1.Valueと' cell2.Offset(0、-5).Value = cell1.Offset(0、-3).Valueを変更してみてください。 ''になる '' cell2.Text = cell1。テキストとcell2。Offset(0、-5).Text = cell1.Offset(0、-3).Text Then'です。これは、**実際の**細胞内容ではなく**表示された**細胞内容を比較します。 – YowE3K

+0

あなたの助けにたくさんありがとう@ YowE3K。ほんとうにありがとう。私はついにそれを動作させ、あなたのコードは完璧でした。ワークブック2の列MとPの値が本当に変わっています。 TRIM関数を使用しなければならなかったのは、セルに奇妙な空間があったからです。だから私はコードを実行したときにそれを拾っていなかったのです。とにかくすべてが今素晴らしいです! – CC268

関連する問題