Excel VBA質問箱 IV

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

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


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

【72807】ブック間で変数を共有したいのですが やまぐち 12/9/20(木) 13:24 質問[未読]
【72808】Re:ブック間で変数を共有したいのですが UO3 12/9/20(木) 14:04 発言[未読]
【72811】Re:ブック間で変数を共有したいのですが やまぐち 12/9/20(木) 18:43 質問[未読]
【72813】Re:ブック間で変数を共有したいのですが UO3 12/9/20(木) 20:20 発言[未読]
【72882】Re:ブック間で変数を共有したいのですが やまぐち 12/9/28(金) 12:50 お礼[未読]
【72812】Re:ブック間で変数を共有したいのですが ichinose 12/9/20(木) 20:03 発言[未読]
【72883】Re:ブック間で変数を共有したいのですが やまぐち 12/9/28(金) 12:57 質問[未読]
【72886】Re:ブック間で変数を共有したいのですが ichinose 12/9/28(金) 13:41 発言[未読]
【72896】Re:ブック間で変数を共有したいのですが やまぐち 12/10/3(水) 13:06 お礼[未読]
【72887】Re:ブック間で変数を共有したいのですが sasa 12/9/28(金) 19:56 回答[未読]
【72888】Re:ブック間で変数を共有したいのですが UO3 12/9/29(土) 16:36 発言[未読]
【72897】Re:ブック間で変数を共有したいのですが やまぐち 12/10/3(水) 15:10 お礼[未読]
【72901】Re:ブック間で変数を共有したいのですが sasa 12/10/3(水) 19:40 回答[未読]
【72903】Re:ブック間で変数を共有したいのですが やまぐち 12/10/4(木) 19:02 お礼[未読]
【72904】Re:ブック間で変数を共有したいのですが UO3 12/10/5(金) 7:18 発言[未読]
【72924】Re:ブック間で変数を共有したいのですが やまぐち 12/10/11(木) 12:43 お礼[未読]

【72807】ブック間で変数を共有したいのですが
質問  やまぐち  - 12/9/20(木) 13:24 -

引用なし
パスワード
   VBAは独学初心者ですが、作業効率の為、活用している者です。

現在試行錯誤している点は、共通的なマクロ処理はアドイン化し、
他の個々のブックには固有のマクロ処理のみを記述し、
冗長となる部分の削減や保守性の向上にチャレンジしています。


そこで、
 ・アドインブック→(A)
 ・他の個々のブック→(B)
と表すとして、本題なのですが、


1.変数定義について
 (A)は、Option Explicit、配列変数を含むパブリック変数を定義済み。
 (B)は、変数宣言は無し。 
 この状況下では、パブリック変数は(A)のみの変数となってしまう
 といった認識が正しいのでしょうか?


2.変数の共有可否について
 (B)のプロシジャーがApplication.Runで(A)プロシジャーを実行し、 
 (A)側でパブリック変数に値を設定した後、
 制御が戻った(B)で変数値を参照したいのですが、実現手段はあるでしょうか?


----VBA例----
(A)
Option Explicit
 Public wk_dousaj(5) As String
 Public wk_kobetu(5) As String

Sub AAAAAA
 wk_dousaj(1) = 具体値
 wk_dousaj(2) = 具体値
 wk_dousaj(3) = 具体値
 wk_dousaj(4) = 具体値
 wk_dousaj(5) = 具体値
End Sub
※呼び出されるタイミングで具体値を決める共通論理の為アドイン化したい


(B)
Sub BBBBBB
 Workbooks(myModule.Name).Application.Run "AAAAAA"
 wk_kobetu(1) = wk_dousaj(2)  ←★そもそも配列変数が認識されてないが
 wk_kobetu(2) = wk_dousaj(4)
End Sub
-------------

以上、宜しくお願い致します。

【72808】Re:ブック間で変数を共有したいのですが
発言  UO3  - 12/9/20(木) 14:04 -

引用なし
パスワード
   ▼やまぐち さん:

こんにちは


>1.変数定義について
> (A)は、Option Explicit、配列変数を含むパブリック変数を定義済み。
> (B)は、変数宣言は無し。 
> この状況下では、パブリック変数は(A)のみの変数となってしまう
> といった認識が正しいのでしょうか?

はい、その認識が正しいですね。
>
>
>2.変数の共有可否について
> (B)のプロシジャーがApplication.Runで(A)プロシジャーを実行し、 
> (A)側でパブリック変数に値を設定した後、
> 制御が戻った(B)で変数値を参照したいのですが、実現手段はあるでしょうか?

