Visual Basic for Excel97 完全制覇

読者サポートページ


Attention!!
このページは、ブラウザのアドレス欄に表記されているように、http://msyk.locus.co.jp/excelvba/に移動しました。従来のURLからはこのページへは自動的に移動するようにはなっていますが、必要に応じてアドレス情報(ブックマーク、お気に入り、リンクなど)の更新をお願いします。また、書籍では従来のアドレスを紹介していますので、新しいアドレスへの訂正もお願いします。


「Visual Basic for Excel97完全制覇」(定価\2,500、著者:新居雅行)は、日経BP社より発行された書籍です。表計算ソフトのExcel97での、Visual Basicを利用したマクロプログラムについて解説しています。お買い求めは、お近くの書店でお願いします。

このWebページは、書籍で紹介したプログラムを配付することなどを中心とした、読者サポートのために用意しました。


目次 筆者あてメール
サンプルプログラム
誤植・訂正
  • 正誤表
  • ColorIndexプロパティについて
  • 第5章のサンプル「入出金管理.xls」についてのバグ
  • ソルバーをVBAで処理する方法について
関連情報
  • マクロウイルス関連の情報
  • 作成したプログラムを参照できなくする方法
  • ユーザー定義関数でセル範囲を指定する
1999年 08月 14日 土曜日

New 訂正を追加しました(99/8/14)


筆者あてメール

最初へ

ここをクリックすると、メールを送付することができます。

あるいは、msyk@locus.co.jp までメールをお送り下さい。

メールの運用とお願い

ご意見あるいはご要望については、可能な限り、改版時などに反映させていただきます。ただし、諸般の事情によりご要望にそぐえないこともあるかと思いますので、ご了承ください。

ご質問に関しては、そのすべてについてお答えするとは限りません。まず、本書と直接的に関係のないことについては基本的にはお答えできないものとお考え下さい。

ご質問やご要望については可能な限り返事を差し上げるよう努力します。その場合、ご質問内容やご要望についての回答をホームページ上に掲載することもありますので、この点はお含みおきください。また、その場合、質問者については無記名で記事掲載させていただくことを原則とします。その場合には掲載するだけでなく、基本的にはお便りをいただいた方にも直接ご連絡は差し上げます。

メールアドレスは設けておりますが、メールに対するお返事を必ず差し上げることを保証するものではありません。筆者の状況によって長時間かかることや、あるいはお答えができないことありますのでご了承ください。


サンプルプログラム

最初へ

御提供するものは、書籍中で紹介しているプログラムを、ブックファイルの形式で納めたものです。本書の読者の方がキータイプしなくてもプログラムを実行できるようにするためにご提供するものです。

ダウンロード(Excel97Dev.LZH, 374KB)

  • 上記の部分をクリックするとダウンロードできます。Excel97Dev.LZHというファイル名をダウンロードしますので、LZH形式の圧縮ファイルの解凍が可能なユーティリティを使って、ファイルを取り出して下さい。ディレクトリ付きで圧縮してあります。ディレクトリ付きで解凍すると、Excel97Devというフォルダを作り、そこにファイルを解凍します。
  • 以下のファイルが圧縮ファイル内に含まれています。
  • 名前 内容
    VB-Excel-03 第3章に紹介したプログラム
    VB-Excel-04 第4章に紹介したプログラム
    VB-Excel-05 第5章に紹介したプログラム
    VB-Excel-06 第6章に紹介したプログラム
    VB-Excel-07 第7章に紹介したプログラム
    VB-Excel-08 第8章に紹介したプログラム
    入出金管理 第5章の5.4節で紹介したプログラム(一部不具合があります。ここをクリックして表示される箇所の記述に従って、修正をお願いします)
    Mybttn 第6章で利用するBMPグラフィックス
    AddIn_Seed 第7章の7.4節で紹介したプログラム
    Test_Database VB-Excel-08で利用するサンプルのデータベースファイル
    Test_Book VB-Excel-08で利用するサンプルのブックファイル
    販売管理データベース作成 第8章の8.5節で紹介したプログラム
    販売管理データベース管理 第8章の8.5節で紹介したプログラム

利用方法

  • VB-Excel-03からVB-Excel-08までの、各章に対応したサンプルプログラムを開いてください。最初に表示されるワークシートに基本的な解説が書かれていますので、それを御覧ください。
  • 書籍内のプログラムの多くはブックに含まれていますが、すべてブックに含まれているわけではありません。御了承ください。
  • 各プログラムは、日本語版のWindows95あるいはWindowsNT 4.0上で、Office97あるいは単体で提供されているExcel97(Excel Ver.8.0日本語版)でご利用ください。
  • Excel97あるいはOffice97のセットアップ状態、あるいはオプション設定などによって、プログラムが正しく機能しない場合もあります。ここで御提供するブックファイルは、完全に実行可能なプログラムを提供するためのものではありません。Visual Basicでのプログラムのサンプルとして提供するもので、実行するにはいくらかの修正が必要になる可能性もあります。また、実行するための条件があることもあります。書籍中の解説なども参照してください。
  • 一般に実用ソフトでは、プログラムが実行する前提条件をチェックして、それが満たされていない場合にはエラーメッセージを表示するなど、利用者の利便を図っているのが一般的です。しかしながら、ここで御提供するブック内のプログラムは、そうした実用ソフトではなく、あくまでプログラムのサンプルです。特に、Excelの作業環境をカスタマイズした場合には、さまざまなトラブルが考えられるので、その場合は標準状態を想定してプログラムの修正が必要になるかも知れません。

