VBAでマクロを組もうとしています。
作ろうとしているのは、フォルダを指定すると、そのフォルダの中に入っているワークブック全てのシートから特定の名前のシートだけ、別のブックにコピーされるというものです。
(例 1というフォルダの中にあ、い、うの3つのワークブックが入っているとすると、その3つのワークシートからAという名前のシートのみコピーされて、えという名前のワークブックにまとめられる。)
プログラムに関して初心者のため手探りで組んでみたのですが、「オブジェクト変数が…」というエラーが出てしまいます。
どこに原因があるのか教えていただけませんか。
コピペしたため改行など変かもしれません。
すみません。
Sub Sample()
Dim sFile As String
Dim sWB As Workbook, dWB As Workbook
Dim dSheetCount As Long
Dim sSheetCount As Long
Dim n As Integer
Dim i As Long
Const SOURCE_DIR As String = "C:\Users\A
Const DEST_FILE As String = "C:\Users\B.xls"
Dim sWork As Worksheet
Dim dWork As Worksheet
Dim tmp As Variant
Application.ScreenUpdating = False
sFile = Dir(SOURCE_DIR & "*.xls")
'SOURCE_DIR=「A」ファイルでその中に入ってるブックの名前を sFile とする
'フォルダ内にブックがなければ閉じる
If sFile = "" Then Exit Sub
'コピー先のブックを作成。dWBという名前のブックを加える。
Set dWB = Workbooks.Add
'dWBのシート数を取得。コピー先のシート数を表すときはdSheetCountを使う。
'コピー元のシート数はsSheetCountを使う。
dSheetCount = dWB.Worksheets.Count
sSheetCount = sWB.Worksheets.Count
Do
'コピー元のブックを開く
Set sWB = Workbooks.Open(Filename:=SOURCE_DIR & sFile)
'コピー元のファイルに「りんご」という文字があるか確認する。
'もし文字があったらコピー先のブックにコピーする。
'コピー元のワークシート数の何番目なのか表記はnで表す。
'コピー元のワークシートのことをsWorkと表す。
'コピー先のワークシートのことをdWorkと表す。
Set sWork = sWB.Worksheets
Set dWork = dWB.Worksheets
For n = 1 To sWB.Worksheets.Count
If InStr("sWork(sSheetsCount).name", "りんご") <> 0 Then
sWork("りんご").Copy After:=dWB.Worksheets(dSheetCount)
'コピー先のシート名をコピー元のブックの名前に置き換える
'コピー先のシート数+1の数だけシートを確認して、
'「りんご」という文字があったものだけ置き換える。
For i = 1 To dSheetCount + 1
If InStr("dWork(i).name", "りんご") <> 0 Then
'置き換える名前はコピー元のブック名を_で区切った(1)にあたるものにする。
tmp = Split("sWb.Name", "_")
dWork(i).Name = tmp(1)
End If
Next
End If
Next
'コピー元ファイルを保存しないで閉じる。
'ワークブック"Book1.xls"を保存しないで閉じる
'Sub CloseWorkbook()
'Workbooks("Book1").Close SaveChanges:=False
'End Sub
sWB.Close SaveChanges:=False
'次のブックのファイル名を取得
sFile = Dir()
Loop While sFile <> ""
'コピー先ブック作成時にあったシートを削除
Application.DisplayAlerts = False
For i = dSheetCount To 1 Step -1
dWB.Worksheets(i).Delete
Next i
Application.DisplayAlerts = True
'コピー先ブックを保存して閉じる
dWB.SaveAs Filename:=DEST_FILE
dWB.Close
Application.ScreenUpdating = False
End Sub
No.2
- 回答日時:
>sSheetcountのところに、Set sWB=ActiveWorkbook と追加したところ、無事にそこの部分を通ることができました!
そりゃ通るだろうけど、間違ってます。
その後の
'コピー元のブックを開く
で初めてsWBは定義されるから、その後に移動しないと
いけません。
そもそも、変数の名前がどうしてそのアルファベットなのか
意識してますか?
Source (コピー元の)WorkBookと Destination(コピー先の)
WorkBookというつもりです、多分ね。
>dWBについてもdSheetcountとしているので、ActiveWorkbookとおこうとしたのですが
何をいってるのかな?
Set dWB = Workbooks.Add ’ブックを新規作成してdWBにセットしてますよね。
dSheetCount = dWB.Worksheets.Count ’その新規ブックのシート数を代入してます。
てことで、ActiveWorkbookの出る幕は考えられないです。
でも、何を記述したんでしょうね?
「オブジェクトはこのプロパティ、またメソッドをサポートしていない」と出てしまいました。
が、気にはなります。
なるほど…まだまだ理解が足りていないのだと実感しました。
おそらくSetを別のところに書いてしまったためだと思われます。
削除し書き直したところ、なんとか動かすことができました。
ありがとうございました。
No.1
- 回答日時:
全部は見てませんが
sSheetCount = sWB.Worksheets.Count ①
sWBに何も設定していないでいきなり使ってるから。
具体的なブック名をセットしないといけない。
sWBが今のアクティブブックの意味で使いたいなら
set sWB=ActiveWorkbookと言う文が①の前に必要。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) シートをコピーする下記記述でダイアログを用いた記述がわかりません?( A = Dir(ThisWor 4 2022/08/22 12:26
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 貼り付けた値が消えていく 以下はソースファイルの2番目のシートのB6から最終行を取得 ターゲットファ 2 2023/07/27 12:23
- Visual Basic(VBA) エクセルのマクロについて教えてください。 4 2023/05/24 08:33
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 集めたシートのシート名を変更したい。 下記のコードでサブフォルダにあるファイルのSheet3を集めて 6 2022/08/23 10:38
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) VBAが止まります。 1 2022/09/02 14:51
- Excel(エクセル) フォルダ内の全ブックのシート名を変更したい 7 2022/09/22 21:34
関連するカテゴリからQ&Aを探す
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel 関数を使ってデータと一...
-
エクセルの選択範囲以外を削除...
-
Excelの行をコピーして貼り付け...
-
【Excel】数式をそのまま他のシ...
-
EXCELのVBAでシートコピーをし...
-
【VBA】コピー&複数個所のペー...
-
ページの設定を別シートにコピ...
-
EXCELで別のブックから式をコピ...
-
エクセルのシートコピーで名前...
-
Excel 数式の保護をしたセルを...
-
エクセルの1シートの内容を複...
-
エクセルのページをシートごと...
-
エクセルシートを別のエクセル...
-
ExcelのBook内のシートを一枚だ...
-
VBA シートをコピー後、ボタン...
-
エクセルVBAですが教えてくださ...
-
VBAでVBAを削除?
-
連続しないセルへの貼り付け方法
-
ExcelVBAで、ユーザーフォーム...
-
エクセルVBA 1行飛ばしで転記す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel 関数を使ってデータと一...
-
エクセルの選択範囲以外を削除...
-
EXCELのVBAでシートコピーをし...
-
EXCELで別のブックから式をコピ...
-
【Excel】数式をそのまま他のシ...
-
【VBA】コピー&複数個所のペー...
-
Excelの行をコピーして貼り付け...
-
CSVファイルについて質問です。
-
【エクセル】プルダウン設定の...
-
Excel シートのコピーの際、ペ...
-
Excel 数式の保護をしたセルを...
-
【Excel VBA】シートコピー時、...
-
エクセルの1シートの内容を複...
-
ExcelVBAで、ユーザーフォーム...
-
Excel シートに別のExcelシート...
-
シートが保護されていないのに...
-
PDFファイルをコピーしてエクセ...
-
エクセルシートを別のエクセル...
-
エクセルVBA 1行飛ばしで転記す...
-
エクセルでシートを「移動また...
おすすめ情報
回答ありがとうございます!
sSheetcountのところに、Set sWB=ActiveWorkbook と追加したところ、無事にそこの部分を通ることができました!
dWBについてもdSheetcountとしているので、ActiveWorkbookとおこうとしたのですが、「オブジェクトはこのプロパティ、またメソッドをサポートしていない」と出てしまいました。
dWBや他の部分についてはなにも書かなくていいということなのでしょうか?