こんばんは
またまた壁にぶちあたっています!

VBでテキストから参照した全角文字をMidB関数等で部分参照し、
それぞれ一バイトずつのエリアに設定したいのですが、取得した値を
VB(Windows?)が認識出来ない為か「?」となります。
内容を壊さずに取得する方法があれば教えて頂きたいのですがm(__)m

サンプル
Dim strBuff1 As String * 1
Dim strBuff2 As String * 1

txtInput = "西"

strBuff1 = LeftB(StrConv(txtInput,FromUnicode),1)
strBuff2 = RightB(StrConv(txtInput,FromUnicode),1)

以上のコーディングで「strBuff1」、「strBuff2」にそれぞれ「?」が
設定されます

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

A 回答 (3件)

なるほど・・・


以前に何度かここの掲示板で似たようなものを載せてるので、それを一行にまとめた関数を書いておきます。

Sub Main()
  MsgBox fixStr("12345678901234567890", 4, 10)
  MsgBox fixStr("12345ああ6789ああ01ああ234567890", 4, 10)
  MsgBox fixStr("うううううう12345678901234567890", 4, 10)
End Sub

'引数1:文字列
'引数2:開始バイト目
'引数3:バイト長
Private Function fixStr(inStrings As String, inByteStart As Long, inByteLen As Long) As String
  fixStr = StrConv(MidB(StrConv(inStrings, vbFromUnicode), inByteStart, inByteLen), vbUnicode)
End Function
    • good
    • 0
この回答へのお礼

どれどれ、早速試してみよう・・・
・・・お~本当だ!

上手く行きました。
そうですね、Unicode変換して元に戻してあげないと行けないんですね
うっかりしてました^^

とても助かりました、有難う御座います!

お礼日時:2001/11/21 20:06

byte配列に変換した方がやりやすい



Dim b() As Byte
b = StrConv(txtInput, vbFromUnicode)
    • good
    • 0
この回答へのお礼

それは質問内容にも書いてあるとおりですよね・・・
し、しまったスペルを間違えてる
×:FromUnicode
○:vbFromUnicode
失礼しました^^

お礼日時:2001/11/21 20:07

何がしたいのかが良くわかりません。


2バイト文字の情報を1バイトに分割してどうするのですか?
文字情報が壊れるのは当然ですよ。

分解して得た情報 [strBuff1] と [strBuff2] から「西」という文字を作成したいのですか?

どのような結果を求めているのかがわかりません。

この回答への補足

説明不足でしたか?

結論から言うと半角全角混在のエリアを10バイトずつで切った情報にしたい
と言う事なのですが、PCと汎用機とのデータ移動のためのツールを作成しています

補足日時:2001/11/21 18:53
    • good
    • 0

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

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

QVB6変数の宣言dim j,k,p,m,n as Integerは良くない?

お世話になります。

VB暦1年です。

汎用の変数宣言でタイトルのように
dim j,k,p,m,n as Integer
dim ssa,ssb as String

など、カンマ区切りで変数宣言を使っていたのですが
最近、知人にasの手前の変数は型どおり宣言されるが
その手前の変数はVariant型で宣言されてしまうと指摘されました。

指摘されるまで気にはしていませんでしたが
ウォッチで確認すると変数に代入されるまでは
型がVariant/Emptyとなってます。

以後、気をつければいいのですが
過去にコーディングしたプログラムにも多少、使用していて客先に納品してしまっているものもあります。
後々、問題になるのかな?

Aベストアンサー

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというようなバグの原因になりやすいので、型を明示できるような状況で敢えてVariant型を使うべきではないです。

しかし、すでに納品してしまったコードについては、問題はメモリを余計に使ってしまうことくらいではないでしょうか?
他の人が気づかなかったことから考えるに、多分狭いスコープで使っていますよね? 比較対象や代入するべき型を誤るというようなロジックの誤りがない限り、少なくとも動作上の問題は発生しないと思います。ただ、直せる機会があるのであれば、直した方がいいとは思いますが。

おっしゃる通り、カンマで区切る場合は、
Dim j As Integer, k As Integer, p As Integer
という風にすべてAsで型を明示しないと、
Variant型になってしまいます。
つまり、
Dim j
Dim k
Dim p As Integer
とわけて書いた場合と同じです。
(VB.NETは、
Dim j, k, p As Integer
で全部Integerになるようなので、ややこしいですね)

すでにご存知とも思いますが、一般的にVariant型を多用しているコードは、宣言を見ても、どういう種類の値を使うかわかりづらいですし、比較対象の型を誤るというよう...続きを読む

