勝手に初心者講座。パートのおばさんにもできたんだからあなたにもできる!やってみよう!VBA!
前回はファイルの操作・ステップ実行等をやりました。
今回はその続きです。
以下の手順をやっつけていきましょう。
ファイル1は開いておく
①ファイル2を開く
②ファイル2からデータをコピーして点数ファイルに入力する
③ファイル2を閉じる
④ファイル1を別名で保存する
■ファイルを読み取り専用で開く
前回書いたコード
このフォルダの中のワークブックdataファイルを開くよ。というコードを書きました。
dataファイルからデータをコピーしてくるだけなので、読み取り専用で開くことにします。
ファイルを開く部分を以下のように書き直します。
WorkBooks.Open filename:=path & “data.xlsx”, ReadOnly:=True
前回は直接パス名だけを WorkBooks.Open の後に書きましたが、今度は「開くファイル名は〇〇」「読み取り専用はTrue」と、引数名:=引数の形で書いています。
オブジェクト.メソッド 引数1:=〇〇, 引数2:=△△については「⑤ワークシートの操作」でやりましたね。
メソッドにどのような引数があるかはネット等で調べられます。
■コピーして別のファイルに貼り付けする
つづいて「コピーする」部分を書きます。
dataファイルのセル範囲A1~D5をマクロ実行ファイルのシート1のセルA2から貼り付けする、と書きます。
コピー元のファイルは開いた直後なのでアクティブになっているため「このブックの」「このシートの」の部分は省略しています。
ActiveWorkBook.WorkSheets(1).Range(“A1:D5”).Copy
と書けばなお良いです(が、長い・・・)。
貼り付け先のファイルはマクロを実行しているファイルです。アクティブなファイルではないのでこちらはどのブックのどのシートと指定してやらなければいけません。マクロを実行しているファイルは「ThisWorkbook」と指定できます。
貼り付け先はセル範囲を指定してもよいですが、貼り付け開始始点(一番左上のセル)を指定するだけでも大丈夫なので、楽な方で行きます。
■値貼り付け
コードを実行してみたら、こうなっちゃいました。
dataファイルにはデータだけで枠線がありませんでした。ただのコピーではなく値貼り付けにしたいです。
コードを書きなおします。
Range(“A1:D5”).Copy
ThisWorkBook.WorkSheets(1).PasteSpecial Paste:=xlPasteValues
これが値貼り付けの書き方です。よく使います。
************************************************
余談ですが、
さっきは一行だったのに値貼り付けは二行になる?と思った方。そうなんです。
ただのコピー貼り付けは1行でした。
Range(“A1:D5”).Copy ThisWorkbook.Worksheets(1).Range(“A2”)
じつは引数を省略して書いています。
Copyメソッドの引数はDestinationです。目的地、ですね。ここに貼り付けします!という引数です。
Range(“A1:D5”).Copy Destination:=ThisWorkbook.Worksheets(1).Range(“A2”)
という風に書きます。
Copyメソッドの引数はDestinationだけなので「値だけ貼り付けして~」という形式を選択した貼り付けはできません。そんなときはCopyメソッドでコピーだけして、PasteSpecialメソッド(形式を選択して貼り付けしてねというメソッド)で貼り付けをします。
PasteSpecialメソッドの引数、つまり形式を選択して貼り付けの「値」とか「数式」とかを指定します。
値貼り付けは xlPasteValues と指定します。
ちなみに数式は xlPasteFormulas です。
その他の引数はネット等を参照してください。
************************************************
■オブジェクトを変数に代入するには
さて、ブックやシートを行ったり来たりする場合は「このブックのこのシートのこのセル」とか「あのブックのあのシート」とか明示しなけらば行けないので面倒ですね。そこで、たびたび登場するブックやシートを変数に入れてしまうとプログラムがすっきりと書けます。
ブックやシートは「オブジェクト」というのもになります。
オブジェクトとは操作される対象。ワークシートやブック、セルなどの、なんとなく一言で言うと「モノ」みたいな感じのもの。
このシリーズの第⑤回で触れています。
「オブジェクト」を変数に入れる場合は、
Dim 変数名 As オブジェクトの種類
Set 変数名 = オブジェクト
という書き方をします。
数値を入れたりする変数の場合と違って変数名の前に「Set」が必要です。
********************
実は数値を入れる変数の場合も Let 変数名 = 数値 というのが正式で、SetじゃなくてLetが隠れているのです。Letは省略可能なのであんまりつけませんが、オブジェクトを変数に代入する際の「Set」は省略できないので必ずつけます。
(私はよく忘れてエラーになる・・・。)
********************
では、シートやブックを変数にセットすることにして、書き直してみましょう。
①変数の宣言をまとめて行っています。2行目以降がオブジェクト変数です。
エクセルファイルを入れる場合、変数の型は Workbook です。
エクセルのシートを入れる場合は、変数の型は Worksheet です。
変数名は何でもいいです。このファイル・シートを指しているんだな、とわかりやすい方がよいですが。
② Set wb1 = ThisWorkBook
変数 wb1 にマクロ実行ブックをセットしています。これ以降、wb1 というとマクロ実行ブックのことになります。
③ Set ws = wb1.Worksheets(1)
変数 ws にwb1(マクロ実行ファイル)のワークシート1をセットしています。この時点で開いているファイルはマクロ実行ファイルのみなので、wb1は省略可ですがせっかくなので省略せず書いています。
④ Set wb2 = WorkBooks.Open(Filename:= path & “data.xlsx”, ReadOnly:=True)
「data」ファイルを読み取り専用で開き、開くと同時に変数 wb2 に開いた「data」ファイルをセットしています。
前回との違いがわかりますでしょうか?WorkBooks.Openの後の引数のところをかっこでくくっています。Openした後の戻り値(なんかやった後に帰ってくる値)を利用する場合は引数部分はかっこでくくります。
変数にセットする場合はOpenメソッドの後はかっこでくくると覚えておけばよいと思います。
⑤ Set wsData = wb2.Worksheets(1)
変数 wsData にwb2のシート1をセットしています。この場合も開いた直後でwb2がアクティブなのでwb2は省略可能です。でもせっかくなので書いています。
⑥ wsData.Range(“A1:D5”).Copy
wsDataのセル範囲A1~D5をコピーしています。
前との違いはwsDataのセル範囲だよと明示しているところです。
wsDataは上の行で「wb2のシート1だよ」と指定しているので、wsDataだけで「wb2の」という意味も引き連れているので、wb2.wsData.Range(“A1:D5”) と指定する必要はもうありません。というか、そう書くとむしろエラーになります。
⑦ ws.Range(“A2”).PasteSpecial Paste:=xlPasteValues
wsのセルA2を支店に貼り付けしています。前との違いは ThisWorkBook.Worksheets(1).Range(“A1”) と指定していたところが、ws.Range(“A1”) だけでよくなりました。なんとすっきり!
************************
ところで、なんで変数を宣言するときは Worksheet なのに、変数にセットするときは Set ws = Worksheets(1) って複数形の「s」がつくの?って思いませんでしたか?私は混乱しました。
オブジェクトとしての Worksheet は一枚なので単数形。
そのオブジェクトを指定するときは「複数あるワークシートコレクションのうち1番目のシート」と指定するので複数形 Worksheets の中の1番目のシート、となるわけです。シート名で指定するときも「複数あるワークシートコレクションのうち〇〇という名前のシート」という意味なので Worksheets(“〇〇”) と指定します。
変数の型は 1枚(1つ)なので単数形、「これ」って指定するときは複数ある中から指定するので複数形、と頭の片隅に入れておくと混乱しないかもしれません。(もっと混乱したらごめんなさい)
************************
■ファイルを閉じる
dataファイルは用済みなので、ファイルを閉じます。
ファイルを閉じるのは
Workbookオブジェクト . Close
になります。
引数 SaveChanges で保存するかしないかを指定できます。
Workbooks(“data”).Close SaveChanges:=Ture
だとファイルを保存して閉じます。
Workbooks(“data”).Close SaveChanges:=False
だとファイルを保存せずに閉じます。SaveChangesは省略可で
Workbooks(“data”).Close False
とも書けます。
今回は、閉じる対象の「data」ファイルを変数 wb2 にセットしており、また、開いてから変更を加えていないので
wb2.Close
だけで大丈夫です。
ファイルを閉じる・保存するについては詳しくはこちらのサイトが分かりやすかったです。
ブックを閉じる・保存(Close,Save,SaveAs)|VBA入門
■ファイルを別名で保存する
では最後に、マクロ実行ファイルを別名で保存する、をやります。
別名で保存するファイル名は「テスト結果」にします。
ファイルを上書き保存するは wb1.Save です。
別名で保存する、は
保存するファイルオブジェクト . SaveAs ファイル名 . 拡張子 と書きます。
wb1を「テスト結果」というファイル名で保存するので
wb1.SaveAs “テスト結果.xlsm”
となります。
上記は名前付き引数filenameを省略して書いています。省略しない場合は
wb1.SaveAs Filename:=”テスト結果.xlsm”
とします。
拡張子はマクロつきエクセルとして保存したいので「.xlsm」としました。
マクロつきではない普通のエクセルとして保存したい場合、拡張子は「.xlsx」とします。
今回は同じフォルダに保存するためフォルダ名は省略しています。
別のフォルダに保存する場合はフルパスで指定します。
例えばCドライブのtestフォルダに保存した場合は
wb1.SaveAs “C\test\テスト結果.xlsm”
とします。
■コード全文
‘dataファイルを閉じる、から下が付け加えた箇所です。
まずブックを上書き保存して、コードを実行してみてください。ステップ実行の方が分かりやすいかもしれないですね。
エラーで止まったら綴り間違いがないか等、確認してみてください。
どうでしょう。うまくいきましたでしょうか?
ちなみに最後は別名保存した「テスト結果」が開いている状態で終わります。最初の原本ファイルは閉じちゃっているので、最初からやり直したい場合は原本ファイルを開いてください。
「ファイルの操作編」はこれで終わりです。
ずいぶん長くなってしまいましたがおさらい。
★今回やったこと★
・ファイルを読み取り専用で開くやり方
・コピーして内容を別のファイルに貼り付けする方法
・貼り付け先は一番左上のセルだけ指定すれば大丈夫
・形式を選択した貼り付けのやり方。値貼り付け。
・ブックやシートなどのオブジェクトを変数に代入する方法。Setを忘れずに!
・WorksheetとWorksheetsの使い分け
・戻り値を利用する場合、引数はかっこでくくる
・ファイルを閉じる方法
・ファイルを別名で保存する方法
やってみよう!VBA!シリーズ
コメント