いろんな方法があるかとは思います。
たとえば以下、Book1.xls側の値をBook2.xlsから参照する場合、
・あらかじめBook1.xls側のTest1を実行して変数 a に値を入れておきます。
・で、Book2.xls側のTest2を実行します。

(Book1.xls側)

Option Explicit

Dim a As String

Sub Test1()
  a = "ABC"
End Sub

Function GetVal() As String
  GetVal = a
End Function

(Book2.xls側)

Option Explicit

Sub Test2()
  Dim s As String
  
  s = Application.Run("Book1.xls!GetVal")
  MsgBox s
  
End Sub

【72811】Re:ブック間で変数を共有したいのですが
質問  やまぐち  - 12/9/20(木) 18:43 -

引用なし
パスワード
   ご教授有難うございます。

<VBA試行錯誤で頭がオーバフロー状態です>
<本日は一時終了し、来週時間を見つけて再開する予定です>


Book1,Book2側ともに変数宣言して値をゲットする方法なのですね。
質問させて下さい。

1.アドイン名可変時の扱い
 アドインは機能追加を想定しファイル名に版数表現を付与しているため
 For Each myModule In AddInsでファイル名を取得しています。

 そこで、
 s = Application.Run("Book1.xls!GetVal")
 の箇所を、
 s = Application.Run(myModule.Name & "!" & "GetVal")

 としたのですが、見つからないとのエラーとなります。
 どの様な原因が考えられるでしょうか?


2.GetValの結果について
 s = Application.Run("Book1.xls!GetVal")
 の結果は、"ABC"と推測しているのですが、

 Book1.xls側で設定した複数の変数値をBook2.xlsで参照したい際は
 どの様に考えたら良いでしょうか?

 <例>
 Function GetVal() As String
   GetVal = a
   GetVal = b
   GetVal = c
 End Function

 ? = Application.Run("Book1.xls!GetVal") ←★ここが分からない


ちなみに、
3.他の方法も試行中です。
Book2.xls側でアドインブックを参照設定し、
VBAProject名.変数名でアドイン側の変数を参照する方法。

参照設定追加と削除はマクロ化し、アドイン側変数を参照出来たのですが、
Book2.xlsの本来仕様ではない実装と操作が必要で、
実装時に変数名の整合を気にかけないといけない事が気になってます。


----
アドイン化は、初トライであり、VBAも自己流です。
そもそも論的な部分で誤った認識をしている可能性もあると思います。
お手数を煩わせてしまう懸念もありますが、
可能な範囲でご教授願います。

でわ。

【72812】Re:ブック間で変数を共有したいのですが
発言  ichinose  - 12/9/20(木) 20:03 -

引用なし
パスワード
   こんばんは。

>1.変数定義について
>  (A)は、Option Explicit、配列変数を含むパブリック変数を定義済み。
> (B)は、変数宣言は無し。 
>  この状況下では、パブリック変数は(A)のみの変数となってしまう
>  といった認識が正しいのでしょうか?

これは、そのPublic変数を定義するモジュールによって異なります。
Thisworkbookのモジュールに

Public 変数 as long

と定義すれば(変数は、配列でも何でもよいです)、


別ブックからは、


Workbooks("A.xla").変数

という書式で参照も設定も出来ます。
これは、変数というより、A.xlaというブックオブジェクトのプロパティになっています

【72813】Re:ブック間で変数を共有したいのですが
発言  UO3  - 12/9/20(木) 20:20 -

引用なし
パスワード
   ▼やまぐち さん:

こんばんは

まず、私自身はアドインは使わない人ですので、実践に基づいたお答えができません。
詳しい回答者さんの登場を心待ちにしています。

とりあえずメモ的に。

>Book1,Book2側ともに変数宣言して値をゲットする方法なのですね。

いえ、あくまでBook1に変数があって、それを取得しています。
サンプルとしては Book2側の変数への取り込みましたが、直接
Application.Run("Book1.xls!GetVal") として参照することはできます。

MsgBox Application.Run("Book1.xls!GetVal")

といったように。


>1.アドイン名可変時の扱い
> アドインは機能追加を想定しファイル名に版数表現を付与しているため
> For Each myModule In AddInsでファイル名を取得しています。
>
> そこで、
> s = Application.Run("Book1.xls!GetVal")
> の箇所を、
> s = Application.Run(myModule.Name & "!" & "GetVal")
>
> としたのですが、見つからないとのエラーとなります。
> どの様な原因が考えられるでしょうか?

