表題の件で不思議な定数についてお尋ねします。

Type ex
sample As String * 20
End Type

として、sampleに5文字(あいうえお)を代入し、ランダムファイルに書き出します。

書き出したデータを、変数hogeに代入し印刷します。
すると、「あいうえお・・・・・」と印字されます。
後ろの5つの「・」と変換後の空白が必要ないので、

Trim(StrConv(hoge,vbansi))

としてその後もう一度印刷します。
今度は「あいうえお」と印刷され「・」が印刷されません。
このときの定数「vbansi」は実在する定数でしょうか?
いろんなプログラムで、私はこの「vbansi」を使うのですがヘルプで調べても「vbansi」なる定数はどこにも見当たりません。
実は、たまたま変換のときにこの「vbansi」定数を使っただけなのです。
しかしながら、この「vbansi」を使わないと「・」が印刷されてこまります。
おまけに、Option Explicit を挿入すると、「vbansi」でエラーになります。

このQ&Aに関連する最新のQ&A

A 回答 (2件)

まず参考URLを見てください。


定数にvbAnsiなるものはありません。

>あいうえお・・・・
の「・・・・」部分はおそらくvbNullCharではないでしょうか?
それをStrConv(hoge,vbAnsi)としたために、「あいうえお」は本来はエラーなのですが、未処理状態で出力、そしてvbNullChar部分もエラーなのですが、VBは文字列は基本が2バイトなので、1バイト文字のvbNullCharが自動的に省かれたのだと思います。

Replace(hoge, vbNullChar, "")

としてみては?

参考URL:http://www.microsoft.com/JAPAN/developer/library …
    • good
    • 0
この回答へのお礼

遅くなりましたが、お返事有り難うございます。

>定数にvbAnsiなるものはありません。
そうなんです。MSDNにもないし、どこを探してもなかったのでどうなのかな?って思ってました。
しかし、「本来はエラー」なのになぜエラーが出ないのか、またまた不思議です。
全てVBの自動変換なのでしょうか。
下にも書きましたが、StrConv(hoge,0)とした場合に同じ結果になって、数値の0以外を入れてみるとエラーになるのも不思議です。

このままだと、動作が不安定な部分もありますので、教えていただいたReplace(hoge, vbNullChar, "") を使うことにします。

まだまだ勉強が足りない私です。
でも「なるものはなる」という考え方が嫌いで、なぜそうなるかを納得いくまで考えてみたい性分ですので、今後ご迷惑をおかけするかもしれませんが、宜しくお願いします。

お礼日時:2001/12/07 10:02

Trim(StrConv(hoge,vbansi))



の部分ですが、おそらく vbansi は値が 0 の Variant 変数として処理されていると思われます。つまり、StrConv() 関数では何も処理されていないのではないでしょうか?

Trim(hoge)

のみだと、結果はどのようになりますか?

ちなみに、ASCII などに変換する場合の StrConv() 関数の第 2 引数は vbFromUnicode だったと思います。

この回答への補足

お返事有り難うございます。
Trim(hoge) のみで印刷すると、「あいうえお・・・・」となります。
Trim(StrConv(hoge,vbFromUnicode))だと、数字以外の文字は読めません。
私もOption Explicit を挿入してエラーになるので 「vbansi は値が 0 の Variant 変数」かな(もちろんプロジェクト、モジュール、プロシージャのいずれでも宣言していません)?と思い数字の「0」を入れてみたところ、「あいうえお」と印刷されます。
しかし、数字の「0」以外ではまったくだめです。
とてもとても不思議な感じがします。

補足日時:2001/12/03 09:36
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

QStrConv関数について

VisualBasicのバージョン6を使っています。

Dim d() As Byte
d = StrConv(" ", vbFromUnicode)

このようにStrConv関数を使ったあと、変数のd
は、redim d(0)として、解放する必要があるのでしょうか?

また、d()で定義した場合、大きさが不定ですが、いくらまでの添え字が入るのでしょうか?

VB.NETや VB2005では、StrConv関数はあるのでしょうか?
StrConv関数に詳しい情報が知りたいです。(出来れば書籍で)

Aベストアンサー

>redim d(0)として、解放する必要があるのでしょうか?
特別解放する必要はないと思いますが、
動的配列のメモリを解放する場合は、
Erase d
でいいと思います。

