
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も見ています
-
sumproductの計算式で「エラー2015」(ローカルウィンドウにて)が表示(Excel2007、2003)
その他(Microsoft Office)
-
Excel 関数? 文字列になっている数値を計算したいのですが
Excel(エクセル)
-
エクセルで 例えばA1のセルに1+1 と入力すると B1のセルに2 と答えが出る関数があったと思いま
Excel(エクセル)
-
-
4
Evaluateを使ってマクロに記述した関数に変数を使う方法
Excel(エクセル)
-
5
evaluateを使ったユーザ定義関数でエラー
その他(Microsoft Office)
-
6
Evaluate()に文字列の形式の数式を渡すには
Visual Basic(VBA)
-
7
worksheetFunctionクラスのVlookupプロパティを取得できません エラーへの対応
Visual Basic(VBA)
-
8
Excelの警告について
Excel(エクセル)
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
数字か文字列かを判定する関数
-
C# マルチスレッドにおける例外...
-
基本的にはないと言われました
-
ノートPC内臓CD-ROM(DVD-ROM)...
-
C#の捕捉されない例外処理の対...
-
文字列が数字のみで構成されて...
-
文字列からダブルクオートの削除
-
VB.Net Object型 空かどうか
-
VBA 400エラー 1004エラー
-
連続する「\\」をひとつの「\\...
-
文字列の最後の文字取得
-
ファイルダイアログを開いた時...
-
例外ってIf文の中に入れますか...
-
[C#][FX]DLLを利用した共有メモ...
-
VB.NETで16進数が正しいかどう...
-
String型の日付(2005/11/25)の...
-
デバッグについて
-
SQLException getNextException()
-
初回例外
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「タイプ初期化子が例外をスロ...
-
C#の捕捉されない例外処理の対...
-
VB.Net Object型 空かどうか
-
連続する「\\」をひとつの「\\...
-
VC++におけるCStringの変換
-
VBA Evaluate関数 型が一致しま...
-
Javaで文字列をゼロ埋め(ゼロパ...
-
ファイルダイアログを開いた時...
-
VB.NETで16進数が正しいかどう...
-
Timestamp型への変換について(J...
-
C# マルチスレッドにおける例外...
-
コンストラクタでの例外は不可...
-
文字列からダブルクオートの削除
-
String型の日付(2005/11/25)の...
-
例外ってIf文の中に入れますか...
-
初回例外
-
【JAVA】与えられた金額を貨幣...
-
アサーションと例外処理の違い...
-
VBA 400エラー 1004エラー
-
WebClient()以外でネットにアク...
おすすめ情報