その取得したアドインブックに GetValというファンクションプロシジャがあるのに
エラーになったのでしょうか?
とすれば、私にはわかりません。
もし、そのアドインブックに GetVal というファンクションプロシジャがなければ
エラーになるのは当然ですが。

また、アドインは必ずしも1つだけではないですよね。
たとえば、エクセルの分析ツールなどをアドインしておきますと、それらが(あたりまえですが)
アドインブックとして取得されますよね。

For Each で取得したアドインの何番目が、求めるアドインなのか、どうやって判断しようと
しておられるのですか?
冒頭書きましたようにアドインは詳しくありませんが、アドイン名がわからないということは
いささか、問題ありませんか?

> の結果は、"ABC"と推測しているのですが、
>
> Book1.xls側で設定した複数の変数値をBook2.xlsで参照したい際は
> どの様に考えたら良いでしょうか?

これもいろいろ方法はあると思います。
変数毎に取得プロシジャを書いておくと言うことも1つの方法でしょうし
たとえば Book1側で複数の変数を配列の要素としてもたせておいて
1番目は a 、2番目は b といったようにきめておき、
Book2側からは、引数として、その何番目かという値を指定してApplication.Run。
Book1側では、その引数によって 配列の○番目の要素を戻り値にして返すということも
できるでしょうね。

でも、実際にやりたいことは、Book1側の変数が abc という名前なら
Book2側でも、自ブックの変数と同じように abc として参照したいということなんでしょうね。
そこのところは、私にはわかりません。
今までずっと、ご紹介したような方法でやってきましたし、それで(私の場合は)充分でしたので。

お役に立てず、ごめんなさい。

【72882】Re:ブック間で変数を共有したいのですが
お礼  やまぐち  - 12/9/28(金) 12:50 -

引用なし
パスワード
   UO3 さん

やまぐちです。
お返事遅れて申し訳ありません。

実のところ、未だに自分が行いたい事は実現していませんが、
アドイン化にチャレンジした事は良い経験だった思っています。

私の知識不足から実現にはほど遠いのかもしれませんが、
実現させる手段はいろいろ存在する事を教えて頂きました。

お役に立てないなんて、滅相もございません。
素人質問に対して、ご丁寧な回答をして頂き感謝です。
有難う御座います。

今後は、
マクロ機能の理解度を高めて、手段をどの様に組み合わせれば、
運用しやすい機能になるか、じっくりチャレンジしていくつもりです。

また、アドイン名の件ですが、
XXXX(1.0).xla →XXXXは表意文字化で固定+版数表現
とっいった具合にアドインファイル名のルールとしているので
サーチ時にXXXXが含まれているかとの判断で特定してます。


いろいろとご教授有難う御座いました。
私の今のスキルレベルで質問を継続すると支離滅裂に
なる可能性がありますので、スキルを高めてから、
改めて質問させて頂きたいと思います。

本当に有難う御座いました。

【72883】Re:ブック間で変数を共有したいのですが
質問  やまぐち  - 12/9/28(金) 12:57 -

引用なし
パスワード
   ichinose さん

ご教授有難う御座います。
Thisworkbookのモジュールに
配列も含む変数を定義すれば良いとの事だったのですが、

オブジェクト変数には、
定数や配列のPublic変数は定義出来ないと
エラーとなってしまいました。

使用しているのはExcel2003ですが、
エラーとならない設定があるのでしょうか?

【72886】Re:ブック間で変数を共有したいのですが
発言  ichinose  - 12/9/28(金) 13:41 -

引用なし
パスワード
   こんにちは。

>

>Thisworkbookのモジュールに
>配列も含む変数を定義すれば良いとの事だったのですが、
>オブジェクト変数には、
>定数や配列のPublic変数は定義出来ないと
>エラーとなってしまいました。


>エラーとならない設定があるのでしょうか?

失礼、配列だとちょっと工夫が必要でした。


Thisworkbook側で

Option Explicit
Private a(1 To 5) As String
Public Property Get MYa(idx As Long) As String
  MYa = a(idx)
End Property
Public Property Let MYa(idx As Long, myvalue As String)
  a(idx) = myvalue
End Property


別ブック側では


Sub test()
  With Workbooks("book1")
    .MYa(1) = "aaa"
    .MYa(2) = "bbb"
    MsgBox .MYa(1) & ":" & .MYa(2)
  End With
End Sub

この場合、プロパティ MYaは、
配列の要素を引数を指定することで取得しています。


取り急ぎ代替案です

【72887】Re:ブック間で変数を共有したいのですが
回答  sasa  - 12/9/28(金) 19:56 -

引用なし
パスワード
   ▼やまぐち さん:
>ブック間で変数を共有したいのですが

