• 締切済み

VBA ダブルコーテーション

VBAについて、ダブルコーテーションの個数が理解できないものがありません。 セル範囲B3:B35に" 様"を追加するコード Sub 一括文字列追加() Range("B3:B35").Value = Evaluate("B3:B35&"" 様""") End Sub この Evaluate("B3:B35&"" 様""")の部分ですが、 Evaluate("B3:B35&" 様"")であれば納得できますが、どのような対応付けなのでしょうか? よろしくお願いします。

みんなの回答

回答No.4

文字列を文字列として認識できるように渡さないといけないからEvaluateみたいなのは難しいですね。 これはもう経験なので、いろいろコードを書いていくしかないと思います。 ざっと言ってしまうと 「B3:B35」というのはEvaluateがRangeとして認識できるのでそのままですね。 一方「 様」というのは文字列として渡すのですから、" 様"のようにダブルクォーテーションで囲みます。 よって、「B3:B35 & " 様"」という値を渡すことになります。 ここで、Evaluateは文字列を引数として取りますので、「"B3:B35 & " 様""」と、こうなるわけです。 ここまではいいでしょうか? ところが、文字列の中にダブルクォーテーションを表現する場合、ダブルクォーテーションの前にダブルクォーテーションを付けるという約束事があります。 様の前後のダブルクォーテーションはダブルクォーテーションとしてEvaluateに渡さねばなりませんから、その結果「"B3:B35 & "" 様"""」となるのです。 これは普通の文字列変数を使う際にも言えます。 例えば、「私は"こんばんは"といいました。」とMsgBoxで表示したい場合、 Call MsgBox(私は"こんばんは"といいました。) ではダメですね。MsgBoxは文字列を引数にとるのですから、 Call MsgBox("私は""こんばんは""といいました。") となります。 ちなみに私なんかは、わかりにくいEvaluateなんか使いません。^^; Sub 様追加() For Each objCell In Range("B3:B35") objCell.Value = objCell.Value & " 様" Next End Sub

  • chie65535
  • ベストアンサー率43% (8523/19372)
回答No.3

Evaluateの引数には「式として評価可能なモノを、文字列で指定する」と言う「お約束」があります。 「式として評価可能なモノ」とは、例えば B3:B35 とか A4 & "あいう" とか B3:B35 & "様" などです。 で、上記のような「式として評価可能なモノ」を、引数に渡す際に「文字列」にしないといけないので、渡す値は、ダブルクォーテーションマークで括って "B3:B35" とか "A4 & ""あいう""" とか "B3:B35 & ""様""" などにしないとなりません。

  • imogasi
  • ベストアンサー率27% (4737/17068)
回答No.2

VBAでは、利用する場合が珍しい関数Evaluateの質問かと思ったが、実はVBAの関数の「引数の(中の定数の)指定の表現」に関することではないですか。 Evaluateの引数である、カッコ()の中は、文字列で指定することを要求される。これはこの関数の種類からして疑問がないでしょう。そこで文字列を示す両端の””について (素人的には、引数が文字列に決まっているなら最初と最後の””は省略させてもよいのではと思うが、小生が浅はかなのかな) "B3:B35&"" 様"""の両端の””を1つづつ省いて B3:B35&"" 様""となると考えてみます。 そこで、リテラル(文字通りの値指定のこと)指定の"" 様""の両側が””が2つづつ連なっているが、文字列定数の中での「リテラル」値の指定なので””を2つ連ねる約束になっていると考えるとどうでしょう。 「Evaluate関数 VBA」でWEB照会して http://www.ne.jp/asahi/hishidama/home/tech/excel/workfunc.html http://www.moug.net/tech/exvba/0100045.html などの中の例示のコードに、 Debug.Print Evaluate("LenB(""ABCあいう"")") Result = Evaluate("GETPIVOTDATA(""金額"",B4,""名前"",""山田"")") のような例も載ってます。 ーー 引数に要求される文字列の中に出てくるリテラル値(定数)は””〇””で表すと覚えるほかない。 小生はAccessのクエリ(のデザイングリッド)の条件やAccessのSQL文の中ではどうだったか、記憶があやふやなもので、いつも迷うのですが、WEB実例などを調べて慎重にやってます。 ちなみに正規表現などで特殊な役割を持たせられている文字は、その文字そのものを指定するときは、2つ連ねるルールがあるが、それとは(理由)パターンが違うようです。文字列の中に出てくる定数の出現を察知DETECTするためのシステムプログラムを組む(組んだ)人のためのお約束かと思います。その場合に、文字列の両側が"が1つだと混乱するのかどうか小生にはわかりません。引数を解析の過程で、外側から”を1つづつ外していけば、混乱ないようにも素人的におもいますが。 言語、SQL処理系、VBAか操作ソフト(VBAでなくアクセスを普通に使うときなど)かで、いつもこの点に注意し経験で学ぶしか方法はないのかと思いますが、この点の根本則があるのかどうか。

