• ベストアンサー

Excel VBA の文字列連結演算子 &

 変な質問で申し訳ないのですが・・・  Excel VBA の文字列連結演算子 & は   Dim St As String   Dim No As Integer   St = "来年は"   No = 2020   Range("A1").Value = St & No とすれば St & No は確かに "来年は2020" という文字列になります。本来ならば   St & Str(No) とすべきだと思いますが、なぜこんな仕様にしたのでしょうか?  また、ベースとなった VB.NET も同じ仕様なのでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • mitoneko
  • ベストアンサー率58% (469/798)
回答No.1

 これを、「暗黙の型変換」といいます。  本筋は、St & Str(No) です。この時、Str(No)は、Noという数値を文字列に明示的に「型変換」しています。  一方、文字列の連結演算子、「&」は、この演算子の左辺・右辺ともに、絶対に文字列でないといけません。ですから、&の左辺や右辺に何かが来たら、これは必ず文字列です。というわけで、ここに文字列以外のものが指定されると、自動的に、文字列に変換しようとします。型変換を指定していませんので、これを「暗黙の型変換」と呼びます。  もう一つ事例をあげましょう。よく見るパターンのはずです。  Dim f As Double  Dim ret As Double  Dim i As Integer  f=1.23456  i=3  ret = f + i  とやります。この場合、+の両辺は同じ数値型である必要があるので、まず、iをDoubleに型変換しようとします。(もし、fをIntegerに変換すると、小数点以下の数値が失われるので、このような変換はしません。)そして、足し算の結果は、Doubleとなります。  また、  Dim f As Double  f=3  なんてのもよく見ますね。3は、Integerです。でも、fがDoubleだから、Doubleに自動的に型変換します。  と言った具合に、指定しなくても、「明らかに」変換されるべきと考えられる場合は、勝手に言語が型変換をします。  VBに限らず、他の言語でもよく見られる挙動です。ただし、この暗黙の型変換は、実は、どんな場合に発生するかは、厳密に定義されています。されているんですが・・・こんな規則は覚えるものではありません。(覚えられるような気もしませんし。)  よほど、明らかな場合以外は、明示的に型変換するほうが、お行儀の良いプログラムと思っておいてよいかと思います。特に、その場における型がプログラムの挙動に影響を与える場合は、なおさら、明示的に型変換すべきです。

musume12
質問者

お礼

丁寧な回答まことにありがとうございました。スッキリいたしました(笑)。

その他の回答 (1)

  • wormhole
  • ベストアンサー率28% (1619/5653)
回答No.2

>また、ベースとなった VB.NET も同じ仕様なのでしょうか? 本題とは関係ありませんが VBAのベースとなっているのはVisual Basic 6で、 VB.NETではないですよ