ブック間で変数や関数を共有するためにVBAで用意されている機能は参照設定です。
みなさん参照設定をご存じないのかな...
手順は以下。

アドインブック(A)のオブジェクト名をユニークな名前に変更して保存。例→VBAProject_A
他の個々のブック→(B)は、[VBE]-[ツール]-[参照設定]で VBAProject_A にチェックして保存。

'(A)標準モジュール
Option Explicit

Public wk_dousaj(5) As String
Public wk_kobetu(5) As String

Sub AAAAAA()
 wk_dousaj(1) = "具体値1"
 wk_dousaj(2) = "具体値2"
 wk_dousaj(3) = "具体値3"
 wk_dousaj(4) = "具体値4"
 wk_dousaj(5) = "具体値5"
End Sub


'(B)標準モジュール
Option Explicit

Sub BBBBBB()
 AAAAAA
 wk_kobetu(1) = wk_dousaj(2)
 wk_kobetu(2) = wk_dousaj(4)
 Debug.Print wk_kobetu(1), wk_kobetu(2)
End Sub

【72888】Re:ブック間で変数を共有したいのですが
発言  UO3  - 12/9/29(土) 16:36 -

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

>みなさん参照設定をご存じないのかな...

ichinoseさんは、もちろんご存じでしょうし、私も上で書きましたように
アドインは使わず必要なら参照設定をして対処しています。

今回の場合は、それとは別の・・という方法でichinoseさんから
処理案のご提示があったということでしょうね。

【72896】Re:ブック間で変数を共有したいのですが
お礼  やまぐち  - 12/10/3(水) 13:06 -

引用なし
パスワード
   ichinoseさん

配列の要素を引数を指定する方法について、
ご教授有難う御座います。

素人の私は、
引数渡しで結果を得る手法の経験は有りませんでした。
(Public Property Get MYa(idx As Long) As String等)

マクロ実装する際の考慮点も把握出来ていない現状でして、
いずれ拡張性や保守性が低下してしまう懸念があります。

試行錯誤しながらのVBA活用は、通常業務の合間で行っており、
ご教授頂いた方法で解決したと、すぐお返事が返せない事は
申し訳ありません。

当手段の実装については、
簡易版などを作成し、まずは仕様の理解度を高めて、
自分なりに活用範囲や考慮点などを把握出来る様にしたいと
思っています。

その後、また疑問点など有った際は、
改めて質問させて頂きたいと思います。

本当に有難う御座いました。

【72897】Re:ブック間で変数を共有したいのですが
お礼  やまぐち  - 12/10/3(水) 15:10 -

引用なし
パスワード
   sasaさん

お答え有難う御座います。


アドイン化へのチャレンジは、EXCELを使用した業務遂行において、
共通機能や汎用機能を集約し、固有機能(目的達成)を切り分け、
VBAマクロ機能の重複回避や保守性を高めたいとの思いからでした。

私は、独学自己流レベルですので、VBA機能を切り離した際に、
ブック間で変数を共有する方法が分からないとの壁にぶち当たり、
今回質問させて頂きました。

皆様からのご教授により、多数の実現手段がある事や
私の理解度を高めないといけない事を気づかされまして、
この様な機会は有意義だったと思っています。

今後も、ファンクションプロシジャやProperty Getなどの
手段による実現について、チャレンジしていくつもりです。


お答えして頂いた次の点について、
・[VBE]-[ツール]-[参照設定]で VBAProject_A にチェックして保存

当質問をさせて頂いた直後、参照設定追加と削除自体をマクロ化し
現時点での落しどころとして実装し活用しています。


ただ、アドイン機能を使用したいブック側で、
ツール→アドイン→有効なアドインのチェック 及び 参照設定の
操作が、ブック利用者側の負担になってしまうのではないかなど
懸念事項もあります。

機能を使用する状況や条件もさまざまでしょうし、そんな中でも、
機能性、可用性、拡張性、保守性など考慮し、望ましい資料運用
となるよう多数の実装手段を適宜見極めていきたいと思います。


また壁にぶち当たった際は、
ご教授のほど宜しくお願い致します。

有難う御座いました。

【72901】Re:ブック間で変数を共有したいのですが
回答  sasa  - 12/10/3(水) 19:40 -

引用なし
パスワード
   ▼やまぐち さん:
>ただ、アドイン機能を使用したいブック側で、
>ツール→アドイン→有効なアドインのチェック 及び 参照設定の
>操作が、ブック利用者側の負担になってしまうのではないかなど
>懸念事項もあります。

