①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/22 23:49 編集