Excel (VBA)

Excel VBAに関するフォーラムです。
  • 解決済みのトピックにはコメントできません。
このトピックは解決済みです。
質問

 
(Windows 10 Pro : Excel 2016)
IF文のオブジェクト定義エラー
投稿日時: 20/03/25 12:20:40
投稿者: なず

ファイルの内容を他のファイルにコピーする内容なのですが、
2ファイルを開いたタイミングでそれぞれwb1、wb2とsetし、
そのままIF文に進みたいのですが★の部分で「実行時エラー1004
アプリケーション定義またはオブジェクト定義のエラーです。」となってしまいます。
どのように修正すれば良いか、またその後のIF文にも誤りがあればご教示いただきたいです。
 
Dim wb1 As Workbook, wb2 As Workbook
 
Workbooks.Open Filename:=ThisWorkbook.ActiveSheet.Range("C4").Value
   Set wb1 = ActiveWorkbook
 
Workbooks.Open Filename:=ThisWorkbook.ActiveSheet.Range("C8").Value
   Set wb2 = ActiveWorkbook
 
For i = 4 To 45
For n = 6 To 45
 
               ★If wb1.Worksheets(xxx).Range(Cells(i, 2), Cells(i, 4)) <> "" Then
                  wb1.Worksheets(xxx).Range(Cells(i, 2), Cells(i, 4)).Copy
                  wb2.WorkSheets(○○○).Range(Cells(n, 1), Cells(n, 3)).PasteSpecial (xlPasteAll)
               End If
 
Next n
Next i
 
 
実行時エラー1004
アプリケーション定義またはオブジェクト定義のエラーです。

回答
投稿日時: 20/03/25 12:48:50
投稿者: MMYS

ワークシートが省略した場合、ActiveSheetとなります。
Worksheets(xxx)とActiveSheetでオブジェクトが異なるとエラーです。
 
wb1.Worksheets(xxx).Range(ActiveSheet.Cells(i, 2), ActiveSheet.Cells(i, 4))
 
 
解決策。仕様略せずにワークシートを指定する
set ws = wb1.Worksheets(xxx)
ws.Range(ws.Cells(i, 2), ws.Cells(i, 4))
 
 

回答
投稿日時: 20/03/25 16:15:44
投稿者: WinArrow
投稿者のウェブサイトに移動

補足

引用:
Workbooks.Open Filename:=ThisWorkbook.ActiveSheet.Range("C4").Value
    Set wb1 = ActiveWorkbook
   
 Workbooks.Open Filename:=ThisWorkbook.ActiveSheet.Range("C8").Value
    Set wb2 = ActiveWorkbook

 
↑のコードは、たまたま、機能しているだけで
 アクテイブシートが本来のおシートでないかもしれません。
きちんとシート名を指定したほうが安全です。
コードも少し簡略化できます。
 例
Set wb1 = Workbooks.Open(Filename:=ThisWorkbook.Sheets("XXXXX").Range("C4").Value
 Set sb2 = Workbooks.Open Filename:=ThisWorkbook.Sheets("XXXXX").Range("C8").Value
   
複写処理の中も
複写元、複写先のシートをオブジェクト変数に入れましょう
  
参考例
インデントを付けるとコードの可読性が高まるよ!
  
     Set ws1 = wb1.Worksheets(xxx)  '←
     Set ws2 = wb2.Worksheets(○○○) '← 
     For i = 4 To 45
         For n = 6 To 45
            If ws1.Range(ws1.Cells(i, 2), ws1.Cells(i, 4)).Value <> "" Then
                 wb1.Range(ws1.Cells(i, 2), ws1.Cells(i, 4)).Copy
                 ws2.Range(ws2.Cells(n, 1), ws2.Cells(n, 3)).PasteSpecial (xlPasteAll)
                 Application.CutCopyMode = False
             End If
         Next n
     Next i

投稿日時: 20/03/25 18:01:53
投稿者: なず

>MMYS様
おっしゃる通りset wsの記述に変えていろいろ試して見たところ、非常にわかりやすい上に
一通り動作するようになりました!
本当にありがとうございました!
 
>WinArrow様
確かに詰めが甘く、思いがけないところでミスをすることが多いのでシート名までしっかり指定するように
修正したいと思います。
分かりやすく例まで載せていただきありがとうございます!
 
 

投稿日時: 20/03/25 18:04:55
投稿者: なず

なず さんの引用:
ファイルの内容を他のファイルにコピーする内容なのですが、
2ファイルを開いたタイミングでそれぞれwb1、wb2とsetし、
そのままIF文に進みたいのですが★の部分で「実行時エラー1004
アプリケーション定義またはオブジェクト定義のエラーです。」となってしまいます。
どのように修正すれば良いか、またその後のIF文にも誤りがあればご教示いただきたいです。
 
Dim wb1 As Workbook, wb2 As Workbook
 
Workbooks.Open Filename:=ThisWorkbook.ActiveSheet.Range("C4").Value
   Set wb1 = ActiveWorkbook
 
Workbooks.Open Filename:=ThisWorkbook.ActiveSheet.Range("C8").Value
   Set wb2 = ActiveWorkbook
 
For i = 4 To 45
For n = 6 To 45
 
               ★If wb1.Worksheets(xxx).Range(Cells(i, 2), Cells(i, 4)) <> "" Then
                  wb1.Worksheets(xxx).Range(Cells(i, 2), Cells(i, 4)).Copy
                  wb2.WorkSheets(○○○).Range(Cells(n, 1), Cells(n, 3)).PasteSpecial (xlPasteAll)
               End If
 
Next n
Next i
 
 
実行時エラー1004
アプリケーション定義またはオブジェクト定義のエラーです。