ユーザー側で参照設定をする必要はありません。
開発時者が一度、参照設定して保存するだけです。

参照設定(変数の共有)は必ずしもアドインに登録しなくても使えます。
そのアドインファイルを(B)と同じフォルダに置いておくだけで使えます。
ユーザーがアドインファイルを起動する必要もありません。(自動で開く)

【72903】Re:ブック間で変数を共有したいのですが
お礼  やまぐち  - 12/10/4(木) 19:02 -

引用なし
パスワード
   sasa様

ご教授有難う御座います。

>ユーザー側で参照設定をする必要はありません。
>開発時者が一度、参照設定して保存するだけです。

この点は確かにその通りですね。

ただ、
全ての経緯をお話するのは長くなり割愛させて頂くのですが、
大まかに次の点をテーマにしている関係で、
利用者側でアドイン組込or参照設定の対応が必要となる状況です。
その対応をより簡素に実現する方法を試行錯誤しております。

・共通機能を持つアドインは拡張性や利便性を考慮しファイル名に版数表現付与
・他Excel文書からアドイン機能のみの利用時は他Excel文書側でVBAは実装させない
・アドイン機能を利用しない他Excel文書はVBA関連で変更は発生させない

なので、予め参照設定すると
アドイン機能の改版時に別途対応手順が必要となり、
公開or複製文書の動作保障がしずらくなる懸念があります。

上記テーマについて実現可否の結論は、まだ出ていませんが、
皆様から教えて頂きました手段を含めて、
今後もチャレンジしていきたいと思っています。

尚、上記コメントにも支離滅裂な点もあるかとは思いますが、
VBAは独学素人と言うことで、お許し下さいませ。

また疑問が有りましたら、改めて質問させて頂きます。
有難う御座いました。

【72904】Re:ブック間で変数を共有したいのですが
発言  UO3  - 12/10/5(金) 7:18 -

引用なし
パスワード
   ▼やまぐち さん:

>
>・共通機能を持つアドインは拡張性や利便性を考慮しファイル名に版数表現付与
>・他Excel文書からアドイン機能のみの利用時は他Excel文書側でVBAは実装させない
>・アドイン機能を利用しない他Excel文書はVBA関連で変更は発生させない
>
>なので、予め参照設定すると
>アドイン機能の改版時に別途対応手順が必要となり、
>公開or複製文書の動作保障がしずらくなる懸念があります。
>

この件については、以前のとぴでも意見交換させていただきましたね。
その際も(こちらの伝え方が悪くて説明しきれませんでしたけど)申し上げたように
アドインにしろ参照設定にしろ、名前が変わるということは、その中のどれを適用すべきかは
同じように判断しなきゃいけないですし、これを実現するということは
判断するロジックが存在するということですね。

で、アドインにしろ参照設定にしろ、「マクロ内」で設定・削除ができます。

ということは、「必要なブック」にのみ、それを開くときに参照設定を行うほうが
当該エクセル共通のアドインの形にして、必要のないものがアクティブになったらあ
アドインをはずす、必要なものがアクティブになったらアドインを行うという煩雑なことを
しないで済む分、絶対に参照設定が「お得」だと思いますが?

【72924】Re:ブック間で変数を共有したいのですが
お礼  やまぐち  - 12/10/11(木) 12:43 -

引用なし
パスワード
   U03さん

ご教授本当に有難う御座います。
お返事が送れてすいません。

マクロ化したい事項が混在していた様で、
対応については次の通り整理しました。

1.アドインの汎用機能のみを使用したいブックでは、
 ブックのツール→アドインでチェックする(使用者側で操作)

2.ブックの個別マクロ処理を行う為にアドインの共通機能を使用したければ、
 ブックのVBAのツール→参照設定でチェックする
 (Workbook_OpenとWorkbook_BeforeCloseでReferences.AddFromFileや.Remove)

個別マクロを実装していないブックでは、
そもそもブック間で変数共有はあり得ないので1.対応とし、

個別マクロを実装しているブックでは、
ブック間で変数共有はあり得るとし2.対応としました。

マクロモジュールの取り込みもアドイン機能に実装し、
個別マクロを実装したいブックの保守性も考慮したつもりです。


多様な活用シーンを思い浮かべてしまって、
どの機能をどの様な手段で実現するかがゴチャになってましたが、
現状の落しどころとしました。


まだまだ、改善点はありますが、
”参照設定”という有意義なものに出会えた事を生かして、
今後も進化へのチャレンジはしていきます。


素人に対しまして、いろいろ教えて頂き本当に有難う御座います。
また、不明点などあったら改めて質問させて頂きます。


では。

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