noname#212058
noname#212058
回答No.1

VBA では文字列の中で " という文字を使いたいときは、"" と書く、というルールは知っておいででしょうか。例えば、変数 a に文字列  文字"文字 を入れたい場合は  a = "文字""文字" と書くのです。 質問の場合は  "B3:B35&"" 様""" ですので、実際に使おうとしている文字列は  B3:B35&" 様" ですね。 なお、"B3:B35&" 様"" はエラーになります。これでは「B3:B35&」 という文字列と、「様」という意味不明な命令と、「」 という文字列との3つに分かれていることになってしまいますので。

7362874
質問者

お礼

ご回答ありがとうございます。 正確には、”様”ではなく様を追加したいのですが、 http://kokodane.com/mini_macro46.htm

関連するQ&A

  • VBA シングルクォーテーションと=の入力

    文字が入っているセルの前後にに文字を追加するマクロ ="=aaa"と入力したい ダブルクォーテーションとイコールを追加したいのですが ↓のとおり作ってみたもののうまくいきません。 range(a1).Value = " = " & """ " = " & .Value" これだとダメですか??

  • VBAでダブルコーテーション入りの数式をセルにセットしたい

    VBAにて下記質問があります。 複数の質問を連続して投稿するのもどうかと思い、 不慣れなもので、1投稿で2種類の質問を記載いたしましたが、 迷惑等になるのであれば、削除後複数投稿にて再度投稿したいと思いますので、遠慮なくご指摘下さい。 さて、本文ですが、 1.VBAにてExcelのあるセルに数式をセットしたいのですが、数式内にダブルコーテーションがある為、上手くセットできません。 2.VBAでRange関数のパラメータを可変にしたい。 1について、 セットしたい数式 =IF(ISERROR(VLOOKUP(H23,ini!B36:D401,3))=TRUE,"",IF(VLOOKUP(H23,ini!B36:D401,3)=0,"",VLOOKUP(H23,ini!B36:D401,3))) セットしたいセルをH44とした場合、単純に .Range("H44").Value = "=IF(ISERROR(VLOOKUP(H23,ini!B36:D401,3))=TRUE,"",IF(VLOOKUP(H23,ini!B36:D401,3)=0,"",VLOOKUP(H23,ini!B36:D401,3)))" このように書いてエラーになってしまいます。 ダブルコーテーションがあるので当然だとは思うのですが、 回避の仕方がわかりません。 また、2についてですが、 「ワークシートに書かれた値をRangeのパラメータとして代入したい。」 仮にSheet1のA2のセルにA~Fまでのいづれかの値が入るものとする。 Range関数の列の指定はA2の値を参照し、代入したい。 A2の値:C worksheets("sheet1").Range("〇1”).Value 〇にCが入るようにしたい。 当然、A2がFになったらFが代入されるようにしたい。 色々検索し、調べてみたのですが上手く見つけられませんでした。 VBA初心者である為、上記説明が分かりづらいかもしれませんが、 分かる方おりましたら、ご教授の程、よろしくお願い致します。

  • Excelに、ダブルクォーテーションで始まる文字列を貼り付けると、ダブルクォーテーションが消えること

    Excelで、ダブルクォーテーションで始まる文字列をセルに貼り付けたときに ダブルクォーテーションが消えるのですが、 Excelってもともと(標凖的な動作として)そういうものですか。 (F2キーを押すなりして)編集状態にして貼り付ければ、ダブルクォーテーションのついたまま貼り付くのですが、 私はセルを選択して貼り付けただけでも大丈夫だと思っていました。 「文字列を貼り付ける」というのは、例えばテキストエディタ上にあるものを手作業でコピーして貼り付ける、ということです。 「ダブルクォーテーションで始まる文字列」と言っても、 ダブルクォーテーションが3つ以上あったときに消えるのは、最初の1組(2つ)ですね。 しかし、 "AAAA"""BBBB のような場合には、なぜか AAAA"BBBB になるのです。 (ちなみに、この文字列を、質問直前の質問内容確認の画面(IE)でコピーしてExcelに貼り付けたときは、違います。) どのような規則に基づいてダブルクォーテーションが消えるのかも疑問です。 このような仕様になっている理由はなんでしょうか。 また、Excelに文字列を貼り付けるという操作を頻繁に行うため、 できれば、編集状態にしなくても、 セルを選択して貼り付けするだけで、そのままダブルクォーテーションも貼り付いてほしいのですが、 そのためにはどうすればよいのでしょうか。 「セルの書式設定」で、表示形式を文字列にすればよいと思ったのですが、だめでした。 セルには文字列を入れるだけで、数式を入れたりしません。 (数式としては扱ってほしくない、という意味です。) Excelは2000です。

  • Excel VBA 「名前の定義」で参照範囲RefersToR1C1に

    Excel VBA 「名前の定義」で参照範囲RefersToR1C1にString型を代入するとダブルクォーテーションが入ってしまう問題を解決するには? Excel VBAで、次のように「名前の定義」で参照範囲にString型を代入するとダブルクォーテーションが入ってしまいます。 Sub Macro0() Dim str As String Range("B162").Select str = "'" + Range("B162").Value + "'" + "!A1:Z65535" ActiveWorkbook.Names.Add Name:="name", RefersToR1C1:=str ActiveWorkbook.Names("tes1").Comment = "" End Sub これを実行しますと、「参照範囲」にダブルクォーテーション""が余計に入ってしまい、正しく参照できません。 このダブルクォーテーションをつけない方法はありますか?よろしくお願いします。

  • EXCEL2003 VBA リストボックス

    お世話になります。 質問の内容についてですが、 現在VBAの勉強をしながらデータベースを組んでいます。 そこで、次のようなものを作っています。 Sheet1に於いて、     A    B     C 1  追番  名称   個数 2   1   りんご   1個 3   2   みかん  2個 4   3   なし    3個 5   4   なす    5個 というような表があるとします。 そして、VBAでフォームをつくり、TextBox1(名称入力用)、TextBox2(個数入力用)、ListBox1(すでに入力されているもの及び追加分のリスト用)、CommandButton1(入力された「名称」と「個数」をSheet1の表の一番下に追加)、CommandButton2(フォームを閉じる)という構成にしています。 また、Sheet1上にコマンドボタンを作っており、そのボタンを押すとフォームを呼出すようにしています。 流れとしては、既存の表に追加する場合、コマンドボタンを押してフォームを呼出し、テキストボックスに入力した内容をSheet1の一番下に追加する。また、フォーム上のリストボックスでも現在の表の内容を見る事ができる、というものです。 フォームでのコードは以下のようにしています。 Private Sub CommandButton1_Click() If TextBox1.Value = "" Then MsgBox "「名称」は必須項目です。" End If If TextBox2.Value = "" Then MsgBox "「個数」は必須項目です。" End If If TextBox2.Value = "0" Then MsgBox "「個数」に0は登録できません。" End If Lrow = Range("B2").CurrentRegion.Rows.Count Range("B" & Lrow + 1).Value = TextBox1.Value Range("C" & Lrow + 1).Value = TextBox2.Value End Sub Private Sub CommandButton2_Click() Unload UserForm1 End Sub Private Sub UserForm_Initialize() Dim b As Long Dim a() As String ReDim a(1 To 100) UserForm1.ListBox1.ColumnCount = 2 UserForm1.ListBox1.List = Worksheets(Sheet1).Range("B2:C").Value For i = 2 To 104 If Range("B" & i) = "" Then ListBox1.AddItem Range("B" & i).Value ListBox1.AddItem Range("c" & i).Value b = b + 1 a(b) = Range("C" & i).Value End If Next i End Sub このコードでSheet1上のコマンドボタンを押して実行しようとするとエラーが出てしまいます。 エラーの原因は何なのでしょうか? (なお、コマンドボタンのコードは「UserForm1.Show」のみです。 コード自体は本などを読みながら似たようなVBAを使った物を参考にしています。

  • EXCEL→CSV保存時のダブルクォーテーションについて

    下記のようにEXCELマクロにてEXCELファイルをCSVファイルに保存しようとしています。 NewBook.SaveAs Filename:="test.csv", FileFormat:=xlCSV, CreateBackup:=False このとき、セル値にダブルクォーテーションが含まれていると、出力CSVファイルの値がダブルクォーテーションで囲まれてしまいます。 ●ダブルクォーテーションが含まれていない場合 セル値→A列:ABC     B列:DEF CSVファイル→ABC,DEF ●ダブルクォーテーションが含まれている場合 セル値→A列:A"C     B列:DEF CSVファイル→"A"C",DEF 後者の場合もダブルクォーテーションで囲まれないようにするにはどうすればよいでしょうか。

  • Doubleが返ってくる理由を教えて下さい。

    VBAについて教えて下さい。 セルa1に1と入力して Sub a() MsgBox TypeName(Range("a1").Value) End Sub とすると、Doubleが返ってくるのですが なぜLongや Integerではないのでしょうか? Doubleが一番多くの数字を格納できるデータ型だからでしょうか? (負の値は -1.79769313486231E308 ~ -4.94065645841247E-324 正の値は 4.94065645841247E-324 ~ 1.79769313486232E308 ) よろしくお願い致します。

  • エクセルVBA ダブルクリックした左隣の値を返す方法

    いつもお世話になっております。 あるワークシートにおいて、 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, _ Cancel As Boolean) If ActiveCell.Column = 7 Then Target.Value = "希望" End If End Sub というマクロを記述することができました。 今度は、 G列のどこかのセルをダブルクリックすると、 同じ行のE列の値が、 ダブルクリックしたセルに入るようにしたいのです。 どのような記述をすればよいのか ご教示ください。

  • ダブルコーテーションで3度も囲ってるのですが

    vbsで電卓を起動する時 Set objWshShell = WScript.CreateObject("WScript.Shell") objWshShell.Run """CALC.EXE""" のように、CALC.EXEをダブルコーテーションで3度も囲ってるのですがなんででしょうか? VBAの場合は Sub test() Dim i As Long i = Shell("CALC.EXE") End Sub のように3重には囲わなくても起動します。

  • エクセル マクロ ダブルクリックで…(2)

    たびたび申し訳ございません。 先ほどエクセルでダブルクリックをすると順番に該当セル内の値が「有」→「無」→「空白」 となるマクロをご教授頂き、下記の内容で解決した者です。 B列についての該当セルへの入力がなされるという内容だったのですが、実はC列にも同様の処理を致したく、またもや素人はなすすべが無くなってしまいました。 B列は「要」「不要」「請求」「空白」としたいと思います。 たびたび大変恐縮ですがよろしくご教授くださいませ。 Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("d1:d999")) Is Nothing Then Exit Sub With Target   If .Value = "" Then    .Value = "有"   ElseIf .Value = "有" Then    .Value = "無"   ElseIf .Value = "無" Then    .Value = ""   End If End With End Sub

専門家に質問してみよう