Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


6579 / 13644 ツリー ←次へ | 前へ→

【44240】プログラムを分離する ふぇん 06/11/10(金) 15:54 質問[未読]
【44241】Re:プログラムを分離する Kein 06/11/10(金) 16:56 回答[未読]
【44244】Re:プログラムを分離する ふぇん 06/11/10(金) 17:21 質問[未読]
【44245】Re:プログラムを分離する りん 06/11/10(金) 17:47 発言[未読]
【44248】Re:プログラムを分離する ふぇん 06/11/10(金) 18:25 お礼[未読]
【44256】Re:プログラムを分離する りん 06/11/10(金) 22:47 発言[未読]
【44246】Re:プログラムを分離する Kein 06/11/10(金) 17:57 回答[未読]
【44247】Re:プログラムを分離する Kein 06/11/10(金) 18:06 発言[未読]
【44249】Re:プログラムを分離する ふぇん 06/11/10(金) 18:27 お礼[未読]
【44438】Re:プログラムを分離する ふぇん 06/11/16(木) 10:26 回答[未読]
【44441】Re:プログラムを分離する ふぇん 06/11/16(木) 12:16 発言[未読]

【44240】プログラムを分離する
質問  ふぇん  - 06/11/10(金) 15:54 -

引用なし
パスワード
   はじめまして。ふぇんと申します。

職場で上司より、以下の仕様のExcel VBAを作成するように指示がきたのですが、
2日間、本屋で調べ、ネットで調べても、なかなか出てこないので、質問させて
いただきました。

<仕様>
1.プログラムの保守性を高めるため、Excelファイルにはソースを保存しない。
2.Excelファイルには、ボタンのフォームだけを作成し、データをExcelに
  入力後、ボタンをクリックすると、入力したデータに対して処理を実行する。
3.Excelファイル内のボタンフォームは、別ファイルに書かれたVBAソースを
  参照し、そのVBAを実行する。
4.ソースコードを、別ファイルに記述することで、ボタンフォームの入った
  Excelファイルを複数コピーして作成しても、ボタン実行時に見に行く先は
  指定したソースファイルとなるため、改修時などは、そのソースファイル
  だけを修正すれば、保守性は向上する。
5.実行する手段は、アドインではない。リンクを使用すること。


ということで、以下のことを試しました。

<試行1>
1.ボタンフォームを作成し、そのボタンを右クリック→マクロ新規作成で、
  ソースコードを記述した標準モジュールを作成。
2.作成した標準モジュールをbasファイルにエクスポート。
3.VBEにて、標準モジュールを解放。
4.ボタンフォームを右クリック→ハイパーリンクで、2.で作成した
  basファイルを指定。

<試行2>
1.ボタンフォームを作成し、そのボタンを右クリック→マクロ新規作成で、
  ソースコードを記述した標準モジュールを作成。
2.別名保存で、Excelをxla形式で保存。
3.VBEにて、標準モジュールを解放。
4.ボタンフォームを右クリック→ハイパーリンクで、2.で作成した
  xlaファイルを指定。

上記、試行1,2の結果は、残念ながら、ソースコードがそのままエクセル上に
表示される、という結果に終わりました。


フォームのボタンに実行させるべきソースファイルを外に出しして、
ボタンクリック時に、そのソースを実行させる方法をご存知の方、
いらっしゃいましたら、ご指導いただけると幸いです。

宜しくお願いいたします。

【44241】Re:プログラムを分離する
回答  Kein  - 06/11/10(金) 16:56 -

引用なし
パスワード
   特定のブックに保存しない理由が
>ソースコードを、別ファイルに記述することで、ボタンフォームの入った
>Excelファイルを複数コピーして作成しても、ボタン実行時に見に行く先は
>指定したソースファイルとなるため、改修時などは、そのソースファイル
>だけを修正すれば、保守性は向上する。
ということな訳ですよね ? ならば普通は、Personal.xls(個人用マクロブック)
にマクロを保存します。そして特定のブック内にボタンを配置するのでなく、
通常表示するCommandBarに、起動ボタンを配置して登録します。それも自動的に
やってしまいたいなら、Personal.xlsのThisWorkbookモジュールに

