[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『シートのコピーの際にエラーになる』(気絶部)
ファイル選択し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
sh2.Range(sh2.Cells(5, 1), sh2.Cells(lastRow2, 23)).Copy
(ufj) 2023/12/26(火) 16:41:02
どちらにしても、危ないコーディングには間違いないような。
この辺りを参考にしてみてください。
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
(ゆたか)さん
リンク先を読みました。きちんと指定してあげることが大事なのですね。
下の投稿、勉強不足でぴんときません。
良ければ教えてもらえないでしょうか。
(気絶部) 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.