JAPLA 研 究 会 資 料 2007/3/24 Excel_VBAでいろいろな OLEを 実 験 する - 日 付 時 間 電 卓 メモ 帳 Wordから Jまで- 西 川 利 男 0.はじめに J を 含 めたいろいろなアプリケーションとの 間 の OLE について 最 近 例 会 の 話 題 を 賑 わ している [1,2,3] 先 月 鳥 邊 錬 太 郎 氏 は VBA の 元 になる Visual Basic 6.0 の 上 で J の OLE について フォームの 作 成 コードの 記 述 などをていねいに 説 明 され 筆 者 にとって は 極 めて 有 益 であった しかし 残 念 なことに 筆 者 の 手 元 には 非 常 に 古 い Visual Basic 2.0 しかないのでトレースすることもままならない それではと いっそのこと Excel_VBA の 上 で 違 った 側 面 から 検 討 して 見 るのもまた 良 し と 考 えた 例 題 としては 簡 単 な 日 付 時 間 表 示 を 手 始 めとして 電 卓 メモ 帳 から Word そして J といろいろな OLE を 実 験 する VBA プログラミングを 行 ってみた Excel_VBA に 限 ったわけではないが Windows プログラムは 次 の2つから 成 っている フォーム 処 理 の 入 り 口 であり また 結 果 表 示 の 出 口 となるインターフェースとして 重 要 であり フォームエディタにより 作 成 される コード 処 理 動 作 の 記 述 であり 狭 い 意 味 でのプログラムである コードの 作 成 はいうなれば 従 来 から 行 ってきた Basic などのプログラミングであるが フォームの 必 要 性 およびその 作 成 は Windows プログラミングに 独 特 のもので 筆 者 のよう に 古 くからのプログラマにとってはようやくその 意 義 を 解 しやっとなじんで 来 たものであ る その 意 味 では 筆 者 世 代 の 者 にとっては 目 新 しいが 若 い 世 代 のプログラマではごく 当 たり 前 の 事 柄 かもしれない この 点 ご 容 赦 いただきたい 1.VBA の 構 造 と 開 発 の 手 順 VBA (Visual Basic Application) は Visual Basic と 言 語 文 法 においては 全 く 同 じであるが Microsoft Word, Microsoft Excel のマクロを 記 述 するためのものであり システムとしては いろいろ 違 っている さらに VBA 自 身 も Excel のものと Word のものとは 文 法 や 考 え 方 は 共 通 であるが 機 能 仕 様 は 異 なっている 以 下 ここでは Excel の VBA に 絞 ってみていこう [1] 西 川 利 男 J の Excel_OLE を 解 析 する JAPL 研 究 会 資 料 (2007/2/24) [2] 鳥 邊 錬 太 郎 VB-J_DLL Server を 使 う 同 誌 (2007/2/24) [3] 西 川 利 男 J と Word,Excel,HTML- 全 員 集 合 の 協 調 システム 同 誌 (2007/1/27) - 1 -
Excel と Excel_VBA との 関 係 を 見 るには Excel システム 上 で Alt-F11 で 現 れる VBE(Visual Basic Editor) で Project を 見 ればよく 次 のように 示 される 全 体 は VBAProject となっており 例 えば VBAtest1.xls のようなファイルである そし て 通 常 の Excel 画 面 のシートは Sheet1, Sheet2, Sheet3 のようになっている いわゆるマクロは Module1, Module2,...であり ここに VBA プログラムが 書 かれる こ こにプログラムを 書 き 込 むには VBE のツールバー[ 挿 入 ]で[ 標 準 モジュール]をクリックし て 現 れる Sub... のプロシージャとしてプログラミングする さらにフォームを 必 要 とするときは[ 挿 入 ]で[ユーザフォーム]をクリックするとフォーム エディタ 画 面 が 現 れ 同 時 に 現 れるコントロール 部 品 の 表 示 から ボタン テキストボッ クスなどをマウスでドラッグして 必 要 な 位 置 大 きさで 貼 り 付 ける また コントロール のキャプション( 名 前 ) 文 字 の 大 きさなどいろいろな 仕 様 はプロパティ 表 に 値 をセットす ることで 行 う 今 度 はボタンなどコントロールのよる 処 理 の 実 行 はコントロールをダブルクリックする ことでさらに 現 れるプログラム 画 面 で 処 理 のプログラムを 記 述 する 筆 者 に 言 わせればこ こで 初 めて 従 来 からなじんだプログラミングを 行 い ほっとしたというところである ところで マクロを 実 行 するには 通 常 の Excel シート 画 面 上 で[ツール]-[マクロの 実 行 ] でも 行 えるが ここでもフォームを 作 って そこで 実 行 する 方 がっこう 良 い それには[ 表 示 ]-[ツールバー]-[フォーム]により 現 れる 簡 易 フォームエディタにより コントロールの 作 成 を 行 い これにモジュールのプロシージャ 名 をリンクさせる こうすれば シート 上 にあるボタンをクリックするとマクロの VBA プロシージャが 実 行 できることになる - 2 -
2. 日 付 時 間 の 表 示 最 初 は 最 も 簡 単 な VBA として 日 付 時 間 を 出 力 する 関 数 Now を 呼 び 出 して メッセ ージボックスで 表 示 する というものである プログラムは 次 のように 一 行 でよい Sub ndate() MsgBox "いまの 日 時 は" & Now & "です" 3. 電 卓 とメモ 帳 を 呼 び 出 して 処 理 今 度 はフォームを 作 成 し そのコントロールに VBA のコードを 記 述 する という 通 常 行 う 手 順 にのっとってやってみる (1) フォームの 作 成 VBE エディタのメニューバーの[ 挿 入 ]で[ユーザフォームの 作 成 ]を 選 んでクリックすれ ば 以 下 のようにフォームエディタが 開 かれる ここでフォーム UserForm1 に リストボッ クス ボタンなどを 貼 り 付 ける 掛 け 算 記 号 線 なども 入 れて 体 裁 を 整 える これらの 操 作 はツールボックスのコントロールのリストからマウスでドラッグ&ドロップで 位 置 大 きさなどを 調 整 して 張 り 付 ける 表 示 (Caption)などはプロパティ 表 で 値 を 設 定 する - 3 -
(2) コードの 記 述 コントロールのボタン Run を 押 すと 上 の2つのリストボックスに 入 力 したデータの 値 を 用 いて 掛 け 算 を 行 い その 結 果 を 下 のリストボックスに 表 示 するようにする このとき 掛 け 算 の 計 算 は Windows に 常 備 の 電 卓 プログラムを 使 い その 結 果 を 一 応 メモ 帳 に 記 録 し 最 後 に Excel に 戻 るようにした 上 の 処 理 はボタン Run を 押 すと 起 動 されるイベントとして 実 行 されるので ボタンに 付 随 したコードを 記 述 することになる このためには ボタンの 上 でマウスをダブルクリッ クすると コード 記 述 の 画 面 が 開 きここに VBA のプログラムを 書 けばよい コードは 次 のようになる 各 操 作 はコメントを 見 ていただきたい ここでは Shell により 起 動 し SendKeys により 文 字 列 を 送 ることで 処 理 を 行 っている Option Explicit Private Sub CommandButton1_Click() Shell "Calc.exe", 1 'Start calc ' 電 卓 プログラムの 起 動 SendKeys TextBox1.Text, True 'テキストボックス1のデータを 送 る SendKeys "*", True ' 掛 け 算 記 号 文 字 を 送 る SendKeys TextBox2.Text, True 'テキストボックス2のデータを 送 る SendKeys "=", True 'イコール 記 号 文 字 を 送 る SendKeys "^C", True 'クリックボードにコピーする(Ctrl-Copy) SendKeys "%{f4}", True ' 電 卓 プログラムの 終 了 Shell "Notepad.exe", 1 'メモ 帳 プログラムを 起 動 SendKeys "^V", True 'メモ 帳 に 貼 り 付 ける(Ctrl-Paste) TextBox3.Paste 'テキストボックス3にも 貼 り 付 ける 同 様 にして ボタン Clear に 対 する VBA コードは 以 下 のようである Private Sub CommandButton2_Click() TextBox1 = "" TextBox2 = "" TextBox3 = "" (3) フォームの 起 動 Excel のマクロとして 実 行 するため モジュールへの 次 のプログラムが 必 要 である Sub ndentaku() UserForm1.Show - 4 -
4.Word での 実 行 処 理 VBA としてはたとえ 同 じでも Word での 処 理 依 頼 は それほど 簡 単 ではない 例 題 としては 文 字 列 を 入 力 して それを Word に 送 り Word 上 でその 書 体 大 きさなどを 変 える さらに 印 刷 画 面 のプレビューをするだけのものだが オブジェクト 指 向 としての 前 準 備 Word_VBA の 仕 様 に 合 わせるなどの 考 慮 が 必 要 となる フォームは 省 略 して コードのみをあげる Private Sub CommandButton1_Click() Range("A1") = TextBox1.Text 'テキストボックスのデータをセルにコピー Range("A1").Copy 'セルのデータをクリップボードへコピー Set Obj = CreateObject("Word.Application") 'Word のオブジェクト Obj を 作 成 Set Doc = Obj.Documents.Add 'Documents のオブジェクト Doc を 作 成 With Doc.Paragraphs(1).Range 'Doc.Paragraphs(1)について.Paste 'クリップボードのデータを 貼 り 付 け.Font.Size = 20 'フォントの 大 きさを 変 更.Bold = True 'ボールドに 変 更.Italic = True 'イタリックに 変 更 End With Obj.Visible = True Obj.ActiveDocument.PrintPreview ' 印 刷 プレビューに 表 示 Range("A1").Clear Obj.Quit 'Word の 終 了 5.J での 実 行 処 理 次 のようなフォームを 作 った 例 題 の 説 明 は 不 要 であろう - 5 -
3つのボタンのの 対 する VBA の 各 コードは 次 のとおりである 合 計 Sub CommandButton1_Click() 平 均 Sub CommandButton2_Click() クリア Sub CommandButton3_Click() コードについてはこれについては 何 遍 も 紹 介 してきたので 説 明 は 省 略 する Option Explicit Dim N As String, Dim M As Variant Dim ec, v As Variant Private Sub CommandButton1_Click() N = TextBox1 jopen js.show 0 js.log 1 jdo "JN=. " & N jdo "JM=. +/ JN" 'Only one value can return M = jget("jm") js.quit TextBox2 = M Private Sub CommandButton2_Click() N = TextBox1 jopen js.show 0 js.log 1 jdo "JN=. " & N jdo "JM=. (+/ % #) JN" M = jget("jm") js.quit TextBox3 = M Private Sub CommandButton3_Click() TextBox1 = "" TextBox2 = "" TextBox3 = "" - 6 -
Sub jopen() Set js = CreateObject("jexeserver") Sub jdo(s As String) ec = js.do(s) If ec Then MsgBox "Error code: " & Str(ec) Function jget(s As String) As Variant ec = js.get(s, v) If ec Then MsgBox "Error code: " & Str(ec) jget = v End Function 6.Excel マクロとしての OLE 実 行 例 実 行 例 として 電 卓 マクロの 実 際 を 示 す - 7 -
7.Excel_VBA と Excel とをこう 考 える- 筆 者 の 独 断 的 コメント (1) Excel_VBA の 位 置 づけ Excel_VBA は 一 般 には Excel の 表 計 算 機 能 を 助 け より 複 雑 な 高 度 の 処 理 を 行 うための ものとされている しかし 筆 者 の 独 断 的 意 見 として もっと 積 極 的 に Windows 処 理 の 中 心 技 術 と 位 置 付 けすべきと 思 う Visual Basic がその 位 置 にあるようだが 筆 者 のようなかつ ての N88BASIC を 愛 用 したユーザにとってはかなりしきいが 高 い その 一 つが 入 出 力 イン ターフェースであるフォームの 作 成 である この 入 り 口 部 分 は Visual Basic ではなく Excel をそれに 当 てたらよいと 思 う つまり Excel を 単 なる 表 計 算 ソフトではなく Windows プロ グラミングのインターフェースを 含 めた 汎 用 ツールと 位 置 づけるのである Excel = 配 列 型 の 階 層 構 造 を 持 つ 汎 用 オブジェクト 処 理 ツール (2) 百 人 一 首 の 決 まり 札 早 取 りツール 筆 者 の 娘 など 若 い 世 代 の Windows ユーザに 言 わせると 文 書 は Word ではなく Excel で 作 るのだという たしかに 章 段 落 の 文 章 をセルにいれてしまえば 文 書 の 構 成 編 集 は ずっと 楽 になる お 正 月 のお 遊 びプログラムである - 8 -
(2) 複 数 の 絵 画 をタテ ヨコにつなげて 大 きい 作 品 を 創 る オブジェクトとうたった 意 味 はこの 例 で 示 される Excel では 文 字 列 数 学 計 算 値 だけで はなく 画 像 なども 自 由 に 扱 える もう Photoshop などいらない これは 絵 を 趣 味 とする 妻 の 要 望 で 作 った 筆 者 の 秘 かな Excel の 効 用 である - 9 -