• ベストアンサー

VBA・VB6.0・VB.NETの文字列型

 失礼します。  Excel97/2000のVBAの文字列型変数は、アスキーコード129-159/224-252のデータを保持できないみたいですが、これはVB6.0/VB.NETなどでもそうなのですか?  つまり、VBAでは、 Sub main()  Dim s as String  s = Chr$(130)  Sheet1.Cells(1, 1) = Asc(s) End Sub  とすると、シートのA1に「0」が表示されてしまうということです。  というのも、私はVB6.0/VB.NETを持っていないのですが、ちょっとVB2.0時代のコードを使う必要が生じたので、VBAで実行してみたところ、以上のような仕様の違いに気付いたのです。  これがVBAだけの特性なのか、最近のVBはこういう仕様になってしまったのかが知りたいのです。

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

  • ベストアンサー
  • PAPA0427
  • ベストアンサー率22% (559/2488)
回答No.2

たぶん、コード体系が変わったためです。 VB2.0のころは、Windows3.1やWindows95ですね。コードはシフトJISを使っていました。 現在Windows98以降はEUCという2bytコードをOSが使用してますので、プログラム自体は正しく動作しても、シフトJIS→EUCでは結果が変わりますので、そのようなことになっているのでは? 単純に文字列を設定すれば、自動的に変換がかかるので普通は気づかないのですが、ご質問のように文字コードそのものを設定する場合は結果が違ってきてしまう。という事でしょう。

Ononomiya
質問者

お礼

