エクセルファイルの分割方法について教えてください。
使用OS等:Windows XP、Excel2003
具体的には1ブック、1シートのみに全データが入っています。
項目行は2行あり、分割のキーと項目がA列に入っています。
そのキー毎に新しいファイルを作りたいと考えています。
始めに新しいファイルにパスワードをつけるかどうか、つけるならつけたいパスワードを入力するようなフォームが立ち上がります。
そして、分割したい元ファイルはどれなのか選択式になっており、いろいろなファイルに適応できるような物にしています。
尚、元ファイルの入っているフォルダ内に分割された各々のファイルを作成します。
分割後のファイルには、”キー(XXX)+元ファイル名”にし、ページ設定や書式なども継承するようにしたいのですが、今使っているものですと、ページ設定が繁栄されません。
ほとんど初心者なもので、元々あったマクロを少し修正したりはしているのですが、上記の問題を解決する事ができず、困っております。
使用中のコードを載せますので、アドバイスまたは違う方法がありましたら、ご教示願います。
コメントなどつけていただけるとありがたいと思います。
どうぞよろしくお願い致します。
Sub 分割パスあり()
Dim DPath As String
Dim DName As String
Dim fNAME As String
Dim fiNAME As String
Dim pass As String
Dim oneNAME As String
Dim oneFILE As String
Dim opdia
Dim n
UserForm1.Hide
pass = InputBox("パスワードを入力して下さい。", "パスワード入力")
opdia = Application.Dialogs(xlDialogOpen).Show
If opdia = Cancel Then
Exit Sub
End If
DPath = ActiveWorkbook.Path & "\"
DName = ActiveWorkbook.Name
Range("A:A") = Range("A:A").Value
Range("A3").Select
Selection.Sort Key1:=Range("A3"), Order1:=xlAscending, Header:=xlGuess
Selection.EntireRow.Insert shift:=xlShiftDown
n = 4
For n = 4 To ActiveCell.CurrentRegion.Rows.Count * 2
On Error GoTo ErrorHandler
If Cells(n, 1).Value = Cells(n - 1, 1).Value Then
Else
fNAME = Cells(n - 1, 1).Text
fiNAME = fNAME & DName
Rows("1:2").Copy
Workbooks.Add
ActiveSheet.Paste
ActiveWorkbook.SaveAs Filename:=DPath & fiNAME, password:=pass
Windows(DName).Activate
Cells(n, 1).EntireRow.Insert shift:=xlShiftDown
Cells(n - 1, 1).CurrentRegion.EntireRow.Select
Selection.Copy
Windows(fiNAME).Activate
ActiveSheet.Paste Destination:=Range("A3")
Cells.Columns.AutoFit
ActiveWorkbook.Close savechanges:=True
Windows(DName).Activate
n = n + 1
End If
Next
oneNAME = Cells(n, 1).Text
oneFILE = oneNAME & DName
FileCopy Source:=fiNAME, Destination:=oneFILE
Rows("1:2").Copy
Workbooks.Add
ActiveSheet.Paste
ActiveWorkbook.SaveAs Filename:=DPath & oneFILE, password:=pass
Windows(DName).Activate
Cells(n, 1).CurrentRegion.EntireRow.Select
Selection.Copy
Windows(oneFILE).Activate
ActiveSheet.Paste Destination:=Range("A3")
Cells.Columns.AutoFit
ActiveWorkbook.Close savechanges:=True
Application.CutCopyMode = False
Application.DisplayAlerts = False
Windows(DName).Close savechanges:=False
MsgBox "分割処理が終了しました"
Exit Sub
ErrorHandler:
ActiveWorkbook.Close savechanges:=False
Windows(DName).Close savechanges:=False
MsgBox "分割処理が終了しました"
Exit Sub
End Sub
A 回答 (3件)
- 最新から表示
- 回答順に表示
No.3
- 回答日時:
僕のミスです。
確認してないのバレましたね(苦笑)'---> 変更後
'元シートを新しいブックとして複製
ActiveSheet.Copy
ActiveSheet.Cells.Clear
ActiveSheet.Range("A1").Select '★A1を選択
'新しいブックを保存
ActiveWorkbook.SaveAs Filename:=DPath & fiNAME, password:=pass
'1,2行目をコピペ
WorkBooks(DName).Activate
ActiveSheet.Rows("1:2").Copy
WorkBooks(fiNAME).Activate
ActiveSheet.Paste
WorkBooks(DName).Activate
'<---
★の1行が必要です。「新しいブックを開く」から「シートコピー>"新しいブック"」の操作に置き換えました。2箇所とも差し替えちゃってください。印刷設定をコピーした以外はほぼ同じですが、複製したブックにはシートがひとつしかないので、必要に応じてSheets.Addを。
あと、ANo.1のはエラーになります。エラー発生時に正常っぽく終了しちゃうのは混乱を招くので、変えておくとよさそうです(※On Error GoTo ErrorHandlerで、エラーダイアログを出さず "ErrorHandler:" のラベルまで処理を飛ばしてます)
@後から3行目
MsgBox "分割処理に失敗しました"
VBEでは、F8キーで(メニュー>デバッグでも)コードを1行ずつ実行できます。ローカルウィンドウを開いておけば、変数の中身も覗けちゃいます。便利ですし、理解の助けにもなるので、試しに使ってみてください。
ちなみに、質問文はそんなもんだと思いますよ(笑)。要領よく聞けるなら解決できるでしょうし、足りない部分はコードが補ってくれます。こーいうトコにあがるコードは読み辛いのも当たり前ですが、全部読むワケじゃないので。
ええ、だから失敗するんですが…今度は動くかな(--;
ap2様、体調不良のためお休みしていたので、お礼が遅くなってしまい、大変申し訳ございません。
再度、ご回答くださり本当にありがとうございました。
早速、試してみようと思います。
ご丁寧なフォロー、感謝致します。本当に嬉しいです!
No.2
- 回答日時:
コード例が長くて、質問の意図が判りにくい。
「継承」などと難しい言葉を使っているが、プログラムのプロですか。
ーーー
質問は、エクセルシートをコピーしたとき、コピーで出来た(コピーされた)シートに、ページ設定の設定を効き告ぎたい引継ぎたい。それも、VBAコードでということですか。
シートをコピーしても、コピー元のページ設定項目は引き継がれないようだ。
シートのセルの値や、書式や、コメント、入力規則、数式など以外のものは、移らないようだ。
何か1行(2-3行)で別シートのPageSetUpの項目(多数あり)を代入するような方法はPageSetUpオブジェクトにはないようだ。
だから設定可能項目は、ページ設定のマクロの記録で判るので、そのそれぞれの項目に対し
BシートPageSetUp項目=AシートPageSetUp項目(内容は値(数値・文字列・Falseなど)でしょう)
を項目ごとに繰返さないとならないようだ。
ーー
シート数が多いとコピーの時間がかかるという質問
http://www.keep-on.com/excelyou/2000lng4/200005/ …
2010で変化があったようだ
http://kinuasa.wordpress.com/category/office%E9% …
同様の質問?
http://oshiete.goo.ne.jp/qa/6273710.html
ーー
もし上記のような質問なら質問のコード例など無関係では。
imogasi様 お返事遅くなり申し訳ありません。
長いコードの貼り付けや、継承などという言葉を使ってしまい、気分を害してしまったら
大変申し訳ありません。
私はプロどころか、本当にマクロを勉強し始めたばかりの素人同然で、既存で使ってあったものを
修正して作れるのなら・・・との思いで質問させていただきました。
どうやらちょっとした修正だけという訳にはいかないようですね・・・。
上記提示していただいた同様の質問などを参考に考えたいと思います。
No.1
- 回答日時:
セルのコピーを繰り返して処理しているようですが、ページ設定(印刷関係)はシートの情報なので、セルのコピーでは写すことができません。
今回は目的が複製っぽいので、新しいファイルを生成する際に、シートをコピーして作るのが良さそうです。試しに書いてみました。動くか分りませんが…
'---> 変更前
' Rows("1:2").Copy
' Workbooks.Add
' ActiveSheet.Paste
' ActiveWorkbook.SaveAs Filename:=DPath & fiNAME, password:=pass
' Windows(DName).Activate
'<---
'---> 変更後
'元シートを新しいブックとして複製
ActiveSheet.Copy
ActiveSheet.Cells.Clear
'新しいブックを保存
ActiveWorkbook.SaveAs Filename:=DPath & fiNAME, password:=pass
'1,2行目をコピペ
WorkBooks(DName).Activate
ActiveSheet.Rows("1:2").Copy
WorkBooks(fiNAME).Activate
ActiveSheet.Paste
WorkBooks(DName).Activate
'<---
Sheets.Copyは、挿入位置を指定しなければ、そのシートひとつだけの「新しいブック」を生成します。セルのデータごと複製されるので、Cells.Clearで一旦まっさらにします。これで、ページ設定を引き継ぎながら、WorkBooks.Addと同じことができます。
ちなみに、ページ設定のプロパティをひとつずつ反映することもできますが、大変かと。参考程度に↓(※この中にプロパティがイッパイ入ってるよ!)
Sheets.PageSetup がページ設定
Sheets.HPageBreaks が改ページ
初心者とのことですが、記録機能でここまで作ったのか、他の人が作ったのか…、前者なら最初の数行で足りたかも知れませんね。余談ですが、慣れてきたら、Activateをやめると処理がすっきりしますよ。Workbooks("hoge.xls").Sheets("hoge").Copy のようにすれば、ActiveSheetを対象にしなくてもよくなるので。
ap2 様、お返事送れて大変申し訳ありません。
ご丁寧にご回答いただきありがとうございました。
試しに教えていただいたコードに書き換えてみましたが、1つだけ全く空っぽのファイルが
作成されただけ・・・という結果になってしまいました。
2箇所同じ箇所があって、2箇所とも変えてしまったのがわるかったのでしょうか・・・?
しかしながら、ActiveSheetの件など、参考になりました。
どうもありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) vbaのエラー対応(実行時エラー7:メモリが不足しています) 4 2023/04/24 00:20
- Visual Basic(VBA) VBAのユーザーフォームのテキストボックスに入力制限をしたい 6 2022/11/15 08:28
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Excel(エクセル) 2つのVBAを一緒にしたら機能しなくなりました(エクセル) 7 2022/06/02 12:41
- Visual Basic(VBA) 【VBA】印刷マクロのループ処理が反映されません 3 2022/08/09 02:15
- Visual Basic(VBA) エクセルVBA(実行時エラー438)の対処法を教えてもらえないでしょうか 3 2023/04/22 13:43
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの関数 ENTERを押...
-
VBAでブックを非表示で開いて処...
-
複数ファイルから特定シートの...
-
エクセルを共有するとPCによっ...
-
フォルダ内の複数ファイルから...
-
指定ファィルの指定シートをシ...
-
WorkBooksをオープンさせずにシ...
-
エクセルファイルを開かずにpdf...
-
エクセルの関数について教えて...
-
エクセルで機能が使えない
-
複数のブックをひとつのブック...
-
エクセル2016です。「ブッ...
-
Excelで複数ブックの同一セルに...
-
複数のExcelブックのシート1の...
-
外部ブック参照が#REF!になって...
-
Excel起動時に特定のワークシー...
-
複数のセルをコピーし、別シー...
-
Excel VBAでブックを閉じる時、...
-
【ExcelVBA】シートをそれぞれ...
-
Excel(2010)のフィルターが保...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルを共有するとPCによっ...
-
エクセルの関数 ENTERを押...
-
VBAでブックを非表示で開いて処...
-
WorkBooksをオープンさせずにシ...
-
Excelでブックの共有を掛けると...
-
エクセルで参照しているデータ...
-
Excel(2010)のフィルターが保...
-
Excelで複数ブックの同一セルに...
-
VBA バックグラウンドで別ブッ...
-
エクセルで50行ごとに区切った...
-
エクセルで「ディスクがいっぱ...
-
エクセルにおける,「ブック」...
-
エクセルファイルを開かずにpdf...
-
フォルダ内の複数ファイルから...
-
ブックのピボットを別ブックに...
-
エクセルシートの一部を送りたい
-
エクセル2016です。「ブッ...
-
エクセルで別ブックをバックグ...
-
フォルダ内の複数ファイルから...
-
複数ファイルから特定シートの...
おすすめ情報