文字列を数式に変換する標準モジュール「EVALUATE」の更新が不安定です
エクセルシート内の文字列を数式に変換して、計算結果を返すために下記標準モジュールを登録して試すのですが
うまく行ったりいかなかったり、標準モジュールが安定して機能しない原因などが分かりません。
●現在の設定とやりたいこと
(1)A1⇒=myEvalAry(B1)、B1⇒C1+D1、C1⇒2、D1⇒5 として、A1にC1+D1計算結果の7を表示させたい
(2)一つのシートの中に、myEvalAry標準モジュールを数百使っている
(3)一つのセルの中で、=myEvalAry(B1)+myEvalAry(B2)のように標準モジュールを複数使っているセルもある
●現在の状況
上記状態で、何かのタイミングで標準モジュールの計算結果が一気に全て正しく反映されることもあれば、
急に反映されなくなることもある。100のうち10だけ反映されることもある。
というような不安定な状態です。
しかも数量が問題かと思って、多量に登録していたmyEvalAryのセルを1つだけにして動きを確認しようとしたらまた反映
されなかったりで、全然理由が分かりません。
どこか標準モジュール内に、考慮すべき構文が漏れたりしてるのでしょうか????
正常稼働しない理由が分かると大変ありがたいです。win7、win8、excel2003、excel2013のいずれの環境でも同様です。
///////////////////////////////////////////////////////
Function myEvalAry(ParamArray ItemR()) As Variant
Dim re As Variant
Dim strTmp As String
Dim varR As Variant
Dim i As Variant, j As Variant
strTmp = ""
varR = ItemR()
For Each i In varR
If IsArray(i) Then
'引数が配列の場合
For Each j In i
If IsNumeric(j) Then
re = CStr(j)
Else
re = j
End If
strTmp = strTmp & re
Next
Else
'引数が配列以外
If IsNumeric(i) Then
re = CStr(i)
Else
re = i
End If
strTmp = strTmp & re
End If
Next
myEvalAry = Application.Evaluate(strTmp)
End Function
No.1ベストアンサー
- 回答日時:
こんにちは。
ちょっとコンサバ過ぎるかも知れませんが、現在の私流で書いてみました。
もし、数字(1とか2とか)であれば、そのまま連結してはいけない場合もあろうかと。
とりあえず、評価する対象文字列=strBufの先頭であればそのまま数字、
それ以外は"+"演算子に続けて数字という風に、勝手に少しお節介にしてみました。
(+2という文字列なら++2、-3という文字列なら+-3、を連結しますが戻り値は変わりません。)
ポイントは、最後の一行で、これだけでかなりの誤作動を防げる筈です。
現状が不安定ということですから、なるべく堅実なものをという意図で書いていますから、
処理は比較的遅くなりがちです。
叩き台にするなり、パーツだけ流用するなり、後はそちらで工夫してみてください。
それと、UDFに限らず、ParamArrayの多用は負荷が大きいようですから、
せいぜい数百、と考えておいた方がストレスがないとは思います。
(関数名、替えてあります。)
' ' ///////////////////////////////////////////////////////
Function myEvalAryC(ParamArray ItemR()) As Variant
Dim a As Range ' Area
Dim c As Range ' Cell
Dim strTemp As String ' Cellの表示文字列
Dim strBuf As String ' バッファ文字列
Dim Param As Variant ' ParamArrayの要素
strBuf = ""
For Each Param In ItemR()
If TypeName(Param) = "Range" Then
' ' 引数がRangeの場合
' ' 各領域(Area)をループ
For Each a In Param.Areas
' ' 各領域(Area)内のCellをループ
For Each c In a
' ' Cellの表示文字列
strTemp = c.Text
' ' Cellの表示文字列が数字として読めるものであれば、
If IsNumeric(strTemp) Then
' ' バッファ文字列が空ならそのまま数字を
' ' バッファ文字列が空でなければ"+"演算子と数字を
If strBuf <> "" Then strBuf = strBuf & "+"
End If
' ' バッファ文字列に流し込み
strBuf = strBuf & strTemp
Next
Next
Else
' ' 引数がRange以外の場合
If IsNumeric(Param) Then
If strBuf <> "" Then strBuf = strBuf & "+"
End If
strBuf = strBuf & Param
End If
Next
' ' Applicationではなくて呼び出し元のシートに評価させることが誤作動を防ぎます。
myEvalAryC = Application.Caller.Worksheet.Evaluate(strBuf)
End Function
残念ながら結果的には正常稼働しませんでしたが、ご指摘にあった多用しているのもありますので別の方法を検討したいと主追います。
しかし、アドバイス頂いた内容は大変参考になりました。
ありがとうございました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルでアルファベットか数...
-
C#で年月を比較する
-
EXCELで=より左の文字を一括で...
-
VBAでの Replace関数で、ワイル...
-
Excelで3E8を3.00E+8にしない方...
-
エクセルで文字列をtxtファイル...
-
Msgboxの×が押されたとき
-
エクセルで文字列の最大値を抽...
-
VBの「As String * 128」とは?
-
Excelで指数表現しないようにす...
-
文字列からタブコードを取り除...
-
同一セル内に関数と文字列を同...
-
16進数を10進数に簡単に変換す...
-
ダブルコーテーションでアンド...
-
【Excel VBA】複数ある特定の文...
-
VBA2005 16進を2桁で表示したい。
-
UNIX:縦一列のファイルを横一行...
-
VBA instr関数で文字列を途中か...
-
“丸(〇/○/◯)”に似た文字…
-
アクセスでのインポート時の改...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセルでアルファベットか数...
-
EXCELで=より左の文字を一括で...
-
文字列からタブコードを取り除...
-
VBAでの Replace関数で、ワイル...
-
Excelで指数表現しないようにす...
-
Excelで3E8を3.00E+8にしない方...
-
エクセルで文字列をtxtファイル...
-
【Excel VBA】複数ある特定の文...
-
Left関数とRight関数を合わせた...
-
同一セル内に関数と文字列を同...
-
アクセスで特定の数字以外(複...
-
MS SQLServer のSQLで文字列の...
-
エクセルで文字列の最大値を抽...
-
VBA2005 16進を2桁で表示したい。
-
ORCLEでの小数の表示方法の変更...
-
エクセル 数値データを桁をそ...
-
VBの「As String * 128」とは?
-
CStringの文字列検索&抜き出し...
-
エクセルでセル内の文字列の最...
-
Msgboxの×が押されたとき
おすすめ情報