VBA 文字列と数値の混在に関する疑問

このQ&Aのポイント
  • VBAで文字列と数値を組み合わせた場合、エラーにならず結果は文字列になります。
  • InputBox関数の戻り値は文字列であるが、数値型の変数に代入してもエラーは発生しません。
  • これらの挙動はVBAの規則上当たり前のものです。
回答を見る
  • ベストアンサー

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

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

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

コンピューターデータの基礎論で言えば、データ型は、処理に一番大切なものです。 しかしVBAの元のBasic言語のBはBiginnersのBです。型を詳しくチェックして、エラーをたくさん指摘して出し、初心者に面倒だな、と思わせるより、コンパイラーに当たるシステムの方で、頻度の多そうな線を規定値として(変換)しまう方法を選んだのだと思います。あくまで初心者に近い小生の考えですが。 またオブジェクト指向のプログラミングでは、当初に変数の型を、Defautで決めやすい仕組みであることも、それを助けていると思います。  文字列と数字を&で結合した場合は文字列に扱うのは、知っておく必要があるでしょう。逆手に取って、シートのセルの指定で、頻繁に使わせてもらっています。例 Range("A" & i)(iは正整数数字) 文字列と数字の+は&と同じ扱いです。加算ではない。 エクセルシートでの、数字全角文字列と半角数字の加算は、やってみると、前者を半角数字の扱いで加算されました。 こういう思想が底に流れていると思います。 ーー こういう質問を発想するのは、質問者は、他言語をすでに、かじった人かもしれないですが、それでなぜと思うのかもしれないですが、VBA(VB6.0がベース)での、いろんなケースを経験する(データのチェックを入れる)ほかないように思います。自分以外がエクセルを使う場合のVBAなどで、開発の場面などでは、チェックを厳密にして、思わぬ方に処理されないようにチェックする必要があると思います。 ーー もうひとつ、Inputbox、TextboxなどBoxの付いたものは、応答は文字列を返すのが標準と考えた方がよい。数字扱いしたいなら、変換を心がける。

helpokwave
質問者

お礼

丁寧なご回答ありがとうございました。よくわかりました。またRange("A" & i)が使えるとなるとFor文の中で容易に使えそうで利用度が上がるように思います。列方向も使えるともっと良いのですが。経験のない私にとってはご回答により安心感が出てきました。ありがとうございました。

その他の回答 (3)

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.3

先ほどの最後にリンクがありますがこちらも参考にしてください。 VBA 数値を変換する https://www.tipsfound.com/vba/04007

helpokwave
質問者

お礼

先ほどと同様、ありがとうございました。今後の参考にさせていただきます。

  • kkkkkm
  • ベストアンサー率65% (1618/2457)
回答No.2

参考にしてください VBA 文字列を変換する https://www.tipsfound.com/vba/04004

helpokwave
質問者

お礼

有益なURLありがとうございました。『特別な操作をしなくても、整数型に数字を代入すると自動的に変換されます』等あるので私の疑問の点も自動変換と理解しました。明示的に変換する時の関数も一覧がありますので今後参考にさせていただきます。

  • asuncion
  • ベストアンサー率33% (2126/6288)
回答No.1

>「文字列 & 数値」でエラーにならず、結果は文字列になる 型の混在を開発者が気にしなくてもいいように、そういう仕様にしているんだと思います、たぶん。

helpokwave
質問者

お礼

迅速なご回答ありがとうございました。Excelは自動変換してくれることが多いのできっとそうなのかもしれませんね。結果オーライというこで考えようかと思います。

