電子書籍の厳選無料作品が豊富!

過去に私の質問にお答えいただいた方、大変ありがとうございました。

下記コードにて、途中でエラーが生まれてしまい解決できません...。

やりたいことは、
・fnameに入れた、文字や数字を含むファイルの存在確認
・ある場合に、新しくそのシートを作り名前をつける
・元ブックのB列をデータのある最終行までコピーして
・新しく作成したシートのB1へ値のみ貼り付け
といった感じです。


Option Explicit
Sub sample()


Dim fname As Variant
fname = "404"

Dim csvfile As Variant
csvfile = Dir(ThisWorkbook.path & "/*" & fname & "*.csv")
If csvfile <> "" Then '対象のファイルがあるかどうかの確認

Dim ws As Worksheet '対象のファイルがある場合、シートを追加
Set ws = Sheets.Add(After:=Sheets(Sheets.Count))
ws.Name = "404エラー"

Dim path As String
Dim wb As Workbook
Dim lastB As Variant
path = ThisWorkbook.path & "/" & csvfile
Set wb = Workbooks.Open(path)
lastB = Cells(Rows.Count, "B").End(xlUp).Select

wb.Worksheets(1).Range(lastB).Copy
ThisWorkbook.Sheets("ws.Name").Range("B1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
wb.Close SaveChanges:=False

End If
End Sub

デバッグを見る限り、wb.Worksheets(1).Range(lastB).Copyのあたりで止まってしまうのですが、どうにも自分ではしっくりこず、なぜエラーになってしまうのかご教授いただけると幸いです。

A 回答 (3件)

Dim lastB As Variant


lastB = Cells(Rows.Count, "B").End(xlUp).Select
lastB=True(Boolean)です よってRange(lastB).Copyは1004

ご質問にはありませんが、
>元ブックのB列をデータのある最終行までコピーして
Cells(Rows.Count, "B").End(xlUp).SelectはB列最終行セルのみです

範囲ならRange(Cells(1, "B"), Cells(Rows.Count, "B").End(xlUp))
のようになります
更に
>ThisWorkbook.Sheets("ws.Name").Range("B1")
("ws.Name")は文字列になってしまいます

Set ws = Sheets.Add(After:=Sheets(Sheets.Count))
ws.Name = "404エラー"
としているのなら
ws.Range("B1") や
ThisWorkbook.Sheets(ws.Name).Range("B1")

該当部分 2通りの例(やりたい事から推測

Dim ws As Worksheet '対象のファイルがある場合、シートを追加
Set ws = Sheets.Add(After:=Sheets(Sheets.Count))
ws.Name = "404エラー"

Dim path As String
path = ThisWorkbook.path & "/" & csvfile
With Workbooks.Open(path)
.Range(.Cells(1, "B"), .Cells(Rows.Count, "B").End(xlUp)).Copy
ws.Range("B1").PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
.Close SaveChanges:=False
End With
End If
End Sub

2例目 .Value=.Value
Dim path As String
Dim wb As Workbook
Dim lastB As Range
path = ThisWorkbook.path & "/" & csvfile
Set wb = Workbooks.Open(path)
Dim ws As Worksheet '対象のファイルがある場合、シートを追加
Set ws = Worksheets.Add(After:=Sheets(Sheets.Count))
ws.Name = "404エラー"
'Sheets.Addで対象がアクティブになっているのでシートオブジェクトを省略
Set lastB = Range(Cells(1, "B"), Cells(Rows.Count, "B").End(xlUp))

ws.Range("B1").Resize(lastB.Count).Value = lastB.Value
wb.Close SaveChanges:=False

End If
End Sub

*気になる点
Worksheetとsheetは違います
理解した上でSheetsを使っているのなら良いですが
よくわからずであれば、調べてみてください。
    • good
    • 0

#2


すみません訂正します

1例目 .Range(.Cells(1, "B"), .Cells(Rows.Count, "B").End(xlUp)).Copy
は Withでシートを示していない為、下記のようになります

Range(Cells(1, "B"), Cells(Rows.Count, "B").End(xlUp)).Copy

CSVファイルをExcelで開いているようなのでシートは必ず1シートで
2例目同様にActiveSheetを省略しています

Withを使いたかったのですがあまり(出番のない)良くない例でした
    • good
    • 0
この回答へのお礼

ご丁寧な回答ありがとうございます。
非常に参考になります!

お礼日時:2022/02/28 09:45

念のため、エラー内容も書いておくか、


スクリーンショットを載せておいた方がいいと思いますよ。
    • good
    • 2

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!