質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

3回答

449閲覧

VBAでの名前を付けて保存に関して

junkij

総合スコア4

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2020/08/11 04:54

前提・実現したいこと

VBAを独学で覚えながら
業務効率化に取り組んでおります。
取引先に提出する書類を自動で出力することが出来ましたが、

最後に名前を付けて保存するところをVBAで自動化したいです。

【現状】
書類の番号に基づき、
入力する箇所が自動入力(Index Match を用いて別ファイルから値を引っ張ってきている)

ここから取引先に送るために、
①自動入力された値を別ファイルに値貼り付け
貼り付け元(”C2:Q39”)セルを
貼り付け先(”A1")セルから値貼り付けしたいです。

自分なりにVBAで記述してみましたがうまくいきませんでした。
下記が自分でかいたVBAです。


Sub 名前をつけて()

Dim book1 As Workbook Workbooks.Open Filename:="ここは格納先のパスをコピペ" Cells("A1:O38").Value = book1.Cells("C2:Q39") Set book1 = ActiveWorkbook book1.SaveAs Filename:="ここは格納先のパスをコピペ" book1.Close

End Sub

Cells("A1:O38").Value = book1.Cells("C2:Q39")
の部分にてエラーが出ます。
貼り付け元(”C2:Q39”)セルを
貼り付け先(”A1")セルから値貼り付けしたいです。

ご教授お願い致します。

発生している問題・エラーメッセージ

オブジェクト変数またはwithオブジェクト変数が設定されていません

該当のソースコード

VBA

1Sub 名前をつけて() 2 3 Dim book1 As Workbook 4 5 Workbooks.Open Filename:="ここは格納先のパスをコピペ" 6 Cells("A1:O38").Value = book1.Cells("C2:Q39") 7 8 Set book1 = ActiveWorkbook 9 book1.SaveAs Filename:="ここは格納先のパスをコピペ" 10 11 book1.Close 12 13End Sub

試したこと

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

説明が曖昧です。
もう少し、やりたいことを正確に誤解なく伝わるように整理して説明してください。

現在開いて操作しているブック(マクロが記述してあるブック)から、
別ブックを開いてそこに値を代入して、上書き保存するということでしょうか。

下記のように整理するとわかりやすくなります。

貼り付け元ブック:マクロが記述してあるブック
貼り付け元シート:現在アクティブなシートでしょうか?
貼り付け元セル範囲:Range("C2:Q39")

貼り付け先: 別ブック(パスで指定)
貼り付け先シート:不明(一番目のシートでいいのでしょうか。)
貼り付け先セル範囲:Range("A1:O38")

質問の説明やコードには、シートに関する説明が不足しています。
上記の点を明確にすればコードの不足点も分かってくるでしょう。
この点を明確にしてコードを書きなおしてみてください。


その他、コード上のあきらかな間違い。

Cells("A1:O38")というような指定はできません。
Cells(行番号,列番号)という形で一つのセルしか指定できません。
セル範囲を指定する場合は、Range("A1:O38")となります。

book1.Cells("C2:Q39")はさらにシートの指定がありません。どのシートが対象なのか明確にする必要があります。
例えば book1.WorkSheets("Sheet1").Range("C2:Q39")

また、この book1、この時点でどのブックなのか不明です。

上記を考慮してコードを再検討してみてください。

追記

コメントの情報を考慮して
コードの一例

vba

1Sub 名前をつけて() 2 Dim fromBook As Workbook '貼り付け元ブック 3 Set fromBook = ThisWorkbook 'マクロの記述してあるブック 4 5 Dim fromSheet As Worksheet '貼り付け元シート 6 Set fromSheet = fromBook.ActiveSheet 7 8 Dim fromRng As Range '貼り付け元セル範囲 9 Set fromRng = fromSheet.Range("A1:O38") 10 11 Dim newBook As Workbook '貼り付け先ブック=新規ブック 12 Set newBook = Workbooks.Add 13 14 Dim toRng As Range '貼り付け先セル範囲 15 Set toRng = newBook.Worksheets(1).Range("C2:Q39") 16 17 toRng.Value = fromRng.Value 18 19 Dim NewBookName As String 20 NewBookName = fromSheet.Range("請求書番号のあるセル") & ".xlsx" 21 22 newBook.SaveAs FileName:="ここは格納先のパスをコピペ" & NewBookName 23 newBook.Close 24 25End Sub

変数名は意味の分かるものにするとコードが読みやすくなると思います。

投稿2020/08/11 06:16

編集2020/08/12 07:20
hatena19

総合スコア33715

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

junkij

2020/08/11 09:43 編集

hatena19さん ご教授頂きありがとうございます。 また説明不足で申し訳ございません。 現在開いて操作しているブック(マクロが記述してあるブック)から、 新規ブックを作成し値を代入して、上書き保存が目的です。 (=名前を付けて保存) 貼り付け元ブック:マクロが記述してあるブック 貼り付け元シート:現在アクティブなシート 貼り付け元セル範囲:Range("C2:Q39") 貼り付け先: 新規で追加した別ブック(格納先はパスで指定) 貼り付け先シート:一番目のシート 貼り付け先セル範囲:Range("A1:O38") となります。 下記のように訂正してみましたが、うまくいきません。 Sub 名前をつけて訂正版() Dim book1 As Workbook Set book1 = ActiveWorkbook ‘マクロのあるブック(貼り付け元のブック) Workbooks.Add  ‘貼り付け先のブック ?(‘貼り付け先のブック=上記で新たに追加したワークブック).Range("A1:O38").Value = book1.Range("C2:Q39") Dim TargetPath As String, TargetPath = "格納先のパスをコピペ" ?(’貼り付け先のワークブック).SaveAs TargetPath book1.Close End Sub 不明点①  book1の指定 book1は「マクロのあるブック=ActiveWorkbook」を想定しておりますので、 Set book1 = ActiveWorkbook の部分を上部に移動しましたが、これであっているか分かりませんでした。 不明点② 貼り付け先のブックの指定の仕方 貼り付け先は新しいワークブックを想定しており、(格納先は決定済み) そちらに各請求書の番号ごとに(1つの番号につき1つのファイル) にて保存していく予定です。 ThisWorkbook.Sheets(1).Copy After:=ActiveWorkbook.Sheets(Sheets.Count) 等も調べてみましたが、うまくいきませんでした。 自分なりにいくつか調べてみましたが、答えが見つかりませんでした。 至らぬ点ばかりではございますが、改善点を ご教授頂けますと幸いです。 宜しくお願致します
hatena19

2020/08/11 19:10

回答にコード例を追記しておきましたので、ご参照ください。
junkij

2020/08/12 07:14

ありがとうございました。 Dim fromSheet As Range '貼り付け元シート Set fromSheet = fromBook.ActiveSheet のRange をsheet にしたら近いものができました。 自分なりにここから訂正していきます。
hatena19

2020/08/12 07:19

あっ、ミスってました。回答のコード修正しておきます。(;^ω^)
guest

0

書類の番号に基づき、
入力する箇所が自動入力(Index Match を用いて別ファイルから値を引っ張ってきている)

ならば、
貼り付け元を開く必要はないのでは?
(今一つやりたいことがはっきりしません。)

とりあえずエラーの原因は、変数Book1に何も入ってなく、
Nothingなので、それにはCellsなどのプロパティはない(=定義されてない)ので、
オブジェクトの定義エラーになってます。
また、Book1にワークブックを代入したところで、
WorkbookオブジェクトにもCellsプロパティはないので、同じエラーになります。
「このセル」と指定したいなら、ブックとシートを明示して指定しましょう。

あと、説明では名前を付けて保存との
関連がわかりません。上書き保存でもよいのでは?と思ってしまってます。

今回、何がテーマなのでしょう、あれもこれもだと取っ散らかって答える方も困ります。

保存したいファイルのフルパスを示す文字列を作りたい

が、テーマなのかなぁ。。。

投稿2020/08/11 08:24

mattuwan

総合スコア2136

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

junkij

2020/08/11 10:13

mattuwanさん ご教授頂きありがとうございます。 勉強不足で book1 に Activesheetを指定したので大丈夫かなと勘違いしておりました。 (Activesheet=いまアクティブなブック、シートが自動指定?だと認識しておりました) Workbooks("Book1.xls")等で指定する認識にてお間違いないでしょうか。 ・名前を付けて保存について マクロがあるブック(=貼り付け元のエクセル)はあくまで計算用であり、 ここで出力された内容を、取引先に提出するために 新規ブックに値貼り付けし、それを提出用データとして送付する予定です。
guest

0

参考になるかわからないですが

オブジェクト変数またはwithオブジェクト変数が設定されていませんの原因

値貼り付けのやり方

名前がある程度固定されたものなら

book1.SaveAs Filename:="ここは格納先のパスをコピペ" ```の部分で直接ファイル名変えてあげれば そのまま名前が変わって保存されたと思います あとは

Cells("A1:O38").Value = book1.Cells("C2:Q39")

この部分がおかしいので一度上記で紹介したやり方でやってみてください これはコピーできてないです

投稿2020/08/11 06:22

編集2020/08/11 06:26
minagann

総合スコア8

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

junkij

2020/08/11 09:47

minagannさん ご教授頂きありがとうございます。 こちらも確認して、見直してみます。 ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問