パソコンスキルの教科書

6. trgtBook.Close SaveChanges:=False

解説

保存したい場合は「False」を「True」に変えます。
「Close」対象ブックに変更が加えられている際に「SaveChanges」を指定していないと、保存するかどうかのダイアログが表示され、処理が止まってしまいます。

事例2|指定したExcelファイルを開く閉じる|Thisworkbook.pathを使う

●プログラムの解説
1行目|処理開始
2行目|エクセルが保管されているフォルダ内の「Sample.xlsm」を開く
3行目|trgtBookをWorkbook型で宣言
4行目|ActiveWorkbookをtrgtBookにする(3行目で開いたSample.xlsmをtrgtBookとする)
5行目|処理を入れる
6行目|trgtBook.Closeで、エクセルを閉じます
7行目|処理終了
2. Workbooks.Open ThisWorkbook.Path & “\Sample.xlsm”

「Thisworkbook.Path」は、マクロ実行中のエクセルファイルが保管されているフォルダアドレスを指定します。
「\」を書き加えるのがコツです。たとえば「ThisWorkbook.Path & “\Sample.xlsm”」のように、「\」をつけるのを忘れないこと。

事例3|ダイアログでファイルを開く

●プログラム解説
1行目|処理開始
2行目|カレントフォルダを「ThisWorkbook.Path」に変更。
3行目|「myFolder」をVariant型で変数宣言。
4行目|「myFolder」に「Application.GetOpenFilename」を格納。変数定義と同時にダイアログが開かれる。
5行目|「myFolder」の値によって条件を分岐。
6行目|「キャンセルされました。」というメッセージボックスを表示。
7行目|「Exit Sub」で処理終了
8行目|IF文の分岐
9行目|「〇〇が選択されました。対象ファイルを開きます」というメッセージを表示。
10行目|「myFolder」に格納されているフルパスを指定して、ワークブックを開く
11行目|trgtBookをWorkbook型で宣言
12行目|ActiveWorkbookをtrgtBookにする
13行目|IF文終了
14行目|処理を入れる
15行目|エクセルを閉じる。SaveChanges:=Falseと書くと、保存しないで閉じることができます。
16行目|処理終了
2. ChDir ThisWorkbook.Path ‘カレントフォルダを「ThisWorkbook.Path」に変更

カレントフォルダを作業中のエクセルが保管されているフォルダに設定する

理由は、ダイアログを開いたときに表示されるフォルダは作業中のカレントフォルダが開かれるからです。

そこで、あらかじめ目的のフォルダに変更します。

なお「Thisworkbook.Path」を他のパスに変更すれば、ダイアログを開いたときに表示されるフォルダを変更できます。

4. myFolder = Application.GetOpenFilename(“エクセルファイル(*.xlsm),*.xlsm”)

ファイルフィルターを指定することで、ダイアログで表示するファイルを限定することができます。

ここでは「”エクセルファイル(.xlsm),.xlsm”」を指定しているので、拡張子「.xlsm」以外のファイルは表示されません。

5. If myFolder = False Then

ダイアログ操作で、「×」ボタンや「キャンセル」ボタンを押した時には「False」を返します。

そのため、ファイルが指定されてない場合はファイルを開きません。

9. MsgBox Dir(myFolder) & ” が選択されました。” & vbCrLf & “対象ファイルを開きます。”

「Dir」関数は、フルパスからファイル名だけを取り出すことができます。

「Dir(myFolder)」とすることで、選択したファイルの名前だけを取得できます。

事例4|ファイルを読み取り専用で開く

●プログラム解説
1行目|処理開始
2行目|「ThisWorkbook.Path」内にある「Sample.xlsm」を開く。この時、「ReadOnly:=True」と書くと、読み取り専用で開くことができます。
3行目|trgtBookをWorkbook型で宣言
4行目|ActiveWorkbookをtrgtBookにする。つまり、3-5行目で開いたSample.xlsmをtrgtBookとする
5行目|処理を入れる
6行目|エクセルを閉じる。SaveChanges:=Falseと書くと、保存しないで閉じることができます。
7行目|処理終了
2. Workbooks.Open Filename:=ThisWorkbook.Path & “\Sample.xlsm”, ReadOnly:=True

