人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

ExcelVBAについて質問です。
セルAに解を設定し、セルBに解を求めるためのメソッド名を書きます。
エクセルにあるボタンを押したとき、
セルBに書いてあるメソッド名を読み出して、該当する同じ名前のメソッドを用い
セルAに解をセットすることはできますか?

回答宜しくお願いします。

●質問者: harunoharuno
●カテゴリ:コンピュータ 学習・教育
✍キーワード:エクセル セル ボタン メソッド 名前
○ 状態 :終了
└ 回答数 : 4/4件

▽最新の回答へ

1 ● SALINGER
●23ポイント

こんな感じでどうでしょうか。

シートにコマンドボタンを配置して、ダブルクリックで開く先に次のコードを記入してください。

Private Sub CommandButton1_Click()
 Select Case Range("B1").Value
 Case "メソッド1"
 Call メソッド1
 Case "メソッド2"
 Call メソッド2
 Case "メソッド3"
 Call メソッド3
 End Select
End Sub

Sub メソッド1()
 Range("A1").Value = "メソッド1の解"
End Sub

Sub メソッド2()
 Range("A1").Value = "メソッド2の解"
End Sub

Sub メソッド3()
 Range("A1").Value = "メソッド3の解"
End Sub

http://q.hatena.ne.jp/

◎質問者からの返答

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

できればケース文を使わず、セルから読み取った文字列を元に

メソッドが呼び出せると助かります。

前提としてセルの文字列とメソッド名は同一で構いません。

もしよろしければできるできないに問わず、ご意見など

もう一度解答していただけると嬉しいです。


2 ● ふるるP
●23ポイント

できます。

Evaluate 関数を使います。

セル(1,2)に

'myCalc(2,3)

をセットしておき、標準モジュールに

Function myCalc(a, b) As Double

myCalc = a + b

End Function

Sub main()

s = Sheet1.Cells(1, 2).Value

a = Evaluate(s)

Sheet1.Cells(1, 1) = a

End Sub


を入力します。Mainを実行すると、セル(1,1)にmyCalcの計算結果である5がセットされます。

URLは説明をしているブログです。

http://shoji.blog1.fc2.com/blog-entry-60.html

◎質問者からの返答

どうも有難うございます。回答していただいた方法で

やりたいことができました。しかし、副作用なのかどうか、、、、

VBAのデバッグがEvaluateで呼び出された関数内にはいっていきません(ブレークポイントをはってもとまりません)。

これはこういうものなのか・・・メッセージボックスで出力し処理を追うことはできますがなにか良い対応方法はありませんでしょうか?


3 ● SALINGER
●22ポイント

frkw2004さんの回答にあるEvaluateを使えば可能ですね。

書き換えると

Private Sub CommandButton1_Click()
 Call Evaluate(Range("B1").Value)
End Sub

Sub メソッド1()
 Range("A1").Value = "メソッド1の解"
End Sub

Sub メソッド2()
 Range("A1").Value = "メソッド2の解"
End Sub

Sub メソッド3()
 Range("A1").Value = "メソッド3の解"
End Sub

B1に「メソッド2()」とか入れると意図する動作をします。


この回答にはポイント不要です。

http://q.hatena.ne.jp/

◎質問者からの返答

回答有難うございます。回答いただいたのと同じようなコーディングになりましたので

コーディング方法として的を外していないことに少し安心しました。

しかし、VBAのデバッグがEvaluateで呼び出された関数内にはいっていかなくなりました(ブレークポイントをはってもとまりません)。処理はメッセージボックスで確認できますがちょっと苦しいです。適当な対処方法などありましたらあわせて回答していただきたく宜しくお願いします。


4 ● ふるるP
●22ポイント

Evaluateで呼び出す場合、呼び出された関数は完成しているものとするべきでしょう。

単体テストを十分に行って、関数でエラーが出ないようにしましょう。

単体テストをするにあたって、Evaluateで呼び出すのではなく、普通にモジュールの中で呼び出すようにして、

さまざまな入力パターンをテストしましょう。

普通に呼び出す分にはブレークポイントが有効になるはずです。


URLはダミーです。

http://www.net

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