MIME-Version: 1.0 Content-Type: multipart/related; boundary="----=_NextPart_01D46306.A7204310" このドキュメントは単一ファイル Web ページ (Web アーカイブ ファイル) です。お使いのブラウザー、またはエディターは Web アーカイブ ファイルをサポートしていません。Windows? Internet Explorer? など、Web アーカイブをサポートするブラウザーをダウンロードしてください。 ------=_NextPart_01D46306.A7204310 Content-Location: file:///C:/399B2948/file9960.htm Content-Transfer-Encoding: quoted-printable Content-Type: text/html; charset="shift_jis"
VBAを学ぼうよ!
1 VBAって何ができるの?
VBAで何ができるかを一言で答えることはできま= ケん。なぜなら、VBAはEXCELを超えてWINDOWSまで操作できてしまうものだからです。= VBAで作成され= スゲームをインターネットで見つける事ができますが、ここまでくるともはやEXCELとは言えません。
そこで、どんな知識を身に付ければどのような事ができるか少しだ= け考えてみます。
@VB
For〜Nextとか=
if〜then など=
AEXCEL特有のコマ= 塔h(記録機能で記録できます)
Cells(Y,X)とか= Range(“A1”).value など
Bwindows関数の実行<= /span>
FindWindowとか=
GetDCなどで=
使用するためには使用宣言をしなければなりません。
他にもありますが、大きくはこんなところだと思います。
2 実際にどのように作っていくの?
基本的にVBAでマクロを組んでいく際には、まず、欲しいEXCELコマンドを= L録した後、数字や文字列等を入れて目的の操作が可能となる部分を特定します。そ= して、その部分に入れる数字や文字列を効率的にVBで作成していくのです。この繰り返しになります。
では、1= ツ実際に作成してみましょう。
あるWORD文書(100ページくらい)のなかから、修正を加えた特定のページのみを印刷す= るプログラム(マクロ)を実際に作ってみましょう。
印刷したいページは、5,9,10,25,36,37,= 38,39,40,41,55,56,57,68,69,70,71,72,88,89,90,96,97の各ページ= ニします。今回はWORDのVBAになります。
WORD側に自動で作成されます。
何も考えずに行うとWORDでは左に示= オた場所のモジュールに作成されてしまいます。ですので、マクロを記録する際に、= 文書を指定するようにします。
マクロを記述する文書の設定
以下のようになりました。
Sub Macro1()
Application.PrintOut FileName:=3D"", Range:=3DwdPrintRangeOfPages, Item:=3D _= p>
wdPrintDocumentWithMarkup, Copies:=3D1, Pages:=3D"2", PageT= ype:=3D _
wdPrintAllPages, Collate:=3DT= rue, Background:=3DTrue, PrintToFile:=3DFalse, _
PrintZoomColumn:=3D0, PrintZoomRow:=3D0, PrintZoomPaperWidth:=3D0, _=
PrintZoomPaperHeight:=3D0
End Sub
長い文がありますが、これ全部で1文です。ここでPages:=3D"2"にだけ着目= オましょう。長い文全体は全く覚える必要も理解する必要もありません。この着目し= た部分にページ指定をしてあげれば期待通りの結果に近づけそうです。つまり、こ= フ数字を先ほどの一覧の数字に1つ1つ置き換えていけば、目的の機能ができそうで= すよね。
そこで、“2”の部分をPGNext文を追加します。※変数名・マクロ名は(一定ルールの下で)何でも=
構いません。
Sub 印刷(= )
For PG =3D 1 To=
100=
@‘PGの値を1から順に100まで入れていきます。
Application.PrintOut FileName:=3D"", Range:=3DwdPrintRangeOfPages, Item:=3D _= p>
wdPrintDocumentWithMarkup, Copies:=3D1, = span>Pages:=3DStr(PG)= , PageType:=3D _
wdPrintAllPages, Collate:=3DTrue, Background:=3DTrue, PrintToFile:= =3DFalse, _
PrintZoomColumn:=3D0, PrintZoomRow:=3D0, PrintZoomPaperWidth:=3D0, _=
PrintZoomPaperHeight:=3D0
‘PGの値のペー= Wを印刷します。
Next=
@‘ここでFor文まで戻ります。戻るときPG
End Sub
このようにすることで、1〜100ページまで印刷できます。
For PG =3D 1 To=
100=
@step 2
とすれば、奇数ページのみ印刷できます。
※STR()は、数値を= カ字に置き換える関数です。PCの中では、文字と数値は扱い方が異なるので面倒ですがこの作業が必= 要となります。
指定したペ=
[ジのみの数値はどのように扱えばいいのでしょうか。これはいくつかのやり方があ=
りますが、ここでは配列に入れる方法を用います。VBAにはルーズで便利の良いバリアント型変数(何も宣言しないで使える=
変数)があります。つまり、勝手にPGやAを変数として使ってしまえばそれはPC内でバリア=
塔g型として扱われます。バリアント型にしておけば、数値でも文字でも少数でも何=
にでも使えます。
では
A =3D Array(5, 9, 10, 25, 36, 37, 3= 8, 39, 40, 41, 55, 56, 57, 68, 69, 70, 71, 72, 88, 89, 90, 96, 97)
とarray関数を使っ=
ト一気にAという名称の配列に代入します。これだけで、A(0)=3D5、A(1)=3D9・・・A(22)=3D97という値が=
z列として自動で格納されるのです。このarray関数は便利がいいので覚えましょう。それとともに覚えておくべき関=
数があります。ubound()関数です。=
アれは、指定した配列の最後の添え字を返します。今回のUbound(A)の場合返り値は22となります=
B※余り使いませんがLbound(A)というのもあります。こちらは、0を返し=
ワす。(配列の最初の添え字)
これで本体そのものは完成です。
Sub 印刷()= p>
A =3D Array(5, 9, 10, 25, 36, 37, 3= 8, 39, 40, 41, 55, 56, 57, 68, 69, 70, 71, 72, 88, 89, 90, 96, 97)
&n= bsp;
For I =3D 0 To UBound(A) ‘Iに0から2=
Qまでが順に入ります。
PG =3D A(I) ‘= PGにA(0)からA(22)までの値が= に入ります。
Application.PrintOut FileName:=3D"", Range:=3DwdPrintRangeOfPages, Item:=3D _= p>
wdPrintDocumentWithMarkup, Copies:=3D1, Pages:=3DStr(PG), PageType:=3D _=
wdPrintAllPages, Collate:=3DTrue, Background:=3DTrue, PrintToFile:= =3DFalse, _
PrintZoomColumn:=3D0, PrintZoomRow:=3D0, PrintZoomPaperWidth:=3D0, _=
PrintZoomPaperHeight:=3D0
Next
End Sub
最後は、印刷したいWORD文書を読み= 桙で、その文書の指定ページの印刷にしなければなりません。ただし、このプログ= ラムを印刷したい文書のモジュールに挿入すればそのまま実行すれば印刷できます= Bしかし、その場合はその文書をマクロ可能な文書に書き換えて保存し直さなければ= なりません。面倒だし、他人に渡す文書の場合にはこの操作は適しません。ですの= ナ、ここではあくまでも指定文書を別に立ち上げた上で実行することにします。
では、今現在の状態でこのプログラムは何ができるのかというと、プ= ログラムが記述されている文書を印刷することになってしまいます。ですので、印= する文書を別途指定して立ち上げてなければなりません。まず印刷対象の文書を、= 本プログラムを書き込んだ文書と同じフォルダ内に入れてください。ここでは、印= 対象の文書名をtest.docxとします。
では、例によってマクロの記録を行って目的の文書を実際に手動で立= ち上げてみてください。立ち上げが終了したらマクロの記録を終了します。=
Sub Macro1()
ChangeFileOpenDirector= y "C:\Us= ers\namihei\Desktop\VBA\"
Documents.Open FileNam= e:=3D"test.= docx", ConfirmConversions:=3DFalse, ReadOnly _
:=3DFalse, AddToRecentFiles:=3DFalse, PasswordDocument:=3D"", PasswordTempla= te _
:=3D"= ", Revert:=3DFalse, WritePasswordDocument:=3D"", WritePasswordTemplate:=3D"" _
, Format:=3DwdOpenFormatAuto, XMLTransform:=3D""
End Sub
こりゃまた長い文ができています。今回は2文です。赤い部分以外は= 無視してください。要は、フォルダを指定位置に切り替えて、そのフォルダ内にな= 骼w定ファイルを読み出せ、ということです。
では、まずプログラム(マクロ)を記述しているWOED文書のパス= ヘ
ThisDocument.Path で調べる事= ェできます。この記述は英文から「この文書のパス(文書の保管されている場所)」= の意味ですね。
では、パス部分にファイル名も含ませて= PT =3D ThisDocument.Path & "\test.docx"
としてしまいましょう。こうすれば、Ch= angeFileOpen・・・の1= s目は不要になります。
ファイル名の部分をPTとすればOKです。また、後ろの冗長な部分もとってしまいましょう。
Sub Macro1()
PT =3D ThisDocument.Path & "\test.docx"
Documents.Open FileName:=3DPT
End Sub
非常に簡単になりました。なおPT= ヘ初めから文字列なのでStr()関数は不要です。
では、完成形です。
Sub 印刷()= p>
A =3D Array(5, 9, 10, 25, 36, 37, 3= 8, 39, 40, 41, 55, 56, 57, 68, 69, 70, 71, 72, 88, 89, 90, 96, 97)
&n= bsp;
PT =3D ThisDocument.Path & "\test.docx"
Documents.Open FileName:=3DPT
For I =3D 0 To UBound(A)
PG =3D A(I)
Application.PrintOut FileName:=3D"", Range:=3DwdPrintRangeOfPages, Item:=3D _= p>
wdPrintDocumentWithMarkup, Copies:=3D1, Pages:=3DStr(PG), PageType:= =3D _
wdPrintAllPages, Collate:=3DTrue, Background:=3DTrue, PrintToFile:= =3DFalse, _
PrintZoomColumn:=3D0, PrintZoomRow:=3D0, PrintZoomPaperWidth:=3D0, _=
PrintZoomPaperHeight:=3D0
Next
ActiveWindow.Close
End Sub
最後に見慣れないActiveWindow.Close=
span>があります=
Bこれは、現在アクティブになっているウィンドウを閉じる命令です。印刷プログラ=
ムを実行すると、自分の文書の上に読み込んだ文書が乗っかるので、後から読み込=
だ文書がアクティブになっている状態になります。結果的に、後から開いたその=
span>WORD文書(印刷対象の文書)を閉じよ、ということになります。<=
/p>
VBAは、通常では実現できない機能を比較的簡単=
ノ作成することができるのです。 (※今回作成した機能は実際にはついていますが・・・) 今回学んだVB Array,()、UBound()
3 やっぱり何だか難しいね?
もちろん簡=
Pだとは言いません。VBだけでもプログラム言語として十分機能するのに、その上に<=
span lang=3DEN-US>EXCELのコマンド=
使いこなさなければならない訳ですから、むしろ難しい部類と言えます。通常は、=
初めにVBを理解(習得)してからEXCEL機能に入っ=
トいくのが王道だとは思います。ですが、それでは、実用的なプログラムが組めるよ=
うになるまで何か月もかかってしまいます。多くの方々は、それで嫌になってしま=
、でしょう。
私は、実用= Iなあるいは実用化1歩手前のプログラムを作っていきながらVBを同時に学んでいくのが、モチベーションが下がらなく続けられるの= ではないかと思いました。また、僅かな改編で自分専用に実用化できるのでさらな= 驤モ欲が沸くと思います。
先ほどのプ= 鴻Oラムを次のようにするとどうなるでしょうか。
Sub 印刷()= p>
PT=3D ThisDocument.Path & "= ;\test.docx"
Documents.Open FileName:=3D PT
Application.PrintOut FileName:=3DPT=
ActiveWindow.Close
End Sub
ファイルを読み込んで全ページを印刷後そのファイルを閉じます。こ= れを複数のファイルを指定できるように改変すれば、一気にたくさんの文書を一括= ナ印刷できるようになります。工夫の余地はいっぱいありますよ。