![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?a65a0e2)
Excel2003
VBAのEvaluateで以下の数式を実行すると
エラー「型が一致しません」となってしまいます。
類似の質問を検索していろいろ参考にしてみたのですが
解決できなかったので質問させてください。
Sub test()
Dim aa, bb, cc As String
Dim y As Byte
y = 1
With Sheets("Sheet1")
aa = ".Cells(y, 1) > 0"
bb = Left(aa, InStr(aa, "y") - 1)
cc = Mid(aa, InStr(aa, "y") + 1)
If Evaluate(bb & y & cc) Then ←ここでエラーになります。
y = 2
End If
End With
End Sub
.Cells(1, 1)には10が入力されています。
宜しくお願い致します。
No.2ベストアンサー
- 回答日時:
こんにちは。
.Evaluateメソッドの練習でしょうか?
.Evaluateメソッドを使う必要も必然性もないですから、
コードの提示だけでは実際に何をしたいのか判断付きませんけれど、
ご提示のコードを(正しくやりたいことを表現できているものとして)素直に読んで
修正を加えるとするば、以下のようになります。
' ' ///
Sub Re8383252()
Dim 数式雛型 As String, 数式 As String
Dim y As Long
数式雛型 = "A1>0"
y = 1
数式 = Replace(数式雛型, "1", y)
With Sheets("Sheet1")
If .Evaluate(数式) Then
y = 2
End If
End With
End Sub
' ' ///
ご提示のコード内の変数の値等を確認してみると、
aa ⇒ ".Cells(y, 1) > 0"
bb ⇒ ".Cells("
bb ⇒ ", 1) > 0"
bb & y & cc ⇒ ".Cells(1, 1) > 0"
(値はすべて 文字列値 ↑)
のようになっています。
Evaluate(bb & y & cc)
は、
Evaluate(".Cells(1, 1) > 0")
を実行していることになり、
Excel側で".Cells(1, 1) > 0"を評価した結果として
「エラー 入力した数式は正しくありません」
が返り、
VBA側では、If文にエラー値を渡すことになるので
「実行時エラー '13' 型が一致しません」
という結果になります。
そもそも.Evaluateメソッドは、文字列式を渡して、
Excelに評価(計算)させる為のメソッドですから、
If Evaluate("A1>0") Then
のようにExcel数式を引数に渡してこそ成立しますが、
"Cells"という関数も名前もExcelにはありませんから、必然エラーになります。
ご提示のコードでおかしな点を指摘しておきます。
> Dim aa, bb, cc As String
3つの変数の内、文字列型で宣言されているのは、cc、だけです。
Dim aa As String, bb As String, cc As String
と書くのが意図にそった正しい書き方なのではないでしょうか?
> Dim y As Byte
行位置を扱う変数には、Long 型を使うのが正解です。
Byte型は本来、バイナリデータの配列を格納する為に用意されているもので、
通常は、数値を格納することはない(間違い)、と覚えてください。
今から20年も前ならば、少しでもメモリを節約する目的で、
無理矢理Byte型を使うような悪いお手本も見かけましたが、
今日的には、如何なる目的であろうとも間違いは間違いです。
> With Sheets("Sheet1")
・・・
> End With
Withフレーズを使うのは、
Sheets("Sheet1").Cells(1, 1).Value = 10
Sheets("Sheet1").Cells(1, 2).Value = 20
のような例で、Sheets("Sheet1")への参照を繰り返すのは無駄が多いので、
With Sheets("Sheet1")
.Cells(1, 1).Value = 10
.Cells(1, 2).Value = 20
End With
のようにオブジェクトへのアクセスを一つにまとめる意味です。
Withフレーズを書いているのに、一度も使っていないのでは意味がありませんし、
読み手は困惑してしまいます。
こちらで提示したコードでは、.Evaluate のように、
Sheets("Sheet1")への参照を一度だけ活用していますが、
そのままなら、わざわざWithブロックを使う必要はありません。
> aa = ".Cells(y, 1) > 0"
> bb = Left(aa, InStr(aa, "y") - 1)
> cc = Mid(aa, InStr(aa, "y") + 1)
> If Evaluate(bb & y & cc) Then
元の数式としてのaaは間違いですが、
それ以外の処理のしかたは間違っていません。
ただ、Replace関数を使って数式の一部(行位置)を置換する方が簡単です。
> .Cells(1, 1)には10が入力されています。
具体的なシートの状況を説明する時は、
「数値 10 」なのか、「文字列値 "10" 」なのか、明示的に書き分けるのがベターです。
「数値 10 」のような書き方ならば、見やすく全角で書いたものとして伝わりますが、
「10」のようにただ全角で書くのは誤解の元です。
VBAを扱うのならば、データ型には注意しましょう。
やりたいことは何となく想像は付くのですが、
何故.Evaluateメソッドなのか、把握できていませんので、
そちらの実際にやりたいことに、擦寄るような回答は書きません。
ご質問文に書かれたお尋ねに対しては、十分にお応え出来たものと思っています。
そちらで尚も不足が残るようでしたらば、スレッドを改め、質問を再構築してください。
以上です。
ご教示頂いたコードで出来ました!
EvaluateがそもそもExcel関数である為、Excelの数式を与えないといけないことやReplaceの方が簡潔であることに加え、コードの書き方に至るまで懇切丁寧に説明して頂き誠にありがとうございました。
Webで質問するのは初めてでしたが、して良かったです。
自分のコードを再度見直したいと思います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) 実行時エラー´5854´ 文字列型パラメーターが長すぎます。 3 2023/06/08 21:17
- Visual Basic(VBA) ExcelVBAでDo Until loopのネスト、IF文を使って一致する物と一致しない物としたい 11 2022/12/24 17:46
- Visual Basic(VBA) マクロを教えてください。 7 2023/06/01 19:47
- Excel(エクセル) VBAについて 3 2022/06/19 18:19
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- Visual Basic(VBA) 動かなくなってしまった古いVBAを動くようにしたい 8 2022/09/20 13:57
- Visual Basic(VBA) VBA 請求書自動作成 3 2022/04/24 01:58
- Visual Basic(VBA) Excelで下記のようにマクロを作ったところ、一回目は実行できたのですが、二回目以降「実行時エラー1 1 2022/03/25 08:08
- Visual Basic(VBA) オブジェクトが見つかりません 1 2023/06/24 19:43
- Visual Basic(VBA) VBA Userformで一部別シートに転記がしたいのですが 2 2023/05/24 13:08
このQ&Aを見た人はこんなQ&Aも見ています
-
あなたの「必」の書き順を教えてください
ふだん、どういう書き順で「必」を書いていますか? みなさんの色んな書き順を知りたいです。 画像のA~Eを使って教えてください。
-
スマホに会話を聞かれているな!?と思ったことありますか?
スマートフォンで検索はしてないのに、友達と話していた製品の広告が直後に出てきたりすることってありませんか? こんな感じでスマホに会話を聞かれているかも!?と思ったエピソードってありますか?
-
みんなの【マイ・ベスト積読2024】を教えてください。
積読、ついついしちゃいませんか?そこでみなさんの 「2024年に買ったベスト積読」を聞きたいです。
-
人生でいちばんスベッた瞬間
誰しも、笑いをとろうとして失敗した経験があると思います。
-
14歳の自分に衝撃の事実を告げてください
タイムマシンで14歳の自分のところに現れた未来のあなた。 衝撃的な事実を告げて自分に驚かせるとしたら何を告げますか?
-
sumproductの計算式で「エラー2015」(ローカルウィンドウにて)が表示(Excel2007、2003)
その他(Microsoft Office)
-
Evaluateを使ってマクロに記述した関数に変数を使う方法
Excel(エクセル)
-
エクセルで 例えばA1のセルに1+1 と入力すると B1のセルに2 と答えが出る関数があったと思いま
Excel(エクセル)
-
-
4
Excelでセル参照したとき、書式も一緒に持ってくるには?
Windows Vista・XP
-
5
VBAでエクセルシートを更新(リフレッシュ)する方法を教えて下さい。
Excel(エクセル)
-
6
エクセルのラベルの値(文字列)を垂直方向で中央揃えにするには?
Excel(エクセル)
-
7
Excelのテーブル上のセルの保護はどうすればいい?
Excel(エクセル)
-
8
Evaluate()に文字列の形式の数式を渡すには
Visual Basic(VBA)
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・一番好きなみそ汁の具材は?
- ・泣きながら食べたご飯の思い出
- ・「これはヤバかったな」という遅刻エピソード
- ・初めて自分の家と他人の家が違う、と意識した時
- ・いちばん失敗した人決定戦
- ・思い出すきっかけは 音楽?におい?景色?
- ・あなたなりのストレス発散方法を教えてください!
- ・もし10億円当たったら何に使いますか?
- ・何回やってもうまくいかないことは?
- ・今年はじめたいことは?
- ・あなたの人生で一番ピンチに陥った瞬間は?
- ・初めて見た映画を教えてください!
- ・今の日本に期待することはなんですか?
- ・集中するためにやっていること
- ・テレビやラジオに出たことがある人、いますか?
- ・【お題】斜め上を行くスキー場にありがちなこと
- ・人生でいちばんスベッた瞬間
- ・コーピングについて教えてください
- ・あなたの「プチ贅沢」はなんですか?
- ・コンビニでおにぎりを買うときのスタメンはどの具?
- ・おすすめの美術館・博物館、教えてください!
- ・【お題】大変な警告
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・最強の防寒、あったか術を教えてください!
- ・歳とったな〜〜と思ったことは?
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
C#の捕捉されない例外処理の対...
-
VC++におけるCStringの変換
-
文字列からダブルクオートの削除
-
VB.Net Object型 空かどうか
-
VBA Evaluate関数 型が一致しま...
-
Timestamp型への変換について(J...
-
全角スペースのチェックについて
-
時間の取得
-
Javaで文字列をゼロ埋め(ゼロパ...
-
C# UriFormatExceptionの回避
-
WebClient()以外でネットにアク...
-
ファイルダイアログを開いた時...
-
struts2 例外時にエラー画面に...
-
[C#][FX]DLLを利用した共有メモ...
-
Excelでのエラー
-
エクセルVBAで、条件に一致する...
-
複数の変数を宣言する時、同時...
-
変数名の付け方
-
配列の重複する値とその個数を...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
VB.Net Object型 空かどうか
-
連続する「\\」をひとつの「\\...
-
C#の捕捉されない例外処理の対...
-
VB.NETで16進数が正しいかどう...
-
Javaで文字列をゼロ埋め(ゼロパ...
-
VBA Evaluate関数 型が一致しま...
-
VC++におけるCStringの変換
-
文字列からダブルクオートの削除
-
ファイルダイアログを開いた時...
-
Timestamp型への変換について(J...
-
時間の取得
-
数字か文字列かを判定する関数
-
nullで、return出来るのはどん...
-
文字列が数字のみで構成されて...
-
C# UriFormatExceptionの回避
-
struts2 例外時にエラー画面に...
-
0除算の例外処理ができない!!...
-
例外ってIf文の中に入れますか...
-
全角スペースのチェックについて
おすすめ情報