QVBの「As String * 128」とは?

VBの「As String * 128」とは?

Visual Basic 2010 Expressでコンソールアプリケーションを作成しています。

OSのヴァージョンを取得する機能を作成したかったので、

http://hanatyan.sakura.ne.jp/vbhlp/Version.htm

を参考にして、OSVERSIONINFOの構造体を定義しました。

しかし
szCSDVersion As String * 128

「* 128」
の部分で、ステートメントの終わりを指定してくださいとエラーが出ます。

「* 128」とは、いったいどういう意味ですか?

また、エラーを無くす方法はありますか?

いろいろ検索しましたが、調べ方が悪いのか、分かりませんでした。

よろしくお願いします。

Aベストアンサー

参考にされたサイトはVB6.0用のソースですね。
VB6.0とVB2010(=VB.NET)は色々な部分が変わってますので、VB.NET用のサンプルを見た方が良いと思います。

http://dobon.net/vb/dotnet/system/osversion.html

ちなみに一応、質問に答えると…

> 「* 128」とは、いったいどういう意味ですか?

VB6.0(VB2010の5世代前のバージョン?)で固定長文字列を表す定義です。
* 128と記述すると128文字以上の文字列を入れても自動的に128文字でカットされます。

> また、エラーを無くす方法はありますか?

VB2010(=VB.NET)では以下のように記述します。
<VBFixedStringAttribute(128)> Private szCSDVersion As String

Qマクロで100マス計算! Dim i,j As Integer For i = 2 ToRang

マクロで100マス計算!

Dim i,j As Integer

For i = 2 ToRange(”A1”).End(xlDown).Row
For j=2 To Range(”B1”).End(xlToRight).Column

Cells(i,j).Value = Cells(i,1).Value * Cells(1,j).Value
Next j
Next i
Endsub

上記のように記述しましたが、
iの最終行が2となってしまっていますがなぜこのコードが間違っているのか分からないです。。どなたか教えていただけたら嬉しいです!

Aベストアンサー

確認してはいませんが…


>改行、スペースは実際にはきちんととっていますので気にしないでください
とのことなので、違っているのかもしれませんが、

>For i = 2 ToRange(”A1”).End(xlDown).Row
         ↓
 For i = 2 To Range(”A1”).End(xlDown).Row
で、うまくいきませんか?
100マス(10×10)と最初から決まっているので、範囲は 2 To 11 でも良いように思いますが…

改行、スペースなどが正しくなっているなら、Range(”A1”).End(xlDown).Rowの値が2以下になっている可能性が考えられます。(ということは、A1が空白セル、または、A3が空白セルなどなど・・)
A1が空白セルの場合は、
 For i = 2 To Range(”A2”).End(xlDown).Row
とするか、
 For i = 2 To 11
などとすることで、動作するのではないかと推測します。

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を得ることができます。

QDim x As Integer = 0

いつもお世話になっております。

只今、本に記載してあるソースコードを手入力しています。
標記のように入力したら、『コンパイルエラー 修正候補:ステートメントの最後』というエラーが出ました。

(1)このエラーは無視してもよいのでしょうか?
(2)そもそも、変数の宣言文の後ろに=0をつけている意味がわかりません。当方VB初心者です。

よろしくお願いいたします。

Aベストアンサー

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsugi.ed.jp/vba4graduate/vba_hensuusyokika.htm
ーーー
定数のConstであればこういう書き方はOK
Sub test01()
Const x As Integer = 0
MsgBox x
End Sub
ーーー
VB.NETでは、OK
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Dim x As Integer = 10
MsgBox(x)
End Sub
ーー
Javaでは可能であるようです
http://msugai.fc2web.com/java/var2.html
ーーーーー
>ろに=0をつけている意味がわかりません
宣言と同時に値を与える=初期化する

この点は(変数の宣言と初期化は)言語による、と考えるべきです。
この質問は何の質問か。
VB系統らしいことは判るが
VB以外のBASIC
VB6
VBA
VB.NET系統
のどれか質問に書くべき。質問者は経験が無くて、視野がそこまで行かないのかも知れないが。
ーーー
VBAでは(多分VBでも同じ。テスト環境がないので)
Sub test01()
Dim x As Integer
x = 0
MsgBox x
End Sub
はOK
ーー
Sub test01()
Dim x As Integer =0
MsgBox x
はDim x As Integer =0
と入力した段階でエラー。
http://www.bunsug...続きを読む


人気Q&Aランキング

おすすめ情報