関連するQ&A

  • vb6のstringについて256文字以上連結

    Dim str as String Dim intloop as Integer For intloop=0 TO 19 str=str+"work joint“+intloop Next intloop 20個分の文字列が連結されません。 どのようにすればよろしいでしょうか?

  • +演算子で文字列を連結できるのは何故?

    JAVAを勉強中に疑問に思ったので質問します。 JAVAでは演算子のオーバーロードができないと思いますが、 +演算子で文字列の連結できるのはどのような仕組みなんでしょう? Stringだけ特別なんでしょうか?

    • ベストアンサー
    • Java
  • 文字列比較の演算子

    Perl の世界から PHP にやってまいりました。 Perl では、文字列の比較には専用の演算子がありまして、 str1 eq str2 とすると、二つの文字列が同値かどうか調べられますが、PHP にはこのような演算子はないのでしょうか? www.php.net のマニュアルを見ても、そのような演算子がありません。 == 演算子が使えるものかと <?php $str1 = "this is string" ; $str2 = "this is string" if( $str1 == $str2 ) { echo "two string is same" ; } ?> などを試してみるとうまくいくようですが、www.php.net のマニュアルには「文字列を数値化して比較する」と書いてあり、本当に文字列比較が出来るか確信がもてず…。 結局、文字列を比較したいときには strcmp を呼び出していますが、これは PHP 的には正しいのでしょうか?

    • ベストアンサー
    • PHP
  • ソフトウェアキーボード使ってテキストボックスの文字列末尾に文字列追加

    VB.NET WindowsMobile5.0にて開発してます。 A~Z、0~9までのソフトウェアキーボードをボタンコントロールで配置して作成してます。(WindowsMobileのPADではない) テキストボックスに各ボタンクリックイベント(A~Z、0~9)毎に文字列を連結させながら表示させたいのですが 文字列の末尾に文字を追加したい場合どうすれば良いでしょうか? 各画面にソフトウェアキーボードがあるので ファンクションを使ってクリックがある度に末尾に文字を追加していきたいので下記の様に書きクリックイベントで呼ぼうとしましたが駄目でした。 Public Function TextInsert(ByVal TI As Char) Dim str1 As String Dim str2 As String str2 = str1 '前回文字列保存 str1 = TI  '今回文字列格納 str1 = str1 & str2 '文字列連結 Return str1    '結果を戻す End Function なにかもっと簡単で良い方法ありませんか? ものすごく初歩的なことで申し訳ありませんがご教授お願いします。

  • エクセル 文字列連結演算子で文字列を結合

    文字列連結演算子の「&」 を使って文字列を結合し、その間に()を投入したいです。 A列   B列  C列        D列 高橋太郎 東京  文字連結演算子  高橋太郎(東京) C列 =A1&(B1) ではエラーがでます。正しい書式を教えてください。 A列    B列  C列   D列  E列        F列 高橋太郎 (    東京   )  文字連結演算子   高橋太郎(東京) E列 =A1&B1&C1&D1 ってのは分かるのですが、もっとスッキリするものはないでしょうか? 宜しくお願いします。

  • Excel VBAの文字列と数値の分類

    txtファイルで取り込んだ2行にまたがっている数値・英文字・ひらがななどを、数値だけのtxtファイルとそれ以外のtxtファイルを別々に作成し、保存するプログラムを組みたいのですが、よく分かりません。 ちなみに、使っているOSとAPはWinXP、Excel2003です。 InputData.txtの内容 A34bFg7p0 あ 1ylut890 B45LK4L え Number.txtの完成形 34701890454 String.txtの完成形 AbFgp あ ylutBLKL え '変数の宣言 Dim myFile As String Dim CC As Integer Dim XX As Integer Dim WW As Variant Dim str As String Dim tempStr As String Dim B As String Dim C As String myFile = Dir("InputData.txt") 'ファイルの読み込み If myFile = "InputData.txt" Then Open myFile For Input As #1 Do While Not EOF(1) Input #1, myText Loop '書き込みファイルの作成 Open "Number.txt" For Output As #2 Open "String.txt" For Output As #3 '数字・文字列の分類 CC = Len(myFile) For XX = 1 To CC str = Mid(myFile, XX, 1) If str >= 0 And str <= 9 Then B = B & str Else C = C & str End If Next Print #2, B Print #3, C Close #1, #2, #3 'エラーメッセージの表示 Else MsgBox "ファイルは存在しません。" End If ここまでやっている状態です。よろしくお願いします。

  • .NET 文字コードの変換

    VB2008で文字列を他の文字コードにする方法が知りたいです。 何かしての部分がわかりません。 VB2005でも使えるものだったらうれしいです。 Dim str_sjis as string Dim str_euc as string = "パソコン" '例えばEUC-JP '''何かして str_sjisにシフトJISで文字列が入っている。 .Netの文字コードの変換の仕方がごちゃごちゃして分かりづらいです。

  • 【VBA】ユーザ定義関数が動かない

    【VBA】ユーザ定義関数が動かない 下記のようなプログラムをVBEの標準モジュールに記述して、 ワークシートの適当なセルに「=tc("aa","bb")」と入力してEnterを押した所 セルの表示が「=tc("aa","bb")」となってしまい狙った効果が得られません。 本当は、「aabb」と表示させたいのですが、なぜうまくいかないのでしょうか。 ご教授願います。 ◆関数の仕様  引数1と引数2に入力された文字列を連結して返り値として返す。 ◆コード Function tc(str1 As Range, str2 As Range) As String Dim Str As String Str = str1.Value & str2.Valuett tt = Str End Function

  • マクロ(VBA)での文字列操作

    こういうことできますか? Dim str as String str = Cells(1, 10) Length = Find("会計", str) つまり、エクセル上のセル内の文字列を取ってきて、 会計という文字列を含む場所が何文字目か知りたい。 ところが、Find関数か認識されずエラーが出ます。 Searchにしても同じです。 エクセル関数としては使えるのですが、マクロでは使えないのですか?

  • VBA 文字列と数値の混在

    Excel VBA 独学中の初心者です。独学中の初心者です。 データ型に関する以下の疑問についてお答えいただける方、よろしくお願い致します。 疑問1.「文字列 & 数値」でエラーにならず、結果は文字列になるようですが、これはVBAの規則上当たり前のことでしょうか。 疑問2.InputBox関数の戻り値は、Typeを省略した場合文字列と思いますが、これを数値型の変数に代入してもエラーは発生しませんでした。これも当たり前のことでしょうか。 具体例は以下です。 ------------------ Option Explicit Sub 文字列と数値の疑問() '初期設定 Cells.Clear Range("A1").Select '本題はここから Dim i As Long Dim j As Long Dim strRange As String Dim strInput As String '------------------ '疑問1の例 i = 2 strRange = "A" & i '疑問1:文字列と数値変数(長整数型)を文字列連結演算子で連結してもエラーにならない。・・・なぜ? '結果は1つの文字列→strRange ="A2" '例 Range(strRange).Select '動作OK Range(strRange) = i '動作OK '------------------ '疑問2の例 strInput = InputBox("選択行を入力してください", , "4") 'strInputは文字列型変数 j = strInput '疑問2:数値変数(長整数型変数)に文字型変数を代入してもエラーにならない・・・なぜ? '結果は長整数型変数(数値) j=4 (Input BOX をデフォルトでOKしたとき) '例:以下の両方とも動作OK '1) strRange = "A" & strInput '文字列 & 文字列 →文字列 strRange ="A4";疑問なし Range(strRange).Select '動作OK Range(strRange) = strInput '2) Cells.Clear '確認用にクリアスクリーン Range("A1").Select '確認用にセル位置移動 strRange = "A" & j '文字列 & 数値 →文字列 strRange ="A4";疑問1と同じ Range(strRange).Select '動作OK Range(strRange) = j '動作OK End Sub

専門家に質問してみよう