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

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

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

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

Q&A

解決済

2回答

12646閲覧

Excelで特定の列の値を新規Bookとして保存したい

7snow

総合スコア12

VBA

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

0グッド

0クリップ

投稿2019/03/03 01:01

編集2019/03/03 01:03

前提・実現したいこと

Excelで特定の列の値を新規Bookに保存したい。

sheetをまるごと新規Bookとして保存することはできたのですが、特定の列の値のみを新規Bookに保存
する方法が分からず苦戦しています。

例えば

下記表があるとします。この表の列A1~C3には関数が入力されてあり、関数の結果が下記表の値となっ
て表示されています。
この表に対しマクロでC列の値を新規Bookに保存するVBAを記述するにはどのようにすればよいので
しょうか。

Book名:データ
Sheet名:LIST

A列B列C列
1行目a001b001c001
2行目a002b002c002
3行目a003b003c003

試したこと

やり方がわからず、現状は上記表を列ごとにSHEETを分けて保存し、下記マクロで新規Bookに関数ごとコピーし作成しています。
関数ごとコピーして作成しているため、元のBook「データ」の値を参照しにいってしまう。参照させたくないため、値だけ保存
したいという所です。

VBA

1Sub C_List() 2 3Sname = Application.GetSaveAsFilename("C_List.xlsx", "Excel ファイル,*.xlsx;*.xlsm") 4 5 If Sname = False Then Exit Sub 6 Sheets("LIST").Copy 7 ActiveWorkbook.SaveAs Sname, FileFormat:=xlOpenXMLWorkbook 8 9End Sub

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

office 2016

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

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

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

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

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

guest

回答2

0

ベストアンサー

①ActiveWorkbookは現在アクティブなブック

nskydivingさんからも指摘がある通り、ActiveWorkbookは現在アクティブなワークブックを指すものです。
ActiveWorkbook("sname")では、アクティブなブックに対し、さらにブック名を指定しているような記述になってしまいますよね?

さらに変数名であるSnameを""で囲んでしまうと、変数に格納されていたブック名などとは関係ない、ただの"sname"という文字列として認識されてしまいます。

もう1点。
LISTシートのセル範囲("C:C")に対して、新規ブックのセル("A1")の値を入力する記述になっています。
この場合、LISTシートのC列のすべてのセルに、新規シートのA1セルの値が入力されることになります。
これは想定している動作(C列の値を新規ブックのA列にコピー)とは逆の動作になっていませんか?

おそらくやりたかったのは逆、つまり
Workbooks(Sname).Sheets("sheet1").Range("a:a").Value = Sheets("LIST").Range("c:c").Value
こうではないでしょうか?

②ブックやシートは明示する

ブックやシートをまたいで処理をする際は、できるだけ暗黙的な表記(ブックを省略してSheetsを指定する)とか、アクティブなシートやブックを指定した処理は行わない方がいいです。

処理の最中にアクティブなブックやシートが切り替わると、暗黙の参照先やアクティブブックなどが変わってしまい、意図しない動作の原因となるからです。

例えば新規ブックを作成するとそのタイミングで新規ブックがアクティブになりますし、処理の途中でユーザー操作によりブックやシートが切り替えられることもあるかもしれません。

対象のブックやシートは明示するのがエラー回避の第一手となります。

③どのブックを保存するのか?

現在の処理では、アクティブワークブックに対して「名前を付けて保存」をしています。
元ブックを別名で保存するということは、不要な列やシートまで一緒に保存されることになります。

今回の場合、保存したいのは現在のブックではなく、現在のブックからC列の値だけをコピーした新しいブックですよね?

つまり「現在のブックを、ファイル名を変えて保存」するのではなく、「新しいブックを作り、名前を付けて保存」するのが意図する流れだと思います。
新しいブックを作成するのはWorkbooks.Addです。

サンプルコード

以上を踏まえたサンプルです。

VBA

1Sub Sample() 2 3 '現在のブックを変数に保管(Activeなブックが変わっても参照できるように。変数は使わず、ThisWorkbookで参照するのも可) 4 Dim wbSrc As Workbook 5 Set wbSrc = ActiveWorkbook 6 7 '新規ブックの作成 8 Dim wbNew As Workbook 9 Set wbNew = Workbooks.Add 10 11 '元ブックのC列を、新規ブックのA列に値としてコピー 12 wbSrc.Sheets("LIST").Range("C:C").Copy 13 wbNew.Sheets("sheet1").Range("A:A").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks:=False, Transpose:=False 14 15 'wbNew.Sheets("sheet1").Range("A:A").Value = wbSrc.Sheets("LIST").Range("C:C").Value '←コピーはこれでも可。これだとクリップボードは使用しないが少し処理が遅くなる 16 17 '名前を付けて保存 18 Dim Sname As String 19 Sname = Application.GetSaveAsFilename("C_List.xlsx", "Excel ファイル,*.xlsx;*.xlsm") 20 If Sname <> "False" Then 21 wbNew.SaveAs Sname, FileFormat:=xlOpenXMLWorkbook 22 End If 23 24 wbNew.Close 25 26End Sub

以上です。

それぞれの処理で主要な命令については一度調べて、理解してからご利用されることをお勧めします。
参考になれば幸いです。

投稿2019/03/11 06:32

編集2019/03/11 06:35
jawa

総合スコア3013

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

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

7snow

2019/03/22 23:49 編集

ご回答ありがとうございました。また、返信大変遅れ、ご心配をおかけしました。 今回、教えて頂いたコードを使い、無事に問題を解決することができたのに加え、アドバイス頂いた点を活かし、他の処理にも水平展開することができたので、大変助かりました。 また機会がありましたら、どうぞよろしくお願いします。
guest

0

セルの値のみをコピーしたい場合は、Value プロパティを使用します。

例:
ブックはあらかじめ開いておいてください。

VBA

1Workbooks("book1.xlsx").Sheets("Sheet1").Range("A1").Value = Workbooks("book2.xlsx").Sheets("Sheet1").Range("A1").Value

今回の場合は、

  • 最初から値のみをコピーする。
  • セルをコピーしてから参照を値に変換する。

のどちらかになるかと思います。

投稿2019/03/03 02:00

編集2019/03/04 01:51
nskydiving

総合スコア6500

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

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

7snow

2019/03/03 06:36

回答ありがとうございます。 ”最初から値のみをコピーする”でいくことにします。 早速以下を実行しましたが、エラー「実行時エラー'438'オブジェクトはこのプロパティまたはメソッドをサポートしていません。」 となってしまいます。実際に書くコードを教えてもらうこと可能でしょうか。 ```vba Sub C_List() Sname = Application.GetSaveAsFilename("C_List.xlsx", "Excel ファイル,*.xlsx;*.xlsm") If Sname = False Then Exit Sub Sheets("LIST").Range("c:c").Value = ActiveWorkbook("sname").Sheets("sheet1").Range("a1").Value ActiveWorkbook.SaveAs Sname, FileFormat:=xlOpenXMLWorkbook End Sub ```
nskydiving

2019/03/04 01:53

「ActiveWorkbook("sname")」の書き方が間違っています。 もし直すなら「Workbooks(Sname )」ですが、それでも全体としてはまだおかしいように思います。 回答欄のコードをブック間コピーに変更しましたので、参考にしてください。
7snow

2019/03/07 12:46

試したのですが、結局うまくいかなかったため、踏み台のシートに値のみコピーし、そのシートを新規Bookとして保存する方法に切り替えることにしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問