>いくらまでの添え字が入るのでしょうか?
多分メモリが許す限りいけるのではないかと思いますが、OSによって違うかもしれません。

多分Long で表現可能な数なのではないかと思います。

>VB.NETや VB2005では、StrConv関数はあるのでしょうか?
VB.NETには、StrConv 関数があります。
定数は、VbStrConv の列挙体を使います。(VB6と同じではありません)

Q1文字のStrConv fromUnicode

MS Access VBAでプログラムを組んでいるのですが、
大文字・小文字、全角・半角の区別をしたくて、

if StrConv(a,vbFromUnicode) = StrConv(b,vbFromUnicode) then exit sub

といったif文を書いています(a, bは変数名)。
だいたいうまく行くのですが、a, bの中身が1文字の場合、どんな組み合わせでも条件がTrueになり、処理を抜けてしまいます。

原因、対処方法をご存知の方、ご教授いただけますでしょうか。
よろしくお願いします。

Aベストアンサー

先ず、モジュールの最初に Option Compare Binary を宣言します。
この宣言文は比較をBinary、つまりコードで比較するという意味です。
これでもダメならStrComp(a, b, vbBinaryCompare)を使います。
StrCompはOption宣言に関わらず指定条件で比較を行います。
私の場合、Option Explicit と、Option Compare Binary は必ず
宣言します。
それと、UniCodeでない文字に対してStrConv(b,vbFromUnicode)を
使うとおかしな結果になります。ついでに言うと、1文字だけなら
AscWという関数で文字のUniCodeを得ることができます。

QStrConvの特性について教えてください

https://oshiete.goo.ne.jp/qa/9098167.html

このページで質問してご回答いただいたのですが
質問文が長くなってしまったので
再度質問させていただきます。

自分でもいろいろと試していて、
特性が大分分かってきました。

ただ、まだ理解できていないのが以下の二つの現象です。

引数として文字列を使った場合
r2() = StrConv("あいうえお", vbFromUnicode)
シフトJISへの変換は正常に行われるのですが
r2() = StrConv("あいうえお", vbUnicode)
Unicodeへ変換すると、なぜか空要素が途中に入ったUnicode配列が出力されます。
Unicodeの配列をUnicodeに変換しても
同じように配列の内容はそのままで空要素が入ったUnicode配列が出力されます。
この空要素の入ったUnicode配列をシフトJISへ変換しようとすると
r2() = StrConv(CStr(r2()), vbFromUnicode)
なぜかシフトJISではなく元の空要素のない正常なUnicode配列が出力されます。

空要素の入ったUnicode配列が出力されるのも疑問ですが
シフトJISへの変換で元に戻せるのは一体どういう仕様なのでしょうか?


それとあと一つ気になったのが、
シフトJISの禁則文字を含んだ文字列を
配列に変換後にもう一度元の文字列に戻した時、変換の仕方で文字化けするものとしないものがあります。
文字化けしない方法
(文字列→SHIFT_JIS →Unicode(スペース無し)→文字列)
r4() = StrConv("あいう\ku予定表", vbFromUnicode)
r5() = StrConv(CStr(r4()), vbUnicode)
mozi = CStr(r5())

文字化けする方法
(文字列 →Unicode(スペース有り)→Unicode(スペース無し)→文字列)
r6() = StrConv("あいう\ku予定表", vbUnicode)
r7() = StrConv(CStr(r6()), vbFromUnicode)
mozi = CStr(r7())

ここで謎なのはr5とr7は全く同じ配列なのに
CStrをかけて文字列に変換すると違う結果が得られることです。

これは一体なぜなのでしょうか?

https://oshiete.goo.ne.jp/qa/9098167.html

このページで質問してご回答いただいたのですが
質問文が長くなってしまったので
再度質問させていただきます。

自分でもいろいろと試していて、
特性が大分分かってきました。

ただ、まだ理解できていないのが以下の二つの現象です。

引数として文字列を使った場合
r2() = StrConv("あいうえお", vbFromUnicode)
シフトJISへの変換は正常に行われるのですが
r2() = StrConv("あいうえお", vbUnicode)
Unicodeへ変換すると、なぜか空要素が途中に入...続きを読む

Aベストアンサー

気になったの体系的に変換後のByte列を確認してみました。
まず前提としてプログラムソース上に書かれた文字列(例:"あいうえお")はUnicodeであって、cp932(sjis)ではありません。(プログラムaaa()のr0より)

