
「回答」シートにおいて1行に1件ずつデータが入っており,I2セルからI3セルで行番号を始点,終点として指定すると「様式」シートに指定した行のデータが順番に反映され,それらを結合した状態で出力し,ファイル名はI2セルに入力した行のデータ容に則したものになるコードについて伺います。
以前,この掲示板で質問させていただいおり,そのときは「ファイル名はI2セルに入力した値のときに「様式」シートに反映される内容に則したものにしたい」という条件がなかったため,そのときに教えていただいたコードに修正を加えたものが以下のコードですがエラーで止まってしまいます。
(l = Sheets("回答").Range("N7").Value &~の部分で止まってしまいます)
どのように修正したらよいか,ご教示願います。
Sub 連続PDF作成()
Dim stK, stY, stD
Dim startN, endN, i As Long
Const AA = "A1:H40" ' ← コピー(転記)対象のセル範囲
Dim l As String ' ← 作成するPDFファイル名
Set stK = Worksheets("回答")
Set stY = Worksheets("様式")
startN = stK.Range("I2").Value
endN = stK.Range("I3").Value
If Application.CountBlank(stK.Range("I2:I3")) > 0 Or _
Not (IsNumeric(startN) And IsNumeric(endN)) Then _
MsgBox "無効な入力です": Exit Sub
Application.ScreenUpdating = False
Application.DisplayAlerts = False
stY.Copy
With ActiveWorkbook
Set stD = ActiveSheet
For i = startN To endN
stK.Range("A5").Value = stK.Cells(i + 9, 1).Value
stD.Copy after:=.Worksheets(.Worksheets.Count)
.Worksheets(.Worksheets.Count).Range(AA).Value = stY.Range(AA).Value
Next i
stD.Delete
stK.Range("A7").Value = stK.Cells(startN + 9, 1).Value
l = Sheets("回答").Range("N7").Value & "・" & Sheets("回答").Range("G7").Value & "・" & Sheets("回答").Range("D7").Value
.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\" & l & ".pdf"
.Close False
End With
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
No.4ベストアンサー
- 回答日時:
こんばんは
上から読んだだけで試していませんが
勘違いをしているようですね
よくRange()などでやるやつですね
オブジェクトを明示しないため間違った場所を探す不具合 今回はWorkbook
stY.Copy で 新しいブックが作られます(1シートのみ)
これがActiveWorkbookです
Sheets("回答")のブックは?ThisWorkbookのはずです
しかし l = Sheets("回答")(エラー対象コード)が走る時
まだ新規ブックがアクティブになっているので当然 Sheets("回答")はありませんね
対策は#3様のアドバイスを支持しますが
改造して不具合と言う事で付け加えます
通常 処理は上から下に流れていきます
大まかに 入力(条件定義・設定・値の取得など)メイン処理 出力
今回加えたのはエラー部分と見受けられますが
l = Sheets("回答").Range("N7").Value ・・・・
変数 l はメイン処理の結果を必要としていない様ですの
上流で変数 l に値を代入すればスムースな気がします
MsgBox "無効な入力です": Exit Sub の下あたり
もっとも Sheets("回答")は せっかく変数を作っているのですから
stK.Range("N7").Valu・・・・
上手く言えませんが Withの中で他のオブジェクトを明示しないで使うのは避けた方が良いと思います(あらかじめ変数などにセットし明示する)
No.6
- 回答日時:
連投になってしまい申し訳ありません
やっちゃいました。。。確認せずにすぐ投稿してしまう癖
出力PDFファイル名は変更箇所が含まれないので #5が間違えです;
エラーとは関係ないところですが
よく見るとおかしいですね
>それらを結合した状態で出力し
各ページの内容を変えながら1pdfファイルにまとめて(複数ページで)出力したい?
現状ブックシートを増やしているので
1pdfファイルにまとめて(複数ページで)出力は出来ないと思います
やるとしたら初めの1シートは現状のCopyで新規ブックを作り
内容を変更した元シートを新規ブックのインデックス1(Copyで出来た)シートの下部または右にペーストしてつなげて行き同じシートにまとめてページ設定して出力します(ブックを作ってからやるのかもしれないけれど)
ページごとに別ファイルを出力するなら 都度名前を変更する必要があるのと 出力部分をループ内に入れる事で出来ると思います
>「ファイル名はI2セルに入力した値のときに「様式」シートに反映される内容に則したものにしたい」
l = Sheets("回答").Ran・・・ 説明とシート名が一致していない
>stY.Range(AA).Value 変更コードが無い
最終stK.Range("A5").Valueは stK.Cells(endN + 9, 1).Value
ループ内に入れる理由?
stY.Range(AA)が
stK.Range("A5").Valueを参照している関数?かもしれないが・・
とりあえず
l = Sheets("回答").Range("N7").Value & "・" & Sheets("回答").Range("G7").Value & "・" & Sheets("回答").Range("D7").Value
.ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\" & l & ".pdf"
.Close False
を消して目的のブックが出来ているか確認する必要がありそうかな
惑わせる回答ついでに
目的のブックが出来る事が前提ですが添削してみました
各ページの内容を変えながら1pdfファイルにまとめて(複数ページで)出力付け足す考え方で
Sub 連続PDF作成2()
Dim stK, stY, stD
Dim startN, endN, i As Long
Const AA = "A1:H40" ' ← コピー(転記)対象のセル範囲
Dim l As String ' ← 作成するPDFファイル名
Set stK = Worksheets("回答")
Set stY = Worksheets("様式")
startN = stK.Range("I2").Value
endN = stK.Range("I3").Value
If Application.CountBlank(stK.Range("I2:I3")) > 0 Or _
Not (IsNumeric(startN) And IsNumeric(endN)) Then _
MsgBox "無効な入力です": Exit Sub
l = stK.Range("N7").Value & "・" & stK.Range("G7").Value & "・" & stK.Range("D7").Value
Application.ScreenUpdating = False
Application.DisplayAlerts = False
stY.Copy
With ActiveWorkbook
Set stD = ActiveSheet
For i = startN To endN
stK.Range("A5").Value = stK.Cells(i + 9, 1).Value
stD.Copy after:=.Worksheets(.Worksheets.Count)
.Worksheets(.Worksheets.Count).Range(AA).Value = stY.Range(AA).Value
Next i
Dim n As Long, rCount As Long
If endN - startN > 0 Then
With .Worksheets(2).UsedRange
rCount = .Rows(.Rows.Count).Row
End With
For i = 3 To .Worksheets.Count
With .Worksheets(2).UsedRange
n = .Rows(.Rows.Count).Row + 1
End With
.Worksheets(i).UsedRange.Copy .Worksheets(2).Cells(n, 1)
Next i
.Worksheets(2).PageSetup.PrintArea = .Worksheets(2).UsedRange.Address
For i = rCount + 1 To n Step rCount
.Worksheets(2).Rows(i).PageBreak = xlPageBreakManual
Next
End If
.Worksheets(2).ExportAsFixedFormat xlTypePDF, ThisWorkbook.Path & "\" & l & ".pdf"
.Close False
End With
stK.Range("A7").Value = stK.Cells(startN + 9, 1).Value
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
始めのページ stD.Delete でいらないようなので
シートインデックス2にまとめています
いる場合はシートインデックス 2 を 1に シートインデックスループ初期値 3 を 2 にすると初めのコピペシートが含まれるようになります
新規ブックはどのみち保存せずに閉じるので 削除などは不要ですね
No.5
- 回答日時:
酔って寝る前に回答してはダメですね
>stK.Range("A5").Value = stK.Cells(i + 9, 1).Value
前言撤回します
変数 l はメイン処理の結果を必要としていない様ですの上流で変数 l に値を代入すればスムースな気がします
すみませんでした
No.2
- 回答日時:
こんばんは
>l = Sheets("回答").Range("N7").Value &~の部分で止まってしまいます
通常であれば、このセンテンスでエラーになることは無いと思いますが・・
妄想を逞しくしてみるなら・・・
(以下は妄想なので、当たるも八卦です)
エラーメッセージは「インデックスが~~」だったりしませんか?
もしそうなら、
>Set stD = ActiveSheet
のActiveSheetは「回答」シートだったりしませんか?
(ご提示のコードのこの部分が何をしたいのか不明ですが・・)
更に、もしそれも当たっているなら、
>stD.Delete
でシートを削除しているので、「参照先が見つからない」というエラーですね。
作成中やデバッグ中は、
>Application.ScreenUpdating = False
>Application.DisplayAlerts = False
などは、外しておいた方が、原因等も見つけやすいと思いますよ。
ありがとうございます。
以前,元となるコードを作っていただいた方ですね。
返事が遅くなり申し訳ありません。
>Set stD = ActiveSheet
のActiveSheetは「回答」シートだったりしませんか?
(ご提示のコードのこの部分が何をしたいのか不明ですが・・)
ActiveSheetは「回答」シートではなく「様式」シートのはずです。
エラーメッセージは
「実行時エラー 9
インデックスが有効範囲にありません」
です。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
このQ&Aを見た人はこんなQ&Aも見ています
-
【VBA】PDF出力に任意のファイル名前を付ける方法
Excel(エクセル)
-
Excel VBAで値を変えながら、pdf出力したい
Visual Basic(VBA)
-
エクセルをPDFで保存し、ファイル名はA1セルを参照するVBAの記述を教えてください。
Excel(エクセル)
-
-
4
【ExcelVBA】値を変更しながら連続でPDFを作成し,それらを結合した状態で出力するコード
Visual Basic(VBA)
-
5
【VBA】値を変更しながら連続でPDFを作成し,それらに印刷設定をした状態で結合するコード
Visual Basic(VBA)
-
6
EXCEL ページを指定してPDF出力するVBAを教えてください。
PDF
-
7
Excelの選択範囲を特定のセル値をファイル名にしてPDFで保存する
Excel(エクセル)
-
8
エクセルVBA、ファイル名をセルの値で保存の方法を教えてください。 おそれいります。こちらで数々のエ
Excel(エクセル)
-
9
【Excel】指定したセルの名前でPDFを保存する【VBA】
Visual Basic(VBA)
-
10
VBA PDF ファイル名をセルからつける
Excel(エクセル)
-
11
エクセルマクロで差し込みしたものを1つのファイルでPDF化したいです
その他(Microsoft Office)
-
12
エクセル マクロ 名前を付けて保存 PDF保存先指定 ファイル名任意+日付
Excel(エクセル)
-
13
エクセル:マクロ「Application.CutCopyMode = False」って?
Excel(エクセル)
-
14
マクロVBA特定フォルダーに次々に自動保存する方法
Android
-
15
マクロ、PDFを任意のフォルダへ保存
Excel(エクセル)
-
16
VBAでPDFを作成する際、同じ名前のデータがすでにある時の対処法を教えてください。
Microsoft ASP
-
17
【ExcelVBA】全シートのセルの数式を値に変換する事は可能でしょうか?
Visual Basic(VBA)
-
18
【マクロ】名前を保存する際に、同じファイルがあった場合に、メッセージを表示
Excel(エクセル)
-
19
【マクロ】【VBA】同じフォルダ内にあるエクセルのデータを転記したい【ブック1からブック2へ】
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
Excel UserForm の表示位置
-
VBAマクロ実行時エラーの修正に...
-
セルの半透明着色処理
-
エクセル、マクロで番号を読込...
-
Excelで空白セル直前のセルデー...
-
【ExcelVBA】値を変更しながら...
-
Excel VBAで特定の範囲の空白セ...
-
入力規則のリスト選択
-
DataGridViewでグリッド内に線...
-
データグリッドビューの結合セ...
-
EXCEL VBA 文中の書式ごと複写...
-
【Excel VBA】マクロで書き込ん...
-
C# DataGridViewで複数選択した...
-
CellEnterイベント仕様について
-
エクセルの値を範囲指定で取得...
-
Excelのセルから日付情報を取得...
-
複数指定セルの可視セルのみを...
-
昨日、質問した件『VBA にて、...
-
エクセルのカーソルを非表示に...
-
エクセル VBA ボタンをクリック...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
Excel UserForm の表示位置
-
VBAマクロ実行時エラーの修正に...
-
特定の色のついたセルを削除
-
エクセルVBA 配列からセルに「...
-
【VBA】【ユーザーフォーム_Lis...
-
Excelで空白セル直前のセルデー...
-
C# DataGridViewで複数選択した...
-
【Excel VBA】マクロで書き込ん...
-
データグリッドビューの結合セ...
-
【Excel VBA】一番右端セルまで...
-
入力規則のリスト選択
-
VBA:日付を配列に入れ別セルに...
-
DataGridViewでグリッド内に線...
-
エクセル、マクロで番号を読込...
-
エクセルのカーソルを非表示に...
-
マクロ初心者です。 マクロで範...
-
EXCEL VBA 文中の書式ごと複写...
-
Excel 範囲指定スクショについ...
-
セルの半透明着色処理
-
VBA にて、条件付き書式で背景...
おすすめ情報