ReadOnlyは省略可能ですが、余計な編集を加えたくない時や、誰かが開いている時は「ReadOnly:=True」とするとエラーが出なくなります。

もし編集可能な状態で開きたい場合は、「ReadOnly」に「False」を指定します。

事例5|エクセルを非表示で開く

●プログラム解説
1行目|処理開始
2行目|「ExcelApp」をObject型で宣言
3行目|「Excel.Application」オブジェクトを生成し、「ExcelApp」に格納
4行目|「Path」をString型で宣言
5行目|対象となるブックのフルパス「C:\Users\—–\OneDrive\Book1.xlsm」を「Path」に格納
6行目|「NewExcel」をWorkbook型で宣言
7行目|「ExcelApp.Workbooks.Open(Path)」を「NewExcel」に格納。
8行目|処理を入れる
9行目|エクセルを閉じる。SaveChanges:=Falseと書くと、保存しないで閉じることができます。
10行目|「ExcelApp」オブジェクトを解放
11行目|処理終了
3. Set ExcelApp = CreateObject(“Excel.Application”)

このオブジェクト生成は、決まり文句なので、このまま使えば問題ありません。

10. Set ExcelApp = Nothing

「Set ExcelApp = Nothing」で、生成したオブジェクトを解放しています。

これを行わないとオブジェクトが残ったままとなり、メモリに負荷をかけることになってしまいます。

そのため、解放することを覚えておくのが良いです。

ファイルを開く2|CSV やテキストを開く読み込む

事例6|CSV ファイルを開く読み込む
事例7|テキストファイルを開く読み込む

以下でプログラムの解説をします。

事例6|CSV ファイルを開く読み込む

●プログラム解説
1行目|処理開始
2行目|「str」をString型で宣言
3行目|「myAry」をVariant型で宣言
4行目|「n」をLong型で宣言
5行目|「n」に初期値「1」を格納
6行目|指定したCSVファイルを開く
7行目|「Do Loop」で繰り返し処理を行う
8行目|変数「str」に1行分の値を格納
9行目|取得した「str」を「,」で区切って配列「myAry」に格納
10行目|「ThisWorkbook」1枚目のワークシートを「With」文でまとめる
11行目|A列n番目のセル「Range(“A” & n)」に配列の値「myAry(0)」を出力
12行目|B列n番目のセル「Range(“B” & n)」に配列の値「myAry(1)」を出力
13行目|With文終了処理を入れる
14行目|変数「n」に「1」を加える
15行目|繰り返し処理終了
16行目|開いたCSVファイルを閉じる
17行目|処理終了
6. Open ThisWorkbook.Path & “\Sample.csv” For Input As #1

対象はフルパスで指定し、ファイルを開く目的を「Input」で読み取りに指定しています。
また「#1」で任意の番号を指定しています。

7. Do Until EOF(1) = True

繰り返しの条件式には「Until EOF(1) = True」を指定しています。
「EOF」は「End Of File」の略で、「EOF(1)」はCSVファイルの1列目の終端に到達した際に「True」を返すことを利用しています。

8. Line Input #1, str

「Line Input #1, 変数」で1行ずつ値を取得し、変数(str)に格納します。

9. myAry = Split(str, “,”)

「Split(str, “,”)」で、「str」を「”,”」ごとに区切って変数「myAry」に格納しています。

14. n = n + 1

「n = n + 1」と記載することで、nに1を加えることができます。
これで繰り返しが進むたびに転記するセルの位置を変えることができます。

16. Close #1

ファイル名やフルパスではなく、開くときに指定した番号「#1」で対象ファイルを指定します。

事例7|テキストファイルを開く読み込む

●プログラム解説
1行目|処理開始
2行目|「str」をString型で宣言
3行目|「myAry」をVariant型で宣言
4行目|「n」をLong型で宣言
5行目|「n」に初期値「1」を格納
6行目|txtファイルを開く
7行目|「Do Loop」で繰り返し処理を行う
8行目|変数「str」に1行分の値を格納
9行目|取得した「str」を「Tab」で区切って、値を配列「myAry」に格納
10行目|「ThisWorkbook」1枚目のワークシートを「With」文でまとめる
11行目|A列n番目のセル「Range(“A” & n)」に配列の値「myAry(0)」を出力
12行目|B列n番目のセル「Range(“B” & n)」に配列の値「myAry(1)」を出力
13行目|With文終了処理を入れる
14行目|変数「n」に「1」を加える
15行目|繰り返し処理終了
16行目|開いたtxtファイルを閉じる
17行目|処理終了
9. myAry = Split(str, vbTab)