確認結果は以下の様になりました。

 変換方法    変換元文字  変換後
1.vbFromUnicode  Unicode    cp932(sjis)
2.vbFromUnicode  異常Unicode  Unicode
3.vbFromUnicode  cp932     3Fの連なり(異常)

4.vbUnicode    Unicode    異常Unicode
5.vbUnicode    異常Unicode  異常Unicode(0が更に追加される)
6.vbUnicode    cp932     Unicode

 ※異常Unicodeとは、0が間に挟まる文字列です。


1番と6番が変換方法と変換前の文字コードが適合している正常な使用方法で結果も正常となります。
その他は変換方法と変換前の文字コードが適合していない誤った使用方法となり、結果は正常なものではありません。2番は変換結果がUnicodeとなって一見正常と見えますが誤った使用方法です。


ご質問後半ですが
r6()の変換が誤った変換(Unicode文字列をvbUnicodeで変換)を行っているため結果が正常にならないのだと思います。



※下記で、StrConv()の第一引数をCStr()で囲んでいないのは、無くても結果が変わらなかったので省略したためです。

Option Explicit

Sub msg(ByVal str As String, ByRef a() As Byte)
Dim s As String
Dim i As Integer
Dim v() As String

s = str & "= "
ReDim v(UBound(a()))
For i = 0 To UBound(a())
v(i) = Hex(a(i))
Next
MsgBox s & Join(v())
Range("a1") = s & Join(v())
End Sub

Sub aaa()
Dim r0() As Byte
Dim r1() As Byte
Dim r2() As Byte
Dim r3() As Byte
Dim r4() As Byte
Dim r5() As Byte
Dim r6() As Byte

r0() = "あいうえお"
Call msg("r0", r0()) '42,30 ~ 4A,30 プログラムソース上の文字列はUnicode

r1() = StrConv("あいうえお", vbFromUnicode)
Call msg("r1", r1()) '82,A0 ~ 82,A8 vbFomUnicode(Unicode)はcp932へ正常変換

r2() = StrConv("あいうえお", vbUnicode)
Call msg("r2", r2()) '42,0,30,0 ~ 4A,0,30,0 vbUnicode(Unicode)は異常Unicodeへ異常変換(0が挟まる)

r3() = StrConv(r1(), vbUnicode)
Call msg("r3", r3()) '42,0,30,0 ~ 4A,0,30,0 vbUnicode(cp932)は異常Unicodeへ異常変換(0が挟まる)

r4() = StrConv(r1(), vbFromUnicode)
Call msg("r4", r4()) '3F ~ 3F vbFromUnicode(cp932)は異常変換

r5() = StrConv(r2(), vbFromUnicode)
Call msg("r5", r5()) '42,30 ~ 4A,30 vbFromUnicode(異常Unicode)はUnicodeへ正常変換(見た目)

r6() = StrConv(r2(), vbUnicode)
Call msg("r6", r6()) '42,0,0,0,30 ~ 4A,0,0,0,30 vbUnicode(異常Unicode)は更に異常Unicodeへ変換

End Sub

Sub bbb()
Dim r4() As Byte
Dim r5() As Byte
Dim r6() As Byte
Dim r7() As Byte

r4() = StrConv("あいう\ku予定表", vbFromUnicode)
r5() = StrConv(CStr(r4()), vbUnicode)
Call msg("r5", r5()) 'r5= 42 30 44 30 46 30 5C 0 6B 0 75 0 88 4E 9A 5B 68 88


r6() = StrConv("あいう\ku予定表", vbUnicode)
r7() = StrConv(CStr(r6()), vbFromUnicode)
Call msg("r7", r7()) 'r7= 42 30 44 30 46 30 5C 0 6B 0 75 0 81 45 9A 5B 68 81 45

End Sub

気になったの体系的に変換後のByte列を確認してみました。
まず前提としてプログラムソース上に書かれた文字列(例:"あいうえお")はUnicodeであって、cp932(sjis)ではありません。(プログラムaaa()のr0より)

確認結果は以下の様になりました。

 変換方法    変換元文字  変換後
1.vbFromUnicode  Unicode    cp932(sjis)
2.vbFromUnicode  異常Unicode  Unicode
3.vbFromUnicode  cp932     3Fの連なり(異常)

4.vbUnicode    Unicode    異常Unicode
5.vbUnicode    異常Unico...続きを読む