Private Sub Workbook_Open()
  With Application.CommandBars("Formatting")
   .Visible = True
   With .Controls.Add(msoControlButton)
     .Caption = "マクロA"
     .FaceId = 80
     .OnAction = "Macro1"
   End With
   With .Controls.Add(msoControlButton)
     .Caption = "マクロB"
     .FaceId = 81
     .OnAction = "Macro2"
   End With
  End With
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
  Application.CommandBars("Formatting").Reset
End Sub

などのマクロを入れます。

【44244】Re:プログラムを分離する
質問  ふぇん  - 06/11/10(金) 17:21 -

引用なし
パスワード
   ▼Kein さん:

早速のご回答ありがとうございます。

ご指摘の通り「普通なら」コマンドバーを使用すると思います。
書店で書籍をみても、保守性向上の項目では、教えていただいた
方法か、アドインがほとんどです。

ところがどっこい、私の上司が変わり者なのか、
「ボタンから別ファイルのソースを呼び出して実行できる」
と言い張って聞いてくれません。

また、そういう変わり者?であるためか、現在出版されている
ほとんどのVBAの書籍を見たのですが、どの本にもその方法が記載
されていないのです。。。。。

2日間、遅々として進まないのは、その点なのです;;;;;
(普通じゃない方法を求められていて困っています)

教えていただいたところ大変恐縮なのですが、

●Excelファイル:ボタン・データあり、ボタンは別ファイルのソースコードを呼び出して実行
●別ファイル:上司いわく、xlaファイル、だそうです。

という方法で何かいい方法はないでしょうか?

イメージ的には、教えていただいた、Personal.xlsを、フォームのボタンに
リンクさせて、ボタンクリック時に実行させる、というものになるかと思います。

お手数をおかけして申し訳ないのですが、宜しくお願いいたします。

【44245】Re:プログラムを分離する
発言  りん  - 06/11/10(金) 17:47 -

引用なし
パスワード
   ふぇん さん、こんばんわ。

>●別ファイル:上司いわく、xlaファイル、だそうです。
アドインですね。

>●Excelファイル:ボタン・データあり、ボタンは別ファイルのソースコードを呼び出して実行
つまり、ぴかツールみたいなもんですね。
h t t p://w w w .vbalab.net/vbaqa/c-board.cgi?cmd=one;no=49;id=FAQ

【44246】Re:プログラムを分離する
回答  Kein  - 06/11/10(金) 17:57 -

引用なし
パスワード
   んー・・つまりCommandBarでなく「特定のブック内(のシート上など)に配置した
ボタン」からPersonal.xls内にあるマクロを起動したい、ということですか ?
それならそのボタンに

Sub MyMacro_Call()
  Application.Run "Personal.xls!Macro1"
End Sub

というようなマクロを登録すればよいでしょう。
ちなみに、実行したい(呼び出したい)マクロを入れるブックがPersonal.xls以外
だと、ボタンを押したときにそのブックが強制的に開かれてしまいます。
Personal.xlsのみ、Excelを立ち上げたときに自動的に非表示で立ち上がるので、
一見して他のブックに保存したマクロを実行したように見えなくて済みます。

【44247】Re:プログラムを分離する
発言  Kein  - 06/11/10(金) 18:06 -

引用なし
パスワード
   ついでに言いますが
>xlaファイル
アドインにすると、インストールやコードの編集が面倒です。
初めは一般的なPersonal.xlsを使って、試してみることをお勧めします。

【44248】Re:プログラムを分離する
お礼  ふぇん  - 06/11/10(金) 18:25 -

引用なし
パスワード
   りん さんへ

ご回答ありがとうございます。

>アドインですね。