「Split(str, vbTab)」で、「str」をタブごとに区切って変数「myAry」に格納しています。
CSVファイルでは行内の値は「”,”」で区切られているのに対して、テキストファイルの場合は「タブ」で区切られています。
それを利用し、Tabごとに区切ります。

ファイルを開く3|ワードやパワーポイントのファイルを開く閉じる

事例8|ワードファイルを開く閉じる
事例9|パワーポイントファイルを開く閉じる

事例8|ワードファイルを開く閉じる

プログラムを利用する前の事前準備

VBEで参照設定「Microsoft Word 〇〇.〇 Object Library」にチェックをいれる必要があります。

詳細はこちらの画像の通りです。

1.VBEを開いて頂いて、「ツール」→「参照設定」
2.Microsoft Word 〇〇.〇 Object Libraryのライブラリにチェックを入れて、OKをクリック

f:id:gene320:20170613213650p:plain

f:id:gene320:20170824223129p:plain

画像では「15.0」となっていますが、もっとも数字が大きいものを選択すれば問題ありません。

●プログラム解説
1行目|処理開始
2行目|「wordApp」をWord.Application型で宣言
3行目|「Word.Application」オブジェクトを生成し、「wordApp」に格納
4行目|生成したWordを表示
5行目|「wordDoc」をWord.Document型で宣言
6行目|「WordApp.Documents.Open(対象ファイルフルパス)」を「wordDoc」に格納
7行目|処理を入れる
8行目|wordDoc.Closeで、開いたドキュメントファイルを閉じる。
9行目|「wordApp」を非表示
10行目|「wordApp」オブジェクトを解放
11行目|処理終了

以下の記事では、エクセルとワードを連携させて差し込み印刷の事例を紹介しています。

ぜひ合わせて読んでみてください。

エクセルマクロVBAでワード連携!基本操作から差し込み印刷まで(コード付)
・VBAでプログラミングを覚えたからには、ワード操作してみたい! ・エクセル情報をワードに差し込んで印刷をしたい! ・Wordのオフィスソフトとエクセルを連携させてみたい! そんなことを考えているなら、この記事を読んでみ […]

事例9|パワーポイントファイルを開く閉じる

プログラムを利用する前の事前準備

VBEで参照設定「「Microsoft PowerPoint 〇〇.〇 Object Library」」にチェックをいれる必要があります。

詳細はこちらの画像の通りです。

1.VBEを開いて頂いて、「ツール」→「参照設定」
2.Microsoft PowerPoint 〇〇.〇 Object Libraryのライブラリにチェックを入れて、OKをクリック

f:id:gene320:20170613213650p:plain

f:id:gene320:20181125212748j:plain

画像では「16.0」となっていますが、もっとも数字が大きいものを選択すれば問題ありません。

●プログラム解説
1行目|処理開始
2行目|「powerPointApp」を、PowerPoint.Application型で宣言
3行目|「PowerPoint.Application」オブジェクトを生成し、「powerPointApp」に格納
4行目|生成したPowerPointを表示
5行目|「powerPointPre」をPowerPoint.Presentation型で宣言
6行目|「PowerPointApp.Presentations.Open(対象ファイルフルパス)」を「powerPointPre」に格納
7行目|処理を入れる
8行目|「powerPointApp.Quit」で、パワーポイントアプリケーションを閉じる
9行目|「powerPointApp」オブジェクトを解放
10行目|処理終了
8. powerPointApp.Quit

Excel.Application、Word.Applicationと違って、「Visible=False」を指定できません。

そこで「Quit」を使い、プレゼンテーションファイル、パワーポイントアプリケーションを一度に終了させます。

以下の記事では、エクセルとパワーポイントを連携させてグラフを作成する事例を紹介しています。

ぜひ合わせて読んでみてください。