QVBAのstrConv関数のUNICODE変換について

Excel2013で
VBAでstrConv関数を使って
「あいうえお」という文字列をUNICODEに変換しました。(vbUNICODE)
すると返された文字列は「B0D0F0H0J0」でしたが
これは16進数とは関係ないのでしょうか?

HやJで16進数→2進数変換をしようとすると当然エラーになります…

UNICODEと、この処理で返された「B0D0F0H0J0」について
教えてください。

ざっくりとした質問ですみません。

Aベストアンサー

16進だと「3042 3044 3046 3048 304A」
メモリ上では「42304430463048304A30」
これをシフトJISだと「B0D0F0H0J0」なります。
エクセルはシフトJIS表示になるため

QVBAの定数の使い方で、計算値を定数に入れることは可能ですか。

VBAの定数の使い方で、計算値を定数に入れることは可能ですか。

例えば、モジュール先頭に、

Option Explicit

Const TEISU_COUNT As Integer = Application.WorksheetFunction.CountA(Range("A1:IV1"))

と書き、その下に、

Sub TestTeisu()

  MsgBox TEISU_COUNT

  '↑定数式が必要です、のようなエラーが出ます。なぜでしょう?
  'エラー時、「.CountA」にスポットがあたります。
  'つまり、ここがダメということでしょうか?やはり、この点が動的だからでしょうか?

End Sub

と書いて、実行。
結果は、上述の通り、エラーとなります。

やはり、定数値には、固定的な数値(上記例では、Integer)や文字列を入れるべきなのでしょうか。

定数に入れることのできる値の注意事項について、
どなたかアドバイスして頂けますでしょうか。
宜しくお願い致します。

Aベストアンサー

#2の回答者です。

本当は、変数と定数の区別のつかない段階で、混乱するので、余計な話は聞かないで進めていったほうがよいのですが、一応、お答えしておきます。

定数は、変動したり値やプロパティを取得するものには使えません。だから、本来、比較のしようがありません。

グローバル変数のメリットとしては、一定の環境で、再取得することなく使えることです。主に、Auto_Open で取得して、最後まで使うことが多いです。グローバルにしておけば、他のプロシージャにでも、使えます。再取得する必要がないので、当然、処理スピードは上がります。

メモリについては、このレベルでは気にするほどのものはありません。String 型ですと、文字数に比例しますが、数値型は、仮にLong 型でも、4 Byte しかありません。Integer型は、2 Byte ですが、事実上、32ビットパソコンでは、4 Byte =32ビット分を使用します。メモリについては心配はほぼないと思います。処理速度の違いですが、定数と変数の違い自体は比べようもありませんが、再取得は別として、変数が100個も使うならともかく、その差は検知できないはずです。

グローバル変数のデメリットは、実は、マクロ稼働中にエラーが発生して、グローバル変数の内容がなくなってしまう、という問題があります。そうすると、以下のようなチェックコードが必要になるということがあります。

If g_Count =0 Then
 Call RowCount
End If

'//
Public g_Count As Integer

Public Function RowCount()
 g_Count = Application.WorksheetFunction.CountA(Range("A1:IV1"))
End Function

普通は、こんなことは気にしなくてよいのですが、複雑な内容のマクロですと、必要になることがあります。また、なるべく、変数の名称は、プロシージャ内の変数とは区別がつくようにしてやることがコツです。こういうマクロは、1~2年レベルの経験では使わないと思います。

>ある固定的な値を入れる容器として、
>定数を使った場合でも、
>また、グローバル変数を使った場合でも動く

具体的な状況が思い浮かびません。どちらでも動くから、定数を使うというものでもないように思います。
前回も書いたように、消費税や数式の係数に対して用いるというのが、基本です。

#2の回答者です。

本当は、変数と定数の区別のつかない段階で、混乱するので、余計な話は聞かないで進めていったほうがよいのですが、一応、お答えしておきます。

定数は、変動したり値やプロパティを取得するものには使えません。だから、本来、比較のしようがありません。

グローバル変数のメリットとしては、一定の環境で、再取得することなく使えることです。主に、Auto_Open で取得して、最後まで使うことが多いです。グローバルにしておけば、他のプロシージャにでも、使えます。再取得する必要がないの...続きを読む


このカテゴリの人気Q&Aランキング

おすすめ情報