関連するQ&A

  • (VBA)文字列を指定位置から抜き出す

    Office2019,Windows10 文字列の指定位置から文字列の最後までを抜き出すコード(文字列())を作成しました。 現在は、指定文字列位置を指定するのに目で数えて指定しますが  数え間違えが多いのでミスを少なくする方法を検討しました。 以前教えてもらったコード(Nubering3())が利用したいのですが、 イメージだけでどうしたらいいか分かりません。 イメージとしては、  1)range(A1)の文字列で添付画像のような画像を表示して、   画像の下部に「どこから? 数値を入力してください」と表示して   抜き出し開始位置の数値を入力する   添付画像のように文字数が多くなると行が長くなるので    40文字毎に改行されて表示させる    (改行が難しい場合は、それに代わる方法でもOKです。)  2)数値が入力されれば、最初の画像(のような)は消えて     B列に抜き出し結果が表示される。 ---------------------------------------------------------------- Sub Mid文字列() Dim MojiSuu As Single Dim KokoKara As Variant Dim I As Single Dim Nukidashi As String Dim EndRow As Single EndRow = Cells(1, "A").End(xlDown).Row KokoKara = Application.InputBox(prompt:="どこから? 数値を入力してください", Title:="数値入力", Type:=1) If TypeName(KokoKara) = "Boolean" Then MsgBox "数値以外が入力されたので終了します。" Exit Sub End If For I = 1 To EndRow MojiSuu = Len(Range("A" & I)) Nukidashi = Mid(Range("A" & I), KokoKara, MojiSuu) Range("B" & I) = L Next I End Sub --------------------------------------------------------------- Sub Nubering3() Dim Ws1 As Worksheet, Ws2 As Worksheet Dim i As Long, j As Long, WRow As Long Dim uRows As Range, uRange As Range Set Ws1 = Sheets("DATA") Set Ws2 = Sheets("Number") Set uRows = Ws2.Rows(1) Set uRange = Ws2.Range("A2") 'Numberシートの初期化(全体=数式・文字・書式・コメント全てをクリア) Ws2.Range("A1:XX100").Clear Application.ScreenUpdating = False For i = 2 To Ws1.Cells(Rows.Count, "A").End(xlUp).Row WRow = Ws2.Cells(Rows.Count, "A").End(xlUp).Row + 1 If Ws2.Range("A1").Value = "" And WRow = 2 Then WRow = 1 End If Set uRows = Union(uRows, Ws2.Rows(WRow)) For j = 1 To Len(Ws1.Cells(i, "A").Value) Ws2.Cells(WRow, j).Value = j Ws2.Cells(WRow + 1, j).Value = Mid(Ws1.Cells(i, "A").Value, j, 1) Set uRange = Union(uRange, Ws2.Cells(WRow + 1, j)) Next Next i 'Numeling 大文字、中央揃え uRows.HorizontalAlignment = xlCenter uRows.Font.Bold = True '分割文字中央揃え罫線外枠 uRange.HorizontalAlignment = xlCenter uRange.Borders.LineStyle = xlContinuous 'セル幅を見やすく Ws2.Range("A1:xx100").ColumnWidth = 3 Application.ScreenUpdating = True Ws2.Activate Set Ws1 = Nothing Set Ws2 = Nothing Set uRows = Nothing Set uRange = Nothing End Sub

  • VBAで文字列を数値に変換したい

    A列とE列の文字列になってしまった数値を 数値に変換したく、以下のようなものを作ったのですが、 文字の無いセルまで、数値に変換しようとするので 時間がかなりかかります。 何かよい方法は無いでしょうか? よろしくお願いいたします。 Sub 数値に変換() Range("A:A,E:E").Select For Each xCell In Selection xCell.Value = xCell.Value Next xCell End Sub 使用ソフトEXCEL2000orEXCEL2003

  • VBA 別シートのセルから、文字列を参照するには?

    Excel VBAに於いて 同BOOKのSheet1から、Sheet2の文字列を変数に入れよとするとエラーになります。 何故でしょうか。 また、その対処法を、御教示ください。 Dim objWBK As Workbook Dim objSH As Worksheet Set objWBK = ThisWorkbook Set objSH = objWBK.Sheet2 Dim cnsFILENAME As String cnsFILENAME = objSH.Range("a4")     ← ここで、「オブジェクトは、このプロジェクトでサポートされていません。」と、エラーメッセージが出る。 Sheet2.Range(”A4”)には、文字列を入れてある。 以上、よろしくお願いします。

  • VBAで数値を文字列にして入力したい

    Range("A" & X).Value = Year(Date) Range("B" & X).Value = Right("0" & Month(Date), 2) このVBAでは セルの書式指定で文字列にしても 文字列の指定を外すと数値に戻ります。 でも、文字列の設定を外したら 数値に戻らないものもあり ピボットテーブルで集計した時に 同じ「2013」が2種類存在してしまいます。 どうしたらいいですか?

  • Excel collectionについて VBA

    Dim Mydata As New Collection Dim i As Long Dim EndNumber As Long On Error Resume Next 'データを登録する間、エラーを無視する For i = 2 To EndNumber '2行目から最終行までチェック Mydata.Add Range("J" & i).Value, Range("J" & i).Value 'J列のデータ取得 Next i On Error GoTo 0 i = 1 For Each A In Mydata Worksheets("Sheet1").Range("A" & i).Value = A i = i + 1 Next A 現在見ているシートの重複しない項目を 別シートに書き込みしているプログラムになります。 様々なサイトを参考にさせて頂き、 上記のような結果になり、 文字列は取得できるようになりました。 しかし、もとになるデータがある位置に(例は、J列) 数値が入っていると上手くコレクションに入ってくれません。 J列に文字列(りんご、ごりらなど)が入っている場合は 重複しない項目がコレクションに格納されていきます。 J列に文字列(0,1)が入っていた場合、 重複しない項目もなにも無く、 ローカルのMydataの中には<変数無し>とありました。 このプログラムの何処を直せば、数値をコレクションとして取得できますか? ちなみに、EndNumberには最終行の数値が入っています。 >Mydata.Add Range("J" & i).Value, Range("J" & i).Value 'J列のデータ取得 .valueを.stringにしても効果はありませんでした。 回答よろしくお願いいたします。

  • VBA 文字列をキレイにしたいです。

    エクセルVBAでツールを作成しようとしています。 他のソフトで作成したデータなども関連するため、セルの中の文字列の先頭にシングルコーテーションが付加されてしまうケースがあるのですが、これが不要なので外したいと思います。 方法を検索した結果、以下の例を見つけました。 ---- 「'」を削除したいセルを選択してマクロを実行すると、 すべてのセルで先頭の「'」を削除します。 Sub Sample() Dim a As Range For Each a In Selection If Not a.HasFormula Then a = a Next a End Sub ---- 上記の方法だとセルを対象にしていると思うのですが、 プログラム上でセルの中身を既にstring型の変数に入れているのでその変数を用いて実現したいと考えていますが、書き換え方が分かりませんのでご教授いただけたらと思います。 宜しくお願い致します。

  • VBAでワイルドカードを使った文字列検索

    初めて投稿いたします。 環境は、WinXP Access2000 下記のVBAモジュールで、文字列検索がヒットしません。 数字の比較でヒットするのはナゼでしょうか? ちなみに、変数に導入したのは、全角半角どちらも入れてみました。 この疑問・・・どなたか解決お願いします。 Sub TEST() Dim AAA As String Dim BBB As String Dim YYY As String AAA = "0" BBB = "2" YYY = AAA & BBB Select Case YYY Case "0*" MsgBox "ココを通り過ぎないで!" Case "15" MsgBox "やったね" Case Is > 0 MsgBox "なぜかココでヒットします??" End Select End Sub

  • エクセルVBAで、Dim A As StringとA$

    変数を使用するにあたり、 Dim A As String A=Sheets("Sheet1").range("A1").Value MsgBox A という記述方と、 A$=Sheets("Sheet1").range("A1").Value MsgBox A$ という記述は同じ意味だと思うのですが、何か違いがあるのでしょうか? Stringなら「$」、Integerなら「%」で、いちいちDimで整数か文字列かを指定しなくていいだけ簡単だと思うのですが、わざわざDimを使う意味は何なのでしょうか?

  • VBA 4桁の文字列にするには

    お世話になっております。 相変わらず初心者です。また質問させてください。 基本的なことが原因でしたら大変申し訳ありません。 E列(添付の「番号」列)を4桁の文字列にしたくて、 下記のように組んでみたのですが、 家のPCで実行すると問題なくE列が4桁の文字列:333だったら0333 になるのですが、 友人のPCで実行すると4桁の文字列:333のとき、実行後も333のままです。 何が原因なのかまったくわからず、途方にくれています。 どうすれば無事に動くのかどなたか教えてください。 With ActiveSheet.Range("A1").CurrentRegion Dim i As Long For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row .Range("J:J").NumberFormatLocal = "@" .Cells(i, 10) = Format(.Cells(i, 5), "0000") .Cells(i, 5) = .Cells(i, 10) Next i End With

  • Val関数をVBAで使うには?

    助けてください VBA初心者です Excel VBAでA列の4からj行目までの文字列(例:"12345678” 8桁固定)、k行目までの数字以外の文字列(例:AB12345678 9桁以上ある)のうち、j行目までの文字列をVal関数で数値に変換したいのですが、どうやっていいのか分かりません j+1行目からk行目までは数字以外の文字列が入っています 1セルだけの変換はできます(例:A4セルに"12345678”がある場合、Val(range("A4"))で12345678が出ます) ※仮にj=98と固定しました Sub Value_num() J = 98 'A列を値→数字に変換 Columns("A").Select 'Range("A4").Value = val(Range("A4")) これは動く Range(Cells(4, 1), Cells(J , 1)).Value = val(Range(Cells(4, 1), Cells(J, 1))) 'これが動かない End Sub

専門家に質問してみよう