パワーポイントにグラフを自動貼付!エクセルVBAでパワポを操作する方法|事例&コード付
エクセルの計算結果やグラフなどのチャートをパワポに貼り付ける作業があります。 このような作業をするとき、以下のように感じる人は少なくないはずです。 ・グラフを一つ一つパワポにコピペするのは非効率… ・パワポ資料の文字の大 […]

ファイルを開く4|複数ファイルを開く閉じる

複数ファイルのうち、条件に一致するファイルを開く処理を紹介します。

事例10|ワイルドカードで条件一致したエクセルファイルのみ開く

●プログラム解説
1行目|処理開始
2行目|「trgtDir」をString型で宣言
3行目|「trgtDir」に対象となるフォルダパスを格納
4行目|「str」をString型で宣言
5行目|「str」に対象となるファイルフルパスを格納
6行目|「Do Loop」で繰り返し処理を行う
7行目|5行目で指定した「trgtDir」フォルダ内の対象のファイルを開く
8行目|変数「str」に同じ条件に当てはまる次のファイル名を格納
9行目|繰り返し処理終了
10行目|処理終了
5. str = Dir(trgtDir & “201904*.xlsx”)

変数「str」に「Dir」関数とワイルドカードを使って、対象となるファイルのファイル名の初期値を格納します。

サンプルコードでは、ワイルドカードを使うことによって、「201904」から始まる「.xlsx」ファイルの1番目を取得しています。

6. Do While str <> “”

繰り返しの条件式には「While buf <> “”」を指定しています。

13行目で「Dir()」を使って条件に当はまる次のファイル名を「str」に格納しています。

そして、「Dir()」は同じ条件のファイルが見つからない場合は、「””」(空の文字列)になります。

この性質を利用し、繰り返し条件としています。

8. str = Dir()

「Dir()」は、同じ条件に一致する、次のファイル名を取得することができます。

これを変数「str」に再度格納し、次々にループ処理を行っていきます。

複数ファイルを一括処理するプログラム

VBAで複数ファイルを一括処理するプログラムは以下の記事で詳しく解説しています。

マクロでフォルダ内の複数ファイル一括処理の事例13|開く/読み込み/データ集約/コピー/ファイル数取得/印刷のVBAプログラム
エクセルマクロVBAを使ってフォルダ内の複数ファイル一括処理したい場合があります。 ウェブ上にはたくさんの情報がありますが、実際に使える事例を基にしたものが少ないのが現状です。 そこで、マクロVBAを使ってフォルダ内の複 […]

ファイルを開く5|PDFファイルを開く

事例11|フォルダ内のPDF ファイルをすべて開く
事例12|フォルダ内のPDF ファイルを上から順番に開いて結合する

事例11|フォルダ内のPDF ファイルをすべて開く

以下の記事で解説しています。

エクセルマクロVBAで指定したフォルダ内のPDFをすべて開く方法
フォルダ内の複数のAcrobat PDFのファイルを開きたいとき、一つずつやっていては時間がかかります。ファイルが10コ程度なら、あまり時間がかかりません。 しかし、ファイル数が増えると、ファイルを開くのに時間がかかった […]

事例12|フォルダ内のPDF ファイルを上から順番に開いて結合する

以下の記事で解説しています。

エクセルマクロVBAでフォルダ内のすべてのPDFを一括結合する方法|ファイル順に結合
複数のAcrobat PDFのファイルを一つに結合するとき、一つずつファイルを結合していては時間がかかります。 そこで、エクセルマクロを使って、複数のPDFを自動で一つのPDFに結合する方法を紹介します。 ただPDFを結 […]

その他にも複数の PDF ファイルを処理するプログラムを紹介しています。

ぜひ合わせて読んでみてください。

エクセルマクロVBAでフォルダ内のPDFを順番に連続で自動印刷する方法
複数のAcrobat PDFのファイルを印刷するとき、一つずつ印刷していると時間がかかります。しかし、マクロを使えば、ボタン一つでカンタンに印刷することができます。 そこで、エクセルマクロを使って、フォルダ内のPDFファ […]

マクロVBAでPDFを読み込み、テキスト抽出してエクセルに一覧にする方法
PDFの情報をコピペして手動で書き写す人は多いです。例えば、PDFのテキスト情報を目視しながら、一つずつエクセルにコピペしていく作業があります。 この場合、PDF数枚程度なら、一枚ずつコピペしても、大変さを感じることはあ […]