お願い

  • プログラムは著作物の一部です。プログラムを不特定多数の複数のパソコンにコピーすることは、書籍のページを不正に複写するのと同じことですので、取り扱いには注意してください。
  • ブック内のプログラムを独自に改造したものについては、妥当な範囲の改造であれば、改造された方の著作物として、コピーによる配布、あるいは販売などに利用していただいてもかまいません。その場合は筆者あるいは出版社からライセンス料などの請求は行わないものとします。ただし、改造と言ってもほとんど書き直したというレベルから、単に変数名だけ変えたというところまであり、当然ながら後者の場合は筆者の著作としての色彩が強いもので、改造した方だけが著作権者として名乗るのは妥当ではありません。こうした線引きはいちがいに規定できないので、常識の範囲で処理してください。改造したものを配布をする場合には、できれば出展として本書をコメントなどに記載していただければと考えています。
  • プログラムおよびそのプログラムを改造したものについての動作は、筆者および出版社はそれを保証するものではありません。あくまでサンプルの素材で、その運用については読者の責任で行うものとします。
  • 各プログラムは細心の注意を払って作成しましたが、至らないところもあるかと思います。お気づきの点がありましたら、ご指摘願えればと存じます。


誤植・訂正

最初へ

ページ
行数
現状
正しい記述
備考
47 9,12,15 Ctrl+Enterキー TabキーないしはCtrl+Enterキー リストからキーワードを選択するキーとしてはTabキーの方が手軽でしょう
195 9 フォントの色で、パレットの何番目なのかで設定する。 フォントの色を番号で指定する。 以下の説明を参照
196 8,12 (同上) (同上)
197 BorderAroundメソッドの図 (lineStyle引数に指定可能な定義定数を追加) xlLineStyleNone(罫線なし)
xlDashDot(一点鎖線)
xlDashDotDot(二点鎖線)
xlSlantDashDot(斜めの一点鎖線)
引数lineStyleあるいはLineStyleプロパティは、左記の定義定数と、書籍中の図版にあるxlContinuous、xlDash、xlDot、xlDoubleのいずれかを指定できます
197 13〜14 xlTop(上)、xlDown(下)、xlLeft(左)、xlRight(右) xlEdgeTop(上)、xlEdgeBottom(下)、xlEdgeLeft(左)、xlEdgeRight(右)、xlInsideHorizontal(内部の水平線)、xlInsideVertical(内部の垂直線)、xlDiagonalDown(斜め線)、xlDiagonalUp(斜め線) xlTopなどの定義定数も、プログラム上で実際に使うことができます
197 18,19 (ColorとColorIndexプロパティの説明が入れ違っている)
211 25行目以降 ●マクロでソルバーを利用するにはの解説 (内容に間違いがあります) 以下の説明を参照
229 15行目の後 vbYesNo 4 はい、いいえ この記述の行を追加してください
229 16 4 5 vbRetryCancelの定義値は5です
229 最後の行の後 vbDefaultButton4 768 標準選択ボタンは4つ目 この記述の行を追加してください
265 9行目と10行目の間 ステートメントが不足 isEdit = False リストに命令の追加が必要です(以下を参照

ColorIndexプロパティについて

P195〜197で説明しているColorIndexプロパティは、セルの背景色などを番号で指定するプロパティです。その番号が、カラー選択のパレットの順番と記述していますが、これは間違いです。たいへん申し訳ありませんでした。実際の番号と色の対応は、ColorIndexプロパティのヘルプを御覧ください。ヘルプには以下のように対応表があります。

第5章のサンプル「入出金管理.xls」についてのバグ

現状では「日付検索」を行うと、検索された行に、それまでダイアログボックスで表示されていたデータがそのまま上書きされてしてしまうという不具合があります。大変申し訳ありませんでした。以下のように、プログラムの修正をしてください。

プログラムのうち、書籍のページで言えばp265ページ、9行目と10行目の間に、以下のようなステートメントを1行追加してください。追加する行は太字の行です。

Me.Controls(itemFind).Caption = btnExt
'ボタン名を「日付検索解除」に切り替え
isEdit = False
SetCurrentRec(matched) '検索された行を現在の行として設定する

ステートメントを追加するのは、CommamdButton4_Clickプロシージャです。実際にInputFormのコードを表示して、上記のステートメントを追加してください。

この修正により、ダイアログボックスでデータを変更してすぐに「日付検索」ボタンをクリックすると、ダイアログボックスでの変更をワークシートに書き込まなくなります。お手数ですがダイアログボックスでデータを修正後は必ず「書き込み」ボタンをクリックしてください。

ソルバーをVBAで処理する方法について

p211で、マクロでソルバーを利用する方法について記述がありますが、内容を訂正させていただきます。

ソルバーの作業をレコーディングすると、SolverOk、SolverSolveというコマンドで、ソルバーの処理が記録されます。まず、これら記録した処理を実行しようとしてもエラーがでます。エラーなく、記録したソルバー処理のマクロが実行できるようにするには、Visual Basic Editorで、「ツール」メニューから「参照設定」を選択し、ダイアログボックスの一覧で「SOLVER.xls」のチェックボックスを入れておきます。

おそらく、SolverOkがソルバーの設定を行うコマンドで、SolverSolveが実際の解を求める処理を行うコマンドであることは想像できるのですが、ドキュメントがないのでコマンドの詳細は分かりません。

ただし、どのようなコマンドがあるかはある程度確認できます。オブジェクトブラウザを表示して、プロジェクトウインドウで、SOLVER.xlsをクリックして選択します。すると、SOLVER.xlsで定義されているプロパティやメソッドがブラウザで確認できます。このうち、VBA_Functionsクラスにあるメソッドは、コマンドのように単独で利用できるようです。各メソッドやプロパティの詳細は分かりませんが、ブラウザを使えば、どんな引数をつけるのかくらいは識別できるかと思います。


関連情報

最初へ

マクロウイルス関連の情報(マイクロソフトのWebぺージ)

上記のリンクをクリックしてください。
 

作成したプログラムを参照できなくする方法

配付するブックファイルでは、プログラムの内容を見られてたくないということもあるでしょう。ソースを取り除くことはできないのですが、パスワードをかけて見られないようにすることはできます。以下のように設定すれば、プログラムを参照するのに指定したパスワードを入力しなければならなくなります。
 
  1. ExcelのVisual Basic Editorを起動します。
  2. 「ツール」メニューの「VBAProjectのプロパティ」を選択します。(メニュー項目名は、プロジェクトの名前を変更していれば、それが含まれる。)
  3. 表示されるダイアログボックスで「保護」の見出しを選択します。
  4. 「プロジェクトのロック」という項目があり、チェックボックスをオンにします。
  5. その下にあるパスワードは適当に入力します。
こうしておけば、パスワードを知らないとソースは参照できません。なお、いったん設定して、一度ブックを閉じないとパスワードは有効にならないようです。

 

ユーザー定義関数でセル範囲を指定する

p.141で、ParamArrayを使って、引数が一定しない関数の作成例を示しています。ここでは、別のプロシージャからの定数を引数にした呼び出ししか示していませんが、ここでのSqSum関数は、ワークシート関数としても呼び出すことができます。ならば、引数にセル範囲を指定したいところですが、このプログラムでは、単独セルを引数には指定できるものの、セル範囲を指定すると、エラーになってしまいます。たとえば、SqSum(A1,A2,A3) ならいいのですが、SqSum(A1:B3,C2) のような式がエラーになります。
そこでユーザー定義関数の引数にセルでもセル範囲でも指定できるようにする方法を知りたくなります。こうした手法を読者の方から質問をいただいたきました。こうした情報は有用と思われますので、ここでその方法を説明しておきましょう。
まず、SqSum(A1:B3,C2) のように、引数にセル範囲を指定した場合、引数のx(i)は、Rangeオブジェクトとなります。したがって、単独のセルを参照している場合、Rangeオブジェクトの既定のプロパティであるValueプロパティが取り出されるので、x(i)は文字列あるいは数値になります。つまり、x(i)はRange("C2").Valueに等しいわけです。しかし、引数にセル範囲を指定した場合、それに対応するx(i)もやはりセル範囲ですが複数のセルを含む範囲となるので、そのValueプロパティはバリアント型の配列になります。つまり、x(i)はRange("A1:B3").Valueに等しくなり、この取り出し結果は配列です。このあたりのことは、p.170〜171に説明がありますので参照してください。
つまり、x(i)が配列かどうかを判断して、処理を分岐させれば良いと言うことになります。セル範囲を引数にも指定可能はSqSum関数は、以下のようになります。
 
Function SqSum(ParamArray x())
Dim i As Integer, c As Single, r As Variant
c = 0
For i = LBound(x) To UBound(x)
 If IsArray(x(i)) Then '引数がセル範囲の場合
  r = x(i)
  For j = LBound(r, 1) To UBound(r, 1)
   For k = LBound(r, 2) To UBound(r, 2)
    c = c + r(j, k) ^ 2 '1つのセルの値は、配列の要素として取り出す
   Next k
  Next j
 Else    '引数がセル範囲でない場合
  c = c + x(i) ^ 2
 End If
Next i
SqSum = c
End Function
 
この関数の目的は、各セルの値を2乗してx(i)が配列ならその要素をそれぞれ2乗して加え、そうでないなら、単に値を2乗します。


最初へ

[Windows Solutions by msyk]