
エクセルのマクロについての質問です。
ページ数が100ページ以上あるデータを改ページごとシートに分けたいです。
一つ一つのページの行数は違います。
色々と検索していたら
↓↓↓↓↓↓↓↓↓↓
Sub 表をシートに分割()
Dim V_Page As Integer, H_Page As Integer
Dim V As Integer, H As Integer
Dim Top As Integer, Left As Integer
Dim Bottom As Integer, Right As Integer
Dim NewWS As Worksheet
Dim P_Area As Range
With Worksheets("Sheet1") '元の表があるシート名を指定
H_Page = .HPageBreaks.Count + 1 '行方向のページ数
V_Page = .VPageBreaks.Count + 1 '列方向のページ数
Set P_Area = .Range(.PageSetup.PrintArea) '印刷範囲を取得
For V = 1 To V_Page '列方向のループ
For H = 1 To H_Page '行方向のループ
'コピーする表の左上の行番号を取得
If H = 1 Then
Top = P_Area.Cells(1).Row
Else
Top = .HPageBreaks(H - 1).Location.Row
End If
'コピーする表の左上の列番号を取得
If V = 1 Then
Left = P_Area.Cells(1).Column
Else
Left = .VPageBreaks(V - 1).Location.Column
End If
'コピーする表の右下の行番号を取得
If H < H_Page Then
Bottom = .HPageBreaks(H).Location.Row - 1
Else
Bottom = P_Area.Cells(P_Area.Cells.Count).Row
End If
'コピーする表の右下の列番号を取得
If V < V_Page Then
Right = .VPageBreaks(V).Location.Column - 1
Else
Right = P_Area.Cells(P_Area.Cells.Count).Column
End If
'シートを一番後ろに追加
Set NewWS = Worksheets.Add(after:=Worksheets(Worksheets.Count))
NewWS.Name = "表" & (V - 1) * H_Page + H '表の名前をつける
'表を追加したシートにコピー
.Range(.Cells(Top, Left), .Cells(Bottom, Right)).Copy NewWS.Cells(1, 1)
Next
Next
End With
End Sub
このコードがやりたいことに最も近かったのですが、
列の幅がコピー元と同じにならず、テキストボックスが変に伸びてしまったり、ページ自体の横幅が変わってしまいました。
このコードのどこをどのように変更すれば上記のようにページを分割することができるでしょうか?
ご教授お願いいたします。
No.1ベストアンサー
- 回答日時:
>列の幅がコピー元と同じにならず、テキストボックスが変に伸びてしまったり、ページ自体の横幅が変わってしまいました。
お好みに合うか分かりませんが、個別で設定する方法です。一度にコピペも出来るかもしれませんが、取敢えず、、
列幅です。。
該当箇所
'表を追加したシートにコピー
.Range(.Cells(Top, Left), .Cells(Bottom, Right)).Copy NewWS.Cells(1, 1)
For i = 1 To Right
NewWS.Columns(i).ColumnWidth = .Columns(i).ColumnWidth
Next
Dim i As Long などで i を変数宣言してください。
ありがとうございます!
列幅共にうまくいきました!
しかし、画像の大きさや位置が微妙に元データとずれてしまっていました。
これはセルにコピーをしているからでしょうか?
例えば、列幅が元シートと全く同じシートをページ分用意して、そのシートのA1にセルを挿入するというような動作はできますでしょうか?
No.4
- 回答日時:
補足を読みました。
方法は、大きくプロセスを変えない場合、2つ考えられます。
1つは#2の方法(#3で修正)を試してみる
2つ目は、#1の方法で、行単位のコピペをする。
.Rows(Top & ":" & Bottom).Copy NewWS.Rows(1)
参考まで
No.3
- 回答日時:
#1
>しかし、画像の大きさや位置が微妙に元データとずれてしまっていました。
先にコピーしてから列幅設定しているせいかもしれません。
検証していませんので、、見落としですね。すみません。
新しいシートを作る
Set NewWS = Worksheets.Add(after:=Worksheets(Worksheets.Count))
NewWS.Name = "表" & (V - 1) * H_Page + H '表の名前をつける
先に
For i = 1 To Right
NewWS.Columns(i).ColumnWidth = .Columns(i).ColumnWidth
Next
を実行して
.Range(.Cells(Top, Left), .Cells(Bottom, Right)).Copy NewWS.Cells(1, 1)
上手く行きますでしょうか。
#2
shapeを見落としていました。
コピー先のShapeを削除する必要がありますね。
Dim shp As Shape
Set NewWS = Worksheets.Add(after:=Worksheets(Worksheets.Count))
NewWS.Name = "表" & (V - 1) * H_Page + H '表の名前をつける
.Cells.Copy NewWS.Cells(1,1)
NewWS.Cells.ClearContents
For Each shp In NewWS.Shapes
shp.Delete
Next shp
'表を追加したシートにコピー
.Range(.Cells(Top, Left), .Cells(Bottom, Right)).Copy NewWS.Cells(1, 1)
>例えば、列幅が元シートと全く同じシートをページ分用意して、そのシートのA1にセルを挿入するというような動作はできますでしょうか?
可能ですが、全体のプロセスを見直す必要がありますね。
今回の回答は、ご掲示のプロセスがありましたので、それに基ずくアドバイスになります。
参考まで
お早いご返信ありがとうございます!
書き直してみました。
これで大丈夫でしょうか?
実行したところ「実行時エラー'1004' この操作は結合したセルには行えません」とメッセージが出てしまいました。7/60シートほどはうまくいっていました!!
デバックの結果「.Range(.Cells(Top, Left), .Cells(Bottom, Right)).Copy NewWS.Cells(1, 1)」この行が黄色く表示されました。
ご回答よろしくお願いします。
Dim i As Long
Dim shp As Shape
'シートを一番後ろに追加
Set NewWS = Worksheets.Add(after:=Worksheets(Worksheets.Count))
NewWS.Name = "表" & (V - 1) * H_Page + H '表の名前をつける
For i = 1 To Right
NewWS.Columns(i).ColumnWidth = .Columns(i).ColumnWidth
Next
.Cells.Copy NewWS.Cells(1,1)
NewWS.Cells.ClearContents
For Each shp In NewWS.Shapes
shp.Delete
Next shp
'表を追加したシートにコピー
.Range(.Cells(Top, Left), .Cells(Bottom, Right)).Copy NewWS.Cells(1, 1)
Next
Next
End With
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 【ご教示ください】VBAの記述方法がわかりません。 2 2022/08/12 21:28
- Visual Basic(VBA) 【前回の続き続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/24 20:49
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
- Visual Basic(VBA) いつもお世話になっております、VBAで教えて頂きたいのですが 2 2022/05/05 22:20
- Excel(エクセル) エクセルVBAでオブジェクトが必要です 2 2022/09/10 16:37
- Visual Basic(VBA) 【前回の続きです、ご教示ください】VBAの記述方法がわかりません。 2 2022/08/16 16:44
- Visual Basic(VBA) 別シートから年齢別の件数をカウントしたいの続き 5 2023/01/24 00:16
- Visual Basic(VBA) コード名シートA列と集計シートA列のコードが一致したら、コード名シートA5からk12の範囲をコピーし 1 2022/08/29 23:46
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) 数字が「0」の列を削除するため、下記のコードを実行しましたが、コンパイルエラーSubまたはFunct 3 2022/12/04 00:00
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルの選択範囲以外を削除...
-
Excelの行をコピーして貼り付け...
-
Excel 関数を使ってデータと一...
-
EXCELのVBAでシートコピーをし...
-
EXCEL VBA シートをコピーする...
-
VBAでVBAを削除?
-
EXCELで別のブックから式をコピ...
-
Excel シートのコピーの際、ペ...
-
エクセル2007 セルの名前の重...
-
エクセルの1シートの内容を複...
-
【エクセル】プルダウン設定の...
-
PDFファイルをコピーしてエクセ...
-
ページの設定を別シートにコピ...
-
EXCEL VBA シートの名前を指定...
-
エクセルマクロ 繰り返して、...
-
Excel 複数 シートコピー 同...
-
シートをたくさんコピーするに...
-
エクセルマクロ。複数のbookか...
-
シートのコピーとMsgbox無効化
-
エクセル オートフィルタは行...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excelの行をコピーして貼り付け...
-
Excel 関数を使ってデータと一...
-
エクセルの選択範囲以外を削除...
-
EXCELのVBAでシートコピーをし...
-
EXCELで別のブックから式をコピ...
-
Excel シートのコピーの際、ペ...
-
Excel 数式の保護をしたセルを...
-
【VBA】コピー&複数個所のペー...
-
エクセルのワークシートをUSBメ...
-
エクセルシートを別のエクセル...
-
エクセルでシートを「移動また...
-
エクセルの1シートの内容を複...
-
エクセルVBA 1行飛ばしで転記す...
-
ExcelVBAで、ユーザーフォーム...
-
【エクセル】プルダウン設定の...
-
CSVファイルについて質問です。
-
PDFファイルをコピーしてエクセ...
-
ページの設定を別シートにコピ...
-
VBA シートをコピー後、ボタン...
-
エクセルのページをシートごと...
おすすめ情報
よく確認したところ、画像自体の大きさが変わっているのではなくて、行の高さが元シートから変更されてしまっていて、それに付随して画像の縮尺が変わるなどの問題が起きているようでした。