[[20231226153458]] 『シートのコピーの際にエラーになる』(気絶部) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『シートのコピーの際にエラーになる』(気絶部)

ファイル選択しSheet1をコピーするマクロを作っています。
コピー元はA5から開始しコピー先はA2から貼り付け、追加でコピーすることもあるので、最終行も認識できるようにしています。

Sub シートコピー()

    Dim lastRow,lastRow2 As Integer
    Dim sh1,sh2 As Variant
    Dim wb,Dim wb2, varfileName As Variant
    Dim myPath,myFile As String

    myPath = ThisWorkbook.Path & "\" 
    myFile = Dir(myPath & "*.xls*")
    Set wb = ThisWorkbook
    Set sh1 = wb.Worksheets("全体")

    MsgBox "ファイル選択", Buttons:=vbInformation
        varfileName = _
        Application.GetOpenFilename("Microsoft Excelブック,*.xls?", "ファイル選択", , True) 

    If IsArray(varfileName) = False Then
            MsgBox "キャンセル"
        Exit Sub
    End If

    For Each FileName In varfileName 
        Workbooks.Open FileName:=FileName 'Excel開く
        Set wb2 = ActiveWorkbook
        Set sh2 = wb2.Worksheets("Sheet1")
        lastRow2 = sh2.Cells(Rows.Count, 3).End(xlUp).Row 
        sh2.Range(Cells(5, 1), Cells(lastRow2, 23)).Copy 
        wb.Activate
        lastRow = sh1.Cells(Rows.Count, 3).End(xlUp).Row 
        sh1.Cells(lastRow + 1, 1).PasteSpecial Paste:=xlPasteAll 
        wb2.Activate
        Application.CutCopyMode = False 
        wb2.Close
        Application.DisplayAlerts = False 
    Next FileName

End Sub

> sh2.Range(Cells(5, 1), Cells(lastRow2, 23)).Copy
この行で『アプリケーション定義またはオブジェクト定義のエラーです』がエラーになります。
どう修正すればいいのか教えてくれませんか?

< 使用 Excel:Microsoft365、使用 OS:Windows11 >


 > Dim lastRow,lastRow2 As Integer
 > Dim sh1,sh2 As Variant
 > Dim wb,Dim wb2, varfileName As Variant
 > Dim myPath,myFile As String

これはいただけない。

 Dim wb,Dim は言わずもがな。
(とりあえずひとつだけ) 2023/12/26(火) 16:19:33

これは失礼しました・・・!
この箇所については修正しました。
(気絶部) 2023/12/26(火) 16:23:58

Cellsのシートを指定すればいいのでは
つまり↓

sh2.Range(sh2.Cells(5, 1), sh2.Cells(lastRow2, 23)).Copy
(ufj) 2023/12/26(火) 16:41:02


わたしの環境では普通に動いてしまいましたが。。。sh2がActiveだしなあ(ぶつぶつ)

どちらにしても、危ないコーディングには間違いないような。

この辺りを参考にしてみてください。

http://excelvba.work/content/RunTime-Error_1004.html
(ゆたか) 2023/12/26(火) 16:43:27


こちらも参考にしてください。

 Sub a()
    Dim a, b As String
    Debug.Print VarType(a)
    Debug.Print VarType(b)
 End Sub

「これはいただけない。」の理由がわかるかと思います。
(ゆたか) 2023/12/26(火) 16:49:58


(ufj)さん
いただきました内容で修正しましたところ動きました。ありがとうございます。

(ゆたか)さん
リンク先を読みました。きちんと指定してあげることが大事なのですね。
下の投稿、勉強不足でぴんときません。
良ければ教えてもらえないでしょうか。

(気絶部) 2023/12/26(火) 17:00:46


 ↓の「宣言のしかた」参照。

http://officetanaka.net/excel/vba/variable/02.htm

(とりあえずひとつだけ) 2023/12/26(火) 17:20:03


動いたということなので、ひとまず解決したのでしょうが、使ってない変数や、指定する引数をまちがっているところがあるので、時間ができたら整理してみてはどうでしょうか?

 私なりに整理すると↓のようになるので参考に置いておきます。
    Sub 整理()
        Dim lastRow2 As Integer
        Dim sh1 As Worksheet
        Dim wb2 As Workbook, varfileName As Variant
        Dim ふぁいるぱす As Variant  '追加

        'myFile = Dir(ThisWorkbook.Path & "\" & "*.xls*") '【使ってないので要らない】
        Set sh1 = ThisWorkbook.Worksheets("全体")

        'MsgBox "ファイル選択", Buttons:=vbInformation 【要らないとおもう】
        varfileName = Application.GetOpenFilename(FileFilter:="Microsoft Excelブック,*.xls?", Title:="ファイル選択", MultiSelect:=True)
        If IsArray(varfileName) = False Then
            MsgBox "キャンセル"
            Exit Sub
        End If

        For Each ふぁいるぱす In varfileName
            Set wb2 = Workbooks.Open(Filename:=ふぁいるぱす)

            With wb2.Worksheets("Sheet1")
                lastRow2 = .Cells(.Rows.Count, "C").End(xlUp).Row
                .Range("A5:W" & lastRow2).Copy sh1.Cells(sh1.Cells(sh1.Rows.Count, "C").End(xlUp).Row + 1, "A")

                wb2.Close
            End With
        Next ふぁいるぱす
    End Sub

(もこな2 ) 2023/12/26(火) 20:57:06


 >下の投稿、勉強不足でぴんときません。

 Sub a()
    Dim a, b As String
    Debug.Print VarType(a)
    Debug.Print VarType(b)
 End Sub

 このプロシージャを実行した結果はどうなりましたか?

 0
 8

 になったかと思います。

 Dim a, b As String

 と宣言したときに、aもbも文字列のつもりで宣言していると思います。
 しかし、変数の型を調べてみると、0と8で結果が異なります。

 0はVariant型で、8は文字列型です。

 つまり、bしか文字列として宣言されていません。

 上記の宣言は

 Dim a
 Dim b As String

 と同じです。

 Dim a

 とだけ宣言された場合、変数の型は既定値であるVariant型となります。

 文字列として宣言したつもりの変数がVariant型として宣言されている。
 これは予期しない結果(エラー、バグ)を引き起こす可能性があります。 
(ゆたか) 2023/12/27(水) 08:45:58

(とりあえずひとつだけ)さん
確かにエラーになるという理由で変数を書かなかった部分があります。
見透かされているようで指摘して頂いてありがとうございます。

(もこな2 )さん
ありがとうございます。こんなすっきりとしたマクロになるのですね!
変数や引数の使い方をしっかりと身に着けたいと思います。

(ゆたか)さん
そういうことなんですね!
例を出していただきとても分かりやすかったです!

まだまだ未熟な自分に時間を割いてご教示いただき勉強になりました。
解決しただけで終わらず、頂いたマクロやWEBを今一度見返したいと思います。
貴重なお時間をありがとうございました。
(気絶部) 2023/12/27(水) 10:20:19


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.