2つのPDFの変更点を比較して新旧対照表で出力する方法|マクロVBAを使って解決
PDFの情報を更新をしたとき、更新前後で何がどのように変更したかを比較一覧表にしたいときがあります。 実際、このような表は新旧対照表と呼ばれて変更点が一目でわかるように作成する必要があります。 このとき、変更前後の2つの […]

エクセルマクロVBAで複数PDFファイルに順番に自動でパスワードをかける方法
セキュリティや機密情報の関係で、PDFファイルにパスワードを入れ込む作業が必要になることがあります。 しかし、パスワードを入れる作業が面倒だったりパスワードを忘れてしまったりするデメリットがあります。 そこで、エクセルマ […]

複数PDFファイルを一括変換!エクセル/ワード/パワポ/テキスト化するマクロVBA
PDFファイルを他のファイルに変換したいときがあります。 例えば、PDFの情報をエクセルで計算できるようにしたりワードで再加工したりする場合です。 他にもパワーポイントに変換して、PDF情報をそのままパワーポイント資料と […]

エクセルを自分用に編集アレンジして使いたいなら、エクセルマクロの無料動画で学ぼう

この記事では、ファイルを開くことについて紹介しました。ここで紹介したマクロを利用すれば、作業の自動化が可能になります。

しかしデメリットもあります。それはカスタムできないことです。

なぜなら、色々な要望が増えるからです。

この動画を見たとき、「もっと○○ができるのでは?」や「ここはなんとかならないのか」と感じる人は少なくないはずです。

例えば、「他の条件を付け加えたい」や「日付毎に条件を変えたい」といった要望が出るかもしれません。

このような要望を満たすには、マクロを勉強して自力でマクロを編集できるようになる必要があります。

もし、自力でマクロを編集できるようになれば、今より仕事の効率はグッと上がります。

実際、私も自力でマクロを書けるようになってからは、仕事の生産性が一気に上がりました。

他の人が30分~1時間かけて行う仕事が、ボタン一つで終わらせることができるようになったのです。

その結果、周囲からの信頼も増し、仕事で高い評価を得られるようになりました。

ただ、要望に応えるようになるためには、マクロを学ぶ必要があります。

まずは無料でマクロを勉強してみる

ウェブや書籍で勉強すれば、マクロを習得できると考えている人は少なくありません。

しかし、仕事で使えるマクロを習得したいなら、仕事で使える部分に特化した教材で学ぶことをお勧めします。

なぜなら、ウェブや書籍には仕事に関係しない部分まで提供していることが多いからです。

例えば、マクロ初心者なのに配列を学ぼうとする人がいます。実は配列なしでも仕事で使えるマクロを書くことは可能です。

しかし、マクロ初心者ほど「全ての知識が必要だ」と考えて、無駄な学習に時間を使ってしまうのです。詳しくは、こちらの記事で紹介しています。

エクセルマクロVBAのプログラムやコードは全てを覚える必要はない
エクセルマクロVBAを勉強している人の中には、自分の知らないプログラムやコードを必死で理解しようとする人がいます。 しかし、仕事で使えるエクセルマクロを習得するためには、プログラムやコードをすべて覚える必要はありません。 […]

エクセルマクロVBAを独学で習得できるか?自学の限界と挫折する理由
エクセルマクロ習得には継続的な学習が必須です。とくにマクロ初心者が独学で習得するには、少なくとも数ヶ月は地道に学習を続ける必要があります。 ただ忙しい社会人の場合、毎日30分の勉強時間でさえ確保するのが難しい人もいます。 […]

そこで、私がお勧めするのは仕事に直結するマクロ教材です。とくにお勧めするのは、こちらの無料オンライン動画です。

なぜなら、仕事に直結する部分に絞って、エクセルマクロを学ぶことができるからです。

マクロの作り方・考え方から解説しているので、教材をしっかり学べばここで紹介したマクロをゼロから書けるようになります。

マクロ初心者が、仕事に直結したいマクロを学ぶなら、まずはこちらの無料オンライン動画を試すのがいいです。

興味がある人は、まずは無料でエクセルマクロの勉強を始めてみてください。

もっと学びたいと感じたら、さらに深く勉強をしてみることをお勧めします。