プロが教える店舗&オフィスのセキュリティ対策術

お世話になります。

以下のマクロでエクセルの特定のシートをprn形式で保存しております。

今までこれで問題なかったのですが、
出力する(prnで保存する)範囲が少なくなったので、
特定のセル範囲を指定して prnで保存したいと思っています。

このページを参考にしたのですが ↓
https://oshiete.goo.ne.jp/qa/6373321.html

よくわかりませんでした。

シングルコーテーションの中の様に
特定のエリアをコピーするところまでは
※「"Sheet2"の"A1:B3"」
間違っていないと思いますが、シングルコーテーションを外すと
ここでエラーになってしまいます。
※もちろん「Worksheets("Sheet2").Copy」は削除してます

すいませんが間違えているところがわかる方で、
コードで説明できる方、間違えているところを教えて下さい。

以下の条件を満たしていれば、新規のコードでもOKです
すいませんがよろしくお願いします。

追記
1)prnで出力するエリアは前述の通り"Sheet2"の"A1:B3"です
※アクティブシートのエリアではありません

2)保存する名前は「Test」+「アクティブシートのB5セルの値」です

3)以下のマクロはprnで出力していますが、拡張子は「& ".html"」で
「html」にしています。

参考)
1)以下のマクロでそのまま「sheet2」がprnで出力できます
2)保存場所は便宜上「"C:\B\"」にしています。
※Cドライブの「B」フォルダー
※新規で書いて頂ける時はわかり良い場所にして頂けるとありがたいです
3)エラーメッセージは「コンパイルエラー:構文エラー」です
※ファイルが壊れてヘルプビューアーが見れないためヘルプは未確認です


Sub Sheet2_copy()
Dim book1 As Workbook
Dim i As String

i = Range("B5").Value
Worksheets("Sheet2").Copy
'Worksheets("Sheet2").range("A1:B3")Copy

Set book1 = ActiveWorkbook

book1.SaveAs Filename:="C:\B\" & "Test-" & i & ".html", _
FileFormat:=xlTextPrinter

book1.Close False

End Sub

A 回答 (6件)

さらに考え方を変えて、次の方が変更も楽だと思います。


--------------------------------------------------------------------------------
Sub Sheet2_copy()
Dim i As String
i = Range("B5").Value
Worksheets("Sheet2").Range("A1:B3").Copy
Workbooks.Add
ActiveSheet.Paste
Application.CutCopyMode = False
ActiveWorkbook.SaveAs Filename:="C:\B\Test-" & i & ".html", _
FileFormat:=xlTextPrinter
ActiveWindow.Close False
End Sub
--------------------------------------------------------------------------------
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。
No.6にまとめますね。

お礼日時:2017/12/28 22:24

No.5 の説明



新しいブックを作って、それに対象部分を貼り付けて名前を付けて保存しているだけです。
    • good
    • 1
この回答へのお礼

何回もご解答頂きありがとうございます。

No.5は最初のやつに似てますね。

私もよく似たところまで考えたのですが、
ここがわからなかったです。

Workbooks.Add
ActiveSheet.Paste

>新しいブックを作って、それに対象部分を貼り付けて名前を付けて保存しているだけです。

新しいブックを作って、対象部分を貼り付けた場合、
出力するシートはアクティブシート(新しいブックの)になるんですね。

何回もご解答して頂きありがとうございます。

年末ですが、良いお年をお迎えください。
機会がありましたら、またお願いします。

ベストアンサーはNo.5の方につけておきます。
今回はご解答ありがとうございます。

お礼日時:2017/12/28 22:27

「C10:D12」を使う時の削除する部分だけのコードを提示しておきます


--------------------------------------------------------------------------------
Range(Cells(1, 5), Cells(Rows.Count, Columns.Count)).Delete Shift:=xlToLeft
Range(Cells(13, 1), Cells(Rows.Count, Columns.Count)).Delete Shift:=xlUp
Range(Cells(1, 1), Cells(Rows.Count, 2)).Delete Shift:=xlToLeft
Range(Cells(1, 1), Cells(9, Columns.Count)).Delete Shift:=xlUp
--------------------------------------------------------------------------------
※ 重複して削除している部分もありますが、こちらの方が変更が楽だと思います。
    • good
    • 1