やっぱりそうですよね。。。。。
私も混乱してきました。。。。

>つまり、ぴかツールみたいなもんですね。

これ、すごいですね。
同じ機能がある、ということでソースがみたかったのですが、
パスワードがかかっているため、見られませんでした。

今回の質問とは別に活用させていただきます。

ありがとうございます。

【44249】Re:プログラムを分離する
お礼  ふぇん  - 06/11/10(金) 18:27 -

引用なし
パスワード
   Kein さんへ

>アドインにすると、インストールやコードの編集が面倒です。
>初めは一般的なPersonal.xlsを使って、試してみることをお勧めします。

こみいった質問にも丁寧に回答いただき、真にありがとうございます。
まずは、Application.Runを試してみようと思います。

何度も丁寧にありがとうございました。

【44256】Re:プログラムを分離する
発言  りん E-MAIL  - 06/11/10(金) 22:47 -

引用なし
パスワード
   ふぇん さん、こんばんわ。
>>つまり、ぴかツールみたいなもんですね。
>これ、すごいですね。
ぴかるさん、よかったね。

>同じ機能がある、ということでソースがみたかったのですが、
>パスワードがかかっているため、見られませんでした。

ここに詳細があります。
目安箱
htt p://w w w.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=4;id=FAQ
石鹸箱
htt p://w w w.vbalab.net/vbaqa/c-board.cgi?cmd=ntr;tree=83;id=

【44438】Re:プログラムを分離する
回答  ふぇん  - 06/11/16(木) 10:26 -

引用なし
パスワード
   先日、上司にApplication.Runを使用したVBAを提出したところ、
以下の方法教えてもらいましたので、自己レスします。

1.標準モジュールにマクロを書いたExcelファイルを、.xla形式で保存する。
 例)
 [ ファイル名:MacroCall.xla ]
  sub MacroTest()
   msgbox "呼び出されました"
  exit sub

2.呼び出し元のExcelファイルにボタンとなるオブジェクトを作成する。
3.2.で作成したオブジェクトを右クリック→マクロの登録を選択。
4.テキストボックスに以下の形式で入力。

 [ 'フルパス\1.のxlaファイル'!マクロ名 ]

 ※ドライブ名から.xlaまでのファイル名のフルパスは
  シングルクォーテーション(')で囲う。
 ※シングルクォーテーションを閉じた後は、イクスクラメーションマーク(!)
  を入力し、その後マクロの名称を記入。

 例)
 'C:\Test\MacroCall.xla'!MacroTest

これで、オブジェクトのボタンから他のエクセルブックのマクロを呼び出せます。
ただし、修正入るたびに、.xlaに出力しないといけないので、はっきり言って
面倒です。xlaにするよりは、Application.Runにした方が、「かなり!」
メンテしやすいです。

【44441】Re:プログラムを分離する
発言  ふぇん  - 06/11/16(木) 12:16 -

引用なし
パスワード
   自己レス追記です。

マクロの登録のテキストボックスに、

[ 'フルパス\ファイル名.xla'!マクロ名 ]

で手入力すると、そのエクセルファイルをコピー・移動などしたときに、
フルパスの部分が、コピー・移動先のフォルダに変わってしまうことが
あります。

原因調べるのが難しいので、呼び出し元エクセルの標準モジュールに、
以下のように、エクセルを開くと自動で絶対パスを指定するようにしました。
※最後にセルA1を選択しているのは、アクティブオブジェクトがボタンに
 なっていて、なんとなくイヤ!という私の好みの問題です。

---------------------------------------------------------

Sub Auto_open()

'カラム変換ボタンにマクロを登録
Sheet1.Shapes("Rectangle 10").Select
Selection.OnAction = "'フルパス\ファイル名.xla'!マクロ名"

'アクティブオブジェクトをセルA1にする
Sheet1.Cells(1, 1).Select

End Sub

---------------------------------------------------------

6579 / 13644 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free