質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

Q&A

解決済

2回答

1880閲覧

VBAにてpublicについて分かってきましたが・・・

nissanngtr34

総合スコア24

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

0グッド

0クリップ

投稿2015/10/09 04:35

うまく説明できてなければ申し訳ございません。

例を使って質問させて下さい。

変数CがPubluicで宣言しているので、
他のプロシージャで変数Cが使えるというとこまで理解できました。

この下の例だと足し算だけの単純な処理ですが、
計算部分に他の処理があったとした場合、
他のプロシージャでCall 計算とすると、計算の部分すべて動いてしまいますよね?

すべて動かれてしまうと邪魔だという場合どうすればよろしいでしょうか?

下手な質問ですみません。

Public C As String Sub 計算() C=a+b End Sub Sub 呼び出し() Call 計算 MsgBox(C) End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

こんにちは。

極端な話をすると、「すべて動かれてしまうと邪魔だという場合」は呼ばなければ良いです。
動かしたい一部だけ切り出して関数化し、計算の中から呼び出すとか。部品化するくらいでしょうか。

(追記)ちょっと雑ですが、コード例を。「呼びたくない」を呼ばずに一番下の関数を直接呼び出しては、ということなのですが。

VBA

1Public Sub 呼びたくない(a1 As String, a2 As String) 2 3 Dim チェック結果 As Boolean 4 チェック結果 = A1とA2の値の未入力のチェック(a1, a2) 5 6 If チェック結果 = True Then 7 8 'メッセージを表示 9 Dim OKおされた As Boolean 10 OKおされた = True 11 12 If OKおされた Then 13 14 Dim くっつけた値 As String 15 くっつけた値 = A1とA2をくっつける(a1, a2) 16 17 End If 18 19 End If 20 21End Sub 22 23Public Function A1とA2の値の未入力のチェック(a1 As String, a2 As String) As Boolean 24 25 'チェック処理 26 A1とA2の値の未入力のチェック = True 27 28End Function 29 30Public Function A1とA2をくっつける(a1 As String, a2 As String) As String 31 32 'くっつける 33 A1とA2をくっつける = "A1とA2をくっつけた値" 34 35End Function

投稿2015/10/09 04:39

編集2015/10/09 06:04
Tak1wa

総合スコア4791

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nissanngtr34

2015/10/09 05:26 編集

いつもアドバイス頂きありがとうございます。 うーん。。。呼ばなければいいですか。 なにかしらでSubプロシージャ内の変数をどこかに残せればいいのですが・・・ 例えばA1とA2の値の未入力のチェック、未入力でなければメッセージを表示し、そのメッセージに対してOkを選ぶとA1とA2の値をくっつけるという処理を今しています。 そのくっつけた値を他のプロシージャで何箇所か使いたいので、publicで宣言しているのですが、Call 処理をするとくっつけた値だけが欲しいのに未入力チェックなどされてしまい・・・ おそらく自分のプログラミングの仕方が悪く。。 イメージでいいますと、処理結果をセッションみたいにいったん他のとこで持たせるてきなことができればいいのですが。。。 これをするには関数か部品化ですか?
Tak1wa

2015/10/09 06:06

ちょっと雑なつくりですが部品化しました。pi-chanさんもおっしゃってますが、バグのもとですので無暗にPublic変数を使用するのは避けたほうが良いでしょう。
sgr-2

2015/10/09 06:28

横からすいません。 私もPublicにする必要がないなら、しない方が良いと考えています。 "やりたい事"は多分、分解すると次の3点になるのかと思いました。 ・未入力チェック ・入力内容の結合(A1とA2) ・結合結果の参照 これらの事が「いつのタイミングで必要か」(同じタイミングで良い/事前に必要など)が固まれば、おのずと形が定まってくると思いますので、「処理(やりたい事の分解結果)」と「必要なタイミング」を一度整理してみるのが良いかも知れませんね。
nissanngtr34

2015/10/15 04:42

ご返答遅くなり申し訳ございません。 大変勉強になります。ありがとうございます。
guest

0

ベストアンサー

nissanngtr34さんのような疑問の生じる原因はきっとこういうことだと思います。つまり・・・

  • Public変数の「機能」は理解できた
  • Public変数の「使いどころ」がピンと来ない

この問題を正しく理解するために、まずは「スコープ」という概念についてしっかりと復習してください。

変数の適用範囲(スコープ)

どのスコープの変数を使うべきかは「目的」によります。つまり、目的に合わせてきちんと設計した結果として決まるものです。

ですから「すべて動かれてしまうと邪魔だという場合」は、最初から Public変数は使いません。

Public変数はバグの温床になるので、本当に必要な場合のみに使用を限定した方が良いです。
また、もし使用する場合でも、値のセットは決められた場所だけで行い、それ以外の場合では参照のみに制限すべきです。

あまり良い実例が思い付きませんが・・・
例えば売り上げ計算のプログラムがあったとします。
消費税率がいつ変更になるか分からないので、ユーザーは予め準備されている「設定」シートの所定のセルに正しい税率を入力し「計算開始」ボタンを押します。
プログラムの初期化処理で、入力された税率を Public変数にセットした後、計算処理プロシージャを呼び出します。
プログラム内では、必要ならいつでもどこでも税率を「参照」出来ますが、バグを避けるため途中で「変更しないルール」としておきます。

投稿2015/10/09 05:59

pi-chan

総合スコア5936

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

nissanngtr34

2015/10/15 04:41

返信遅くなり申し訳ございません。 大変勉強になります。ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問