この回答へのお礼

ご解答ありがとうございます。
No.6にまとめますね。

お礼日時:2017/12/28 22:24

No.2 へのお礼について



「Rows.Count」は最終行、「Columns.Count」は最終列です。
つまり「Range(Cells(1, 3), Cells(3, Columns.Count)).Delete Shift:=xlToLeft」は、Excel2003以前は「C1:IV3」、Excel2007以降ならば「C1:XFD3」を削除して左に詰める。
「Range(Cells(4, 1), Cells(Rows.Count, Columns.Count)).Delete Shift:=xlUp」は、Excel2003以前は「A4:IV65536」、Excel2007以降ならば「A1:XFD1048576」を削除して上に詰めると言う事になります。
なお、今回は左上のエリアだったので右側と下側を削除するだけで良かったのですが、端ではない時は右側と下側を削除してから、上側と左側を削除すればエリアがずれないのでやりやすいと思います。
    • good
    • 0
この回答へのお礼

ご解答ありがとうございます。
No.6にまとめますね。

お礼日時:2017/12/28 22:23

全体を見直しました。

以下のような感じで良いと思います。
--------------------------------------------------------------------------------
Sub Sheet2_copy()
Dim book1 As Workbook
Dim i As String
i = Range("B5").Value
Worksheets("Sheet2").Copy
Range(Cells(1, 3), Cells(3, Columns.Count)).Delete Shift:=xlToLeft
Range(Cells(4, 1), Cells(Rows.Count, Columns.Count)).Delete Shift:=xlUp
Set book1 = ActiveWorkbook
book1.SaveAs Filename:="C:\B\Test-" & i & ".html", _
FileFormat:=xlTextPrinter
ActiveWindow.Close False
End Sub
--------------------------------------------------------------------------------
※「prn」形式での保存はエリア指定できないので、不要な部分を削除しています。
※ ちなみに「Close」の後の「False」は、ワークブックを閉じないという意味ではなく、閉じるときの確認メッセージを表示しないと言う意味になります。
    • good
    • 0
この回答へのお礼

ご解答ありがとうございます。

頂いたマクロで希望通り動作しました。
本当にありがとうございます。

すいませんが、ご面倒でなければ、以下の件について教えて頂ければありがたいです。

この2行が何をやってるのか全くわからないです

Range(Cells(1, 3), Cells(3, Columns.Count)).Delete Shift:=xlToLeft
Range(Cells(4, 1), Cells(Rows.Count, Columns.Count)).Delete Shift:=xlUp

Cells(1, 3)=C1、Cells(4, 1)=A4ですよね。
こんなところから何をやっているんですか?

Columns(列)、Rows(行)をカウントしているのは何となくわかります。
ですが、カウントするならCells(1, 1)からCells(3, 2)だと思うのですが?

出力するエリアが「C10:D12」などに変更になった時に、
変数を自分で変更する必要があります。

なのでエリアを特定するために、何をやっているのか知りたいです。
※長方形で選択できるエリアでないとダメなことくらいはわかります。

>
※ ちなみに「Close」の後の「False」は、ワークブックを閉じないという意味ではなく、閉じるときの確認メッセージを表示しないと言う意味になります。

そうでした。prnの新規ブックを出力する時に、
毎回、確認されると煩わしいので、確認なしで出力するようにしたのを忘れてました。

お礼日時:2017/12/28 20:03

多分「.」が抜けているだけだとおもうので「'Worksheets("Sheet2").range("A1:B3")Copy」を「Worksheets("Sheet2").Range("A1:B3").Copy」にしてください。

    • good
    • 0
この回答へのお礼

ご解答ありがとうございます。

確かに「.」が抜けていますね。
ですが、ご指摘通り「.」を追加して実行してみたところ、
アクティブシートがprnで出力されます。
しかも、ワークブックが閉じてしまします。
※エラーメッセージなしです


先のマクロをそのまま実行した時は
※シングルコーテーションの構文がそのままない状態は以下のとおりです

「sheet2」全体がprnで出力される
ワークブックは閉じないで開いたままま
※「book1.Close False」が機能している

動作がムチャクチャに感じます。
単純なことだと思うのですが、今回はさっぱりわからないです。

お礼日時:2017/12/28 17:40

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