回答ありがとうございます。 どうやら、文字コードの違いのようですね。マイクロソフトによると、文字列型の内部形式はUnicodeとのことです。と、すると、制御文字が保持できないのも頷けます。 (http://www.microsoft.com/japan/msdn/library/default.asp?url=/japan/msdn/library/ja/vblr7/html/vadatstring.asp) 実は、これに気付いたのは、バイナリファイルの入出力を文字列型で行っていた時なのですが、私と同じ状況を実験してみているページを発見しました。 (http://homepage2.nifty.com/kasayan/vba/binary.htm) マイクロソフトとしては、代わりにByte型を用意したのだから、それを使えということなのでしょう。しかし、バイナリ・テキスト混在のファイルの入出力では、文字列型で一括して扱える方が便利なのですがね。というか、だったら初めからCで書きます、というところでしょうか。

その他の回答 (2)

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

ご存知でしょうが、129-159、224-252は2バイトコード文字(シフトJIS)の第1バイトのコードですね。だから「文字」は割り当てられていないといえるでしょう。エクセルでは=char(18223)やCode("年")(=18223)などの関数表現が可能で(この例は年の文字)す。 Sub test01() s = Asc("年") Cells(15, 5) = Chr(s) End Sub でCells(15, 5) に「年」が表示されます。 Sub test02() MsgBox Asc("年") MsgBox Chr(-27570) End Sub とりとめもないですが、もう少し良く判った方の解説がほしいですね。 エクセル2000、VB6です。

Ononomiya
質問者

お礼

どうやら、文字列型は「文字」に特化してしまったようですね。 バイナリデータを文字列型として扱えると、Instrをかけたり、Midで切り出したり、便利だと思うのですが。それとも、何かこれと同等の事を簡単に実現する方法があるのでしょうか。最近はBasicを触っていないのでよく分からないのですが。 ともあれ、回答ありがとうございました。

  • fantasis
  • ベストアンサー率26% (14/52)
回答No.1

確かVBでも、「・」や「?」になってしまうと思います。

Ononomiya
質問者

補足

回答ありがとうございます。 あの、それは、 text1.text = Chr(130) とすると、テキストボックスの文字が文字化けする、という意味でしょうか。 そうではなく、 s$ = Chr$(130) text1.text = Asc(s$) としても、テキストボックスに「130」ではなく「0」が表示されるのか、という問題なのですが。

関連するQ&A

  • 文字コードに対応する文字が振られていないの?

    windows7を使っています。 エクセルVBAで Sub Sample1() Dim i As Long Dim myRow As Long For i = -32768 To 32767 myRow = myRow + 1 Cells(myRow, 1) = Chr(i) Next i End Sub のコードで文字コードをすべて書き出してみたのですが 空白や「」だけ等がいくつもあります。 これはどうしてでしょうか? 文字コードに対応する文字が振られていないのでしょうか? -32768 To 32767の理由は Asc 関数のヘルプを見たら 「DBCS を使用しているシステムでは、 -32768 ~ 32767 の範囲の値が返されます。」 となっていた為です。

  • VBA 文字列の抜き出し

    VBAで文字列の抜き出しの方法を教えてください。 同様な質問があり、参考にしてみたのですがうまくいきません。 お分かりの方がいましたらご享受お願いいたします。 30~45字からなる文字列があります。 その中に特定の文字列が2つあり、そのうちの最初の特定文字列に続く文字2つ目の特定文字列前までを抜き出したいのですがうまくいきません。 具体的には abcdefghi GN=12jikl PE=fghj456 という文字列のなかから"GN="と"PE="の中間の文字を取り出したいのですが、 自分で書いたものでは"PE="以上が抜き出され、"GN="より前の文字列を抜き出せませんでした。 GN=......, PE=......の文字数はそれぞれ不規則です。また、GN=...よりも前の文字数も不規則です。 以下が作成したものです。 Dim i As Integer Dim Srch As String Dim Btwn As String Const Chr1 As String = "GN " Const Chr2 As String = "PE" Dim m As String Set sheetobj = ThisWorkbook.Worksheets("A") With sheeobj lastrow = sheetobj.Cells(sheetobj.Rows.Count, 10).End(xlUp).Row For i = 2 To lastrow Srch = sheetobj.Cells(i, 10) Btwn = Mid(Srch, InStr(Srch, Chr1) + 1, InStr(Srch, Chr2) - InStr(Srch, Chr1) - 1) sheetobj.Cells(i, 9) = Btwn Next i End With End Sub なにかいい方法があれば教えて頂けたらと思います。 よろしくお願い致します。

  • エクセルVBAのコードを簡単に表現したい

    お世話になっています。 エクセルVBAでコードを書いたのですが、なにぶん初心者のためゴテゴテしたものになってしまいました。 A列にはA2からA11まで15文字以内の文字列が入っています。 同じ行のB列からP列に、濁点も1文字として1セルに1文字づつ抜き出すようにコードを書きました。 以下です。 Sub test() Dim i As Integer Dim m As Integer Dim s1 As Worksheet Set s1 = Sheets("sheet1") For i = 2 To 11 For m = 1 To 15 変換 = s1.Cells(i, 1) 変換 = StrConv(変換, vbKatakana) 変換 = Application.WorksheetFunction.Asc(変換) 変換 = Mid(変換, m, 1) 変換 = StrConv(変換, vbWide) s1.Cells(i, m + 1) = StrConv(変換, vbHiragana) Next Next End Sub そこで質問なのですが、上記のコードをもっとスマートに表現するとどのようなコードになるのでしょうか。(特に「変換」が連なっているところ) よろしくお願いします。

  • VBAで実行時エラー1004が出ます

    VBAで実行時エラー1004が出ます。 「Rangeメソッドは失敗しました。Worksheetオブジェクト」です。 あらゆる可能性を調べたのですが、分かりません。誰か教えて頂けますでしょうか? 下記コードの「Cells(m, 7) =・・・」の部分がエラーになりました。 Sub ボタン1_Click() Dim 現シート As Worksheet ~ 現シート.Activate Cells(m, 7) = WorksheetFunction.VLookup(現シート.Range(現シート.Cells(m, 4)).Select, 現シート.Range(現シート.Cells(4, 104), 現シート.Cells(15, 107)).Select, 4, False) ~ End Sub 何卒宜しくお願いいたします。

  • エクセル2019 VBAについて

    エクセル2019でVBAを使いコピーペーストの勉強中です、次の箇所(Dim i As integr)で、ユーザー定義型は定義されていませんと指摘されて止まってしまします、Sheet("データ")には3行のデータは入っています、VBA初心者のため、この後が、なかなか前に進めません、どうかよろしくおねがいします。 ********************************** Sub 練習() Dim s1 As Worksheet: Set s1 = Worksheets("請求書") Dim s2 As Worksheet: Set s2 = Worksheets("データ") Dim r1 As Integer: r1 = 18 Dim r2 As Integer: r2 = 2 { Dim i As integr } For i = 0 To 2 s1.Range(s1.Cells(r1 + i, 1), s1.Cells(r1 + i, 3)).Value = s2.Range(s2.Cells(r2 + i, 2), s2.Cells(r2 + i, 4)).Value s1.Cells(r1 + i, 4).Value = s1.sells(r1 + i, 2).Value * s1.Cells(r1 + i, 3).Value Next End Sub ***************************************

  • 文字列からASCIIコードの取得方法

    お世話になっております。 やりたいのは、MSCommを使用しデータを送った時、 データのチェックをしたいのですが、Chr関数(値を151を入れる)で作った文字をAsc関数で戻すと値が0になってしまってチェックできません。 文字列で受け取ったデータをどのようにコード変換したらよいでしょうか? VBのバグなのか知りませんけど、 例えば、Asc(Chr$(151))、AscB(Chr$(151))は0を返し、AscB(ChrB$(151))だけが151を返します。 使用しているのは、 VB6SP4 Win2000です。 宜しくお願い致します。

  • VBAで特殊文字を出力したい

    VBAで「"」を出力したいと思っているのですが、 なかなかうまく表示させることができません。 ○サンプルコード Sub SpecialCode() Dim name As Variant name = "ABC"   Cells(1, 1) = name MsgBox name End Sub サンプルコードのname変数を name = ""& "ABC" ""& としても、ワークシートのA1やmsgboxのダイアログ上には ABC と表示されてしまいます。 "がエスケープ文字で、出力する特殊文字の前につければ 表示されることを調べたのですが、なかなかうまくできない状態です。 ワークシートのA1やmsgboxのダイアログ上には "ABC" と表示される手順を教えていただければと 思っております。 以上です。

  • セルが何行なのかをVBAで取得したい

    セルが何行なのかをVBAで取得したいのですが どういうコードにすればいいですか? 例えば、A1セルに a b c と入ってる場合、3行ですが それをVBAで取得するにはどうすればいいですか? Sub test() Dim r As Range Set r = Cells(1, 1) If r.Value Like "*" & Chr(10) & "*" Then MsgBox "改行があります" End If End Sub というコードで改行が有ることは取得できたのですが 何行かまでは取得する方法がわかりません。

  • VB.net(2003)でのexcel操作

    現在vb.netを使用してのExcelそうさプログラミングを作っており、excel sheetへの文字入力はできるようになりました。そこで質問なのですが、excelシートの特定のセルの値が5だった場合にその隣のセルのあたいを10にするというプログラムを作りたいのですが、VBAではとても簡単なのですが、vb.netを使用してどのようにやればよいかがわからないのでご教示いただきたいです。activecell.offset(0,1)やcells.findのような、VBAをVB.netから使用する方法はあるのでしょうか?

  • VBA 複数の文字のコードを一気に返すには

    Sub test1() Dim myStr As String myStr = "abc" Debug.Print Asc("a") Debug.Print Asc(myStr) End Sub このコードは、どちらも97が返るのですが、 myStrは3文字です。 3文字全ての文字コードを返すには、 Sub test2() Dim myStr As String myStr = "abc" Debug.Print Asc(Mid(myStr, 1, 1)) & Asc(Mid(myStr, 2, 1)) & Asc(Mid(myStr, 3, 1)) End Sub のようにするしかないのでしょうか?

専門家に質問してみよう