- ベストアンサー
エクセルのVBA1式のコンパイルエラーとは?
- エクセルのVBAで特定の式を実行する際に、コンパイルエラーが発生してしまう問題があります。
- この問題は、ダブルクォートの使用方法に関連しています。
- 通常の関数と同じようにダブルクォートを使いながら式を入力する方法を知りたいです。
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
" & "対象外" & " や " & "対象" & " の前後の半角スペース付きの「 & 」が余計です。 Range("L" & Mdata).Formula = "=IF(ISERROR(VLOOKUP($E" & Mdata & ",☆集計!$C:$D,2,FALSE))," & "対象外" & ",IF($D" & Mdata & ">=VLOOKUP($E" & Mdata & ",☆集計!$C:$D,2,FALSE)," & "対象外" & "," & "対象" & "))" ではなく Range("L" & Mdata).Formula = "=IF(ISERROR(VLOOKUP($E" & Mdata & ",☆集計!$C:$D,2,FALSE)),""対象外"",IF($D" & Mdata & ">=VLOOKUP($E" & Mdata & ",☆集計!$C:$D,2,FALSE),""対象外"",""対象""))" として下さい。
その他の回答 (5)
- imogasi
- ベストアンサー率27% (4737/17069)
私が、よく勉強させていただいている田中 亨先生のサイト http://officetanaka.net/excel/vba/cell/cell03.htm の後半に解説があります。 ーー シートへ普通に関数を入力する(当然正しい式)文字列(=、関数名、セル番地、引数、括弧などをそのまま持ってきて、式の中で” ”で囲まれている(リテラル)文字列についての部分だけ、”” ”"のように、””を両側に変える、(”を両側ダブルにする)、と覚えておけば良いように思うが。 参考 私のメモ(Formula関係) Vこのように、セルに数式を入力するときは、Valueプロパティに対して代入しても、 Excelがうまく処理してくれます。ただし、セルに入力されている数式を取得するには、Formulaプロパティを使わなければなりません。 ーー ・最初に=が必要 ・文字列で式を入れるーー>””で両端を囲む必要あり http://officetanaka.net/excel/vba/cell/cell03.htm ・tanaka」を囲む""(ダブルコーテーション)を、文字列の区切りである""(ダブルコーテーション)ではなく、単なるデータとしての""(ダブルコーテーション)とするには、""(ダブルコーテーション)を2つ重ねて記述します。 ーー Sub Sample10() Range("A1") = "=LEFT(""tanaka"",2)" End Sub ーー 下記D1:D4部分には両端に””は不要 Sub test02() Mdata = 5 Range("D" & Mdata).Formula = "=SUM(D1:D4)" End Sub 式の方、すなわち=の右辺の、中身がVBAではRangeの中のセル範囲は両側””が要らない ーー Sub test01() Range("H1").Formula = _ "=IF(ISERROR(VLOOKUP($E3822,Sheet2!$C:$D,2,FALSE)),""対象外"",IF($D3822>=VLOOKUP($E3822,Sheet2!$C:$D,2,FALSE),""対象"",""対象外""))" MsgBox Range("H1").Formula End Sub のように一度VBA(構文のチェック)を通してMsgboxで表示して、シートに入力する式と同じかどうか、1字1字じっくりチェックするのがおすすめ。しかし要点はリテラルの両側の””””と思うが。
- Nouble
- ベストアンサー率18% (330/1783)
ワークシート関数については 割と理解があるご様子 CHAR関数はご存じですか? http://www.excel.studio-kazu.jp/func/char.html 同様の事がVBAでも可能です http://officetanaka.net/excel/vba/function/Chr.htm なので、後は連結するだけ かな? もし、もう諦めて VBAで検索を書くなら 辞書(ディクショナリー)に入れてしまうか FINDとFINDNEXTを使うか でしょうね 因みに、私は 過去回答を公開しています 其の中に FINDとFINDNEXTについて 触れたものが 最近の中にあります よければご参照ください。
- chie65536(@chie65535)
- ベストアンサー率44% (8755/19867)
追記。 貴方の「間違い」は「単に"を""に置き換えるだけ」で良かったのに「&を足すなど、余計な事をしてしまった」と言う点にあります。 元の文字列が 「~~FALSE)),"対象外",IF(~~」 だったのであれば 「~~FALSE))," & "対象外" & ",IF(~~」 ではなく 「~~FALSE)),""対象外"",IF(~~」 とするだけで良かったのです。 &演算子を足すなど、余計なことをして 「~~FALSE))," & "対象外" & ",IF(~~」 と書いた場合は「文字列定数を&演算子で繋いだだけ」ですから 「~~FALSE)),対象外,IF(~~」 と書いた場合と同じです。 また 「~~FALSE))," & ""対象外"" & ",IF(~~」 と書いた場合は 「~~FALSE))," & ""」「対象外」「"" & ",IF(~~」 の3つを並べて書いた事になりますから、VBは「空文字列""の後に、&演算子も無しで、何か変な事が書いてある」としてエラー(行が赤く表示)になります。 それじゃあ、って思って 「~~FALSE))," & "" "対象外" "" & ",IF(~~」 って書いたら、これも「文字列定数が&演算子無しで並べて書いてある」ので、エラーです。 「それじゃ、文字列を繋げるのに&を入れれば」って思って 「~~FALSE))," & "" & "対象外" & "" & ",IF(~~」 と書くと「& "" &」は無意味になっちゃいますから 「~~FALSE))," & "対象外" & ",IF(~~」 って書いたのと同じです。これでは「最初の間違った式と同じ」です。 こういう場合は「_(アンダースコア)の行継続」を使って「バラバラに分解してみる」と、間違いに気付けます。 Range("L" & Mdata).Formula = _ "=IF(ISERROR(VLOOKUP($E" _ & _ Mdata _ & _ ",☆集計!$C:$D,2,FALSE))," _ & _ ""対象外"" _ ←ここの部分が明らかにおかしい & _ ",IF($D" _ & _ Mdata _ & _ ">=VLOOKUP($E" _(以下略) こうして分解してみると「何かおかしいぞ」って気付けます。
- chie65536(@chie65535)
- ベストアンサー率44% (8755/19867)
元の式を、VBのコードエディタに貼り付けます。 VBが「余計な加工」をしてしまわないように「'(シングルコート)」を1文字入力して、コメント行にしてから、その続きに貼り付けます。 ’ =IF(ISERROR(VLOOKUP($E3822,☆集計!$C:$D,2,FALSE)),"対象外",IF($D3822>=VLOOKUP($E3822,☆集計!$C:$D,2,FALSE),"対象","対象外")) まず「全体を"で括って」下さい。 ' "=IF(ISERROR(VLOOKUP($E3822,☆集計!$C:$D,2,FALSE)),"対象外",IF($D3822>=VLOOKUP($E3822,☆集計!$C:$D,2,FALSE),"対象","対象外"))" 次に「式の中の"を""(ダブルクォート2個)に置き換え」して下さい。 ' "=IF(ISERROR(VLOOKUP($E3822,☆集計!$C:$D,2,FALSE)),""対象外"",IF($D3822>=VLOOKUP($E3822,☆集計!$C:$D,2,FALSE),""対象"",""対象外""))" 次に「変数にしたい『3822』を『"&Mdata&"』に置き換え」して下さい。 ' "=IF(ISERROR(VLOOKUP($E"&Mdata&",☆集計!$C:$D,2,FALSE)),""対象外"",IF($D"&Mdata&">=VLOOKUP($E"&Mdata&",☆集計!$C:$D,2,FALSE),""対象"",""対象外""))" 出来上がった式の手前に「Range("L" & Mdata).Formula = 」を足します。 ' Range("L" & Mdata).Formula = "=IF(ISERROR(VLOOKUP($E"&Mdata&",☆集計!$C:$D,2,FALSE)),""対象外"",IF($D"&Mdata&">=VLOOKUP($E"&Mdata&",☆集計!$C:$D,2,FALSE),""対象"",""対象外""))" 最後に、先頭の「' 」を取り除きます。 Range("L" & Mdata).Formula = "=IF(ISERROR(VLOOKUP($E" & Mdata & ",☆集計!$C:$D,2,FALSE)),""対象外"",IF($D" & Mdata & ">=VLOOKUP($E" & Mdata & ",☆集計!$C:$D,2,FALSE),""対象"",""対象外""))" 上手く行くと「VBエディタがちょっとした加工」をして、代入文が完成します(「ちょっとした加工」とは「連結演算子『&』の前後に、勝手に空白を挿入する」などです)
- Nouble
- ベストアンサー率18% (330/1783)
間違っていたら済みません。 VBAで、結果として「""」と得たい 此の時は、「""""」、「'""'」、 等とします ので、 対象を "対象"と、得たい ならば ""対象""が、駄目なら '"対象"'と、してみてください または、 キャラクターコードで 連結しては如何でしょうか
お礼
有難うございます。 残念ながら'" "'でも駄目でエラーとなってしまいます。 キャラクターコードの意味が良く分からないので、もうVBAで書いた方が速いのではないかと思っています。
お礼
大変ありがとうございます。 上手くできました。 皆様、本当にコメントを頂きありがとうございます。 どれでもベストアンサーに相当しますが、考察の結果、本回答をベストアンサーに致します。