• ベストアンサー
  • 暇なときにでも

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はこういう仕様になってしまったのかが知りたいのです。

共感・応援の気持ちを伝えよう!

  • 回答数3
  • 閲覧数975
  • ありがとう数3

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

  • ベストアンサー
  • 回答No.2

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

共感・感謝の気持ちを伝えよう!

質問者からのお礼

回答ありがとうございます。 どうやら、文字コードの違いのようですね。マイクロソフトによると、文字列型の内部形式は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で書きます、というところでしょうか。

関連するQ&A

  • 「VB6」、「VBA」、「VB.NET」と仲間分けするとしたら

    VBとVBAを勉強中です。 コードの書き方で仲間分けをするとしたら ・「VB6」、「VBA」  ・「VB.NET」 という感じでしょうか?

  • 今から始めるとしたらVB6とVB.NETとどちらを買えばいいでしょうか?

    VBAを少しやっています。 VBに挑戦したいのですがVB6とVB.NETとどちらを買えばいいでしょうか? VB.NETの方が新しいけど難しいと聞いております。 よろしくお願いします。

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

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

その他の回答 (2)

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

ご存知でしょうが、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です。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

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

  • 回答No.1

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

共感・感謝の気持ちを伝えよう!

質問者からの補足

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

関連するQ&A

  • 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 なにかいい方法があれば教えて頂けたらと思います。 よろしくお願い致します。

  • ☆文字列を抜き取る★

    テキストファイルに GetPoint = ErrMsg("おはよう",target) の行があるとします。 ダブルクオートでくくられた文字列だけを出力させたい場合 下記コードでどこが間違っているでしょうか?? 今のままだと全てのコードが出力になるんですよ。。。 アドバイスをいただけると幸いです。 Sub Main() Dim iFileNumber As Integer iFileNumber = FileSystem.FreeFile() Open "C:temp\sample.txt" For Input As #iFileNumber Dim stResult As String Dim stSerch As String Dim point As Long Do While (Not FileSystem.EOF(iFileNumber)) Dim stBuffer As String Line Input #iFileNumber, stBuffer stResult = stResult & stBuffer & vbNewLine If Instr(stResult,Chr(34)) > 0 Then If Instr(stResult,Chr(34)) > 0 Then v = stResult End If End If Loop Close #iFileNumber End Sub

  • 文字列を配列に…。

    VBはまだ始めたばかりで本当に初歩的なことかもしれませんが分かる方がおられたら是非教えて下さい。 text1.textから取り込んだ文字列を”一文字ずつ”(Dim a(100) as stringで宣言した)配列に格納したいのですがどうしたらいいのでしょうか?? <例>text1.textに"abc"と入力しcommandbuttonを押すとa(0)に"a"がa(1)に"b"がa(2)に"c"が格納されるといったかんじです。 ちなみに今私がしたいのはtext1.textに、ある文字列を入れその文字列を文字コードに変換しそれを一文字分ずつ+1してまたそのコードを文字に直しtext2.textに出力するというものです(ようは簡単な暗号化ですね)。 私はAscとChrコマンドを利用して1文字ずつコードをずらしていこうと思っているのですが、他に良い方法などあるのでしょうか?? 本当に初心者でどのようにしらたよいのか分かりません…。 どなたか分かりやすく教えていただけませんでしょうか?? お願いします。

  • VB6とVBAのマクロのアクセス方法を教えてください。

    VB6とVBAのマクロのアクセス方法を教えてください。 用途は、 (1)VB6からVBAマクロを起動する。 (2)VBAマクロの途中経過をVB6のオブジェクトへ通知する。 VBAはPC外部接続機器をコントロールします。 VB6での実装サンプルが用意されていない為、VBAを使用しております。) (3)VB6は通知結果を、拾って別ルーチンの処理を実行する。 (1)では、下記の様な方法にてマクロ実行を考えていたのですが、 マクロが終了するまで、次コードへ移らない為、 シェル関数の様な形でマクロをキックしたい。 xlApp.run ("VBA_TEST(" & Chr(&H22) & strarg & Chr(&H22) & " )") (2)では、VBAとVB6と平行に実行したい為、フラグをやり取りするのに、 VB6のオブジェクトを使用したい。

  • 最近のVisual StudioでVB6の開発は可能ですか?

    VBAの仕様経験はありますが、VBは素人です。 VB6で開発されたprogramを利用して、program開発するのですが、 現在のVisual Studio2007で、VB6を利用した開発はできますか? VB.netは空くまで.net仕様でしかできないのでしょうか? また、できるとしてもかなり複雑になりますか? 利用するDllがC++baseのものがあったら、 C++.net経由で使うのは容易いですか? VCの経験はありますが、 あまりいろいろな方法を覚えないといけないのは大変なので、 適切な方法があれば教えてください。

  • 結合した文字列をファイル名に使えない

    Excel上に入力されているパス名とファイル名のデータを組み合わせて、 様々なファイルを開いたりコピーしたりするVBAのコードを作ろうとしています。 仮にシート上のA1セルに、C:\Documents and Settings\デスクトップ というパス名 A2セルに URIAGE.xls というファイル名が入力されていたとして、 A1の文字列データとB1の文字列データを結合する場合、 Sub FileSousa()  Dim a As String  Dim b As String  Dim c As String  a = Cells(1, "A").Value  b = Cells(2, "A").Value  c = Chr(34) & a & "\" & b & Chr(34)  Range("A3") = c としてみると、確かにA3セルには、"C:\Documents and Settings\デスクトップ\URIAGE.xls" と出力され、文字列が結合されたことがわかるのですが、その変数cのデータを使って  Workbooks.Open Filename:=c として、そのファイルを開こうとすると、ファイル名が見つからないとしてエラーになります。 ファイルはデスクトップ上の確かにその名前で存在しており、直接 Workbooks.Open Filename:="C:\Documents and Settings\デスクトップ\URIAGE.xls" とすると開きます。 " を Chr(34)によって入力したのがいけないのでしょうか、 Workbooks.Open Filename:=××× には、変数を置いてはいけないのでしょうか。 そもそも文字列の結合は、"あ" & "い" → "あい" となるのが基本だと思うのですが、 a="あ"、b="い"、c=a&b → c="あい"として結合した変数cについては、ファイル操作上のファイル名の設定項目として使えないのでしょうか。

  • VB6のTYPE文をVB.NETのStructureに変えるとき

    VB6のTYPE文をVB.NETのStructureに変えるとき 下記VB6のコードをVB.NETのStructureに変える場合 Type kouzou1 i As Integer j As Integer a As String * 20 b As String * 50 End Type を下記にしてみたのですが *20,*50のところは、どのように表現するのでしょうか。 Structure kouzou1 Dim i As Integer Dim j As Integer Dim a As String * 20 <- ステートメントの終わりを示してくださいのエラーになる。 Dim b As String * 50 <- ステートメントの終わりを示してくださいのエラーになる。 End Structure お教え下さい。

  • VBAからのVB.NETかC#

    本日エクセルVBAエキスパートのスタンダードを取得いたしました。 仕事で半年ほどVBAをチョコチョコ使う機会があったので、 最初のうちはWEBで調べてコードを切り張りして 簡単なツールを作っておりました。 それで9月のはじめに折角だし資格を取ろうと思い 現在に至っております。 転職を考えており、もう少しプログラムを勉強しようと思っています。 次はVB.NETかC#をと考えているんですが、 どちらがいいでしょうか。 個人的な目標としてはWINDOWSのPC上でGUIで動く ヤフオクの出品ツールが作れるぐらいを考えています。 それでご相談なのですが、VBとVB.NETはかなり違うとのことですが VBAを学んでいるとC#に比べVB.NETは多少は習得し易いでしょうか。 VBAが習得の上で何のアドバンテージにもならないのであれば、 人気のC#にしようかと思っています。 ちなみに今の職場にいる限りVBA以外のプログラムをする機会はありません。 恐れ入りますが回答をお願いいたします。

  • VB6から新しいvbに切り替えたい。

    現在、会社でvb6.0を使用しているものです。 いいかげんVB6は古いので、新しいVBに切り替えたいと思っています。 使用しているパソコンはXPで、メモリ512MBでHDが80GBと言ったところです。最新のVB2008とかどうなんでしょうか? VB6とVB2008で、コードの記述方法などで注意点などありましたらご指導お願いします。かなり違うとは思いますが・・・ それと、1台のPCで、VB6とほかのVB(vb.net以降)は共有できるのでしょうか?詳細のご指導お願いします。

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

    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 のコードで文字コードをすべて書き出してみたのですが 空白や「&#63731;」だけ等がいくつもあります。 これはどうしてでしょうか? 文字コードに対応する文字が振られていないのでしょうか? -32768 To 32767の理由は Asc 関数のヘルプを見たら 「DBCS を使用しているシステムでは、 -32768 ~ 32767 の範囲の値が返されます。」 となっていた為です。