見守り電球またはGPS端末が特価中!

string(9)のエリア"Aa1アあa "の文字を1文字ずつASCII変換して、16進変換し、string(18)のエリアに格納します
すると"416131B182A08281202020"と変換されます
(一文字ずつ Hex(Asc(Buf))を使用しました)

逆に、"416131B182A08281202020"を"Aa1アあa "に戻したいのですが、
どのような関数を使えばよいのかわかりません。
困っています。教えてください。よろしくお願いいたします。

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

A 回答 (3件)

VB既存の関数ではできないと思うので、自分で関数を作るなりしてください。



ヒントです。
ASC関数により変換された2バイト文字(シフトJIS)の1バイト目は81~9FおよびE0~FC(すべて16進)になります。
16進数から10進数に戻すには、頭に"&H"をつけます。(&H82A0 = 「あ」のシフトJISコード)
文字を数字に変換するのはVal関数、数字(文字コード)から文字に変換するのはChr関数です。
    • good
    • 3
この回答へのお礼

ヒントのおかげで無事解決いたしました。
サンプルの2文字からうっかり、2バイト文字の頭には82がつくと限定してしまうところでした。
ありがとうございます!!

お礼日時:2006/07/25 14:37

Dim text As String


Dim outText As String
Dim i, wk

text = "416131834182A0828120" '質問の中の文字はたぶん間違いだと思います
For i = 1 To Len(text) Step 2
wk = Val("&H" & Mid(text, i, 2))
If wk > 127 Then
wk = Val("&H" & Mid(text, i, 4))
i = i + 2
End If
outText = outText & Chr(wk)
Next
Debug.Print outText
    • good
    • 1
この回答へのお礼

回答ありがとうございます。
無事解決いたしました。
ちなみに「ア」は半角だったんです。
質問の投稿が半角が全角に変換されることを知りませんでした。
投稿したところ、半角は全角に・・って書かれていたのですが、質問の変更、追記の仕方がわからず、そのままになってしまいました。

変換後に2バイト文字だったかどうか確認するのもありなんだと。。
ところが前述していますとおり半角「ア」でしたので、B1を変換すると177となり、正しく変換できませんでした。

先の方のヒントを用い、自分でコーディングしましたが
しばらくVBから離れていたので(言い訳ですね(^^;)よりスマートですので
コーディングは参考にさせていただきます。ありがとうございました。

お礼日時:2006/07/25 15:13

41


61
31
まではいいけど
「ア」は,8250H
になるんじゃないでしょうか。

そうであれば、Chr関数で戻せると
思いますが。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
無事解決いたしました。
ちなみに「ア」は半角だったんです。
質問の投稿が半角が全角に変換されることを知りませんでした。
投稿したところ、半角は全角に・・って書かれていたのですが、質問の変更、追記の仕方がわからず、そのままになってしまいました。

お礼日時:2006/07/25 14:40

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

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

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

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

Q16進数を10進数に変換する方法...

お初にお目にかかります(^^)
簡潔に質問しますm(_ _)m

バージョン:MS-Visual Basic6.0
質問内容:
16進数を10進数に変換する方法がわかりません。
Hex(Text1.Text) や Oct(Text1.Text) のような方法で
16進数・8進数に変換できるんですが…
10進数に変換する方法がわかりません。

P.S できれば、16進数→10進数、16進数や10進数→2進数
…に、変換する方法も、よろしければ教えてくださいませ
m(_ _)m

Aベストアンサー

16進数→10進数は

Dim StrHex As String
Dim intVal As Integer
StrHex = "1A"
intVal = Val("&H" & StrHex)

で出来ます。


申し訳ありませんが2進数への変換はよく分かりません。

Qアスキーコードへの変換について VB6(初心者)

変数文字列をアスキーコードの10進数であらわしたいのですが、どのようなプログラムをかけばいいのでしょうか?
ネットで調べたのですが、よくわかりません。

たとえば
hensuumojiretuという名前の変数文字列を作り、それをアスキーコードに変換するとしたらどのようなプログラムをかいたらよいのでしょうか。

hensuumojiretuは自分で入力する形にしたいです。
それがわかったら変換後のアスキーコードを変数文字列(数字?)として定義したいと思っています。

この本に載ってるとか、このサイトにあるよという情報でもよいのでどうかおしえてくださいおねがいします。

Aベストアンサー

とりあえず、文字列→アスキーのサンプルを作ってみました。
フォームにCommand1,Text1,Label1を貼り付けてください
Private Sub Command1_Click()
Dim ln As Integer
Dim i As Integer
Dim strMoji As String

Label1.Caption = ""

strMoji = Text1.Text
ln = Len(strMoji)

For i = 1 To ln
Label1.Caption = Label1.Caption _
& Asc(Mid(strMoji, i, 1)) & vbCrLf
Next i
End Sub

Qbyte型をstring型として扱うには

今日の質問/マイページに反映されないので、再度の質問です。
windows2000-sp4/vb6-sp5環境です。ユニコードのデータをvbで直接入出力し、vb内でstring型で扱いたいとおもっています。今のところ、vbの入出力では、自動的にsjis/unicode変換がされるので、binaryで受け取り、string型にするのかなと思っています。byte型で受け取り、APIの"MoveMemory"("RtlMoveMemory")でstring型にcopyするのかなとは思っているのですが、うまくいきません。経験不足そのものです。vbでのbyte型とstring型双方向のbinaryな変換の方法をお教えください。

Aベストアンサー

dim s as string
dim b() as byte

'文字列 -> byte配列
b = s

'byte配列 -> 文字列
s = b

Q16進数の変換処理

VisualBasic6.0で
Val("&H" & "F")
を実行すると、15

Val("&H" & "FF")
を実行すると、255

Val("&H" & "FFF")
を実行すると、4095

Val("&H" & "FFFF")
を実行すると、-1

Val("&H" & "FFFFF")
を実行すると、1048575

という結果が得られます。

なぜ”FFFF”の時に”-1”が返ってくるのでしょうか?
また、どうやったら、
”FFFF”から”65535”が得られるのでしょうか?

教えてください。
よろしくお願いします。

Aベストアンサー

VAL関数
指定した文字列に含まれる数値を適切なデータ型に変換して返します。

FFFFは、INT型で扱える最大値なのでINT型と判定されます。
cint("&H"+"FFFF")だと、-1が返ります。
FFFFFは、INTの扱える値を超えたのでLONG型で判定される為に1048575と言う結果になるのです。
では、なぜマイナスになるのか?
FFFFを2進数で表すと以下のようになりますね。
11111111 11111111 11111111 11111111
↑先頭の1バイト目が1だとマイナスとして扱われます。

以上です。

Q[VB.net] StringからByte配列への変換

皆さんこんばんは。
最近VB.NET2000でVisual Basicをはじめたのですが、どうにもString型の値をByte配列へ変換するやり方が分かりません。
VB6.0だとByte配列にStringを代入するだけでいいそうなのですが、.NETで代入しようとすると『型"String"の値を"Byteの1次元配列"に変換できません』というビルドエラーが表れてしまいます。


CByte( Mid(str,i,1) )
CLng( Mid(str,i,1) )

他にも上記コードのように一つずつ変換しようと試みたのですが、String中のある文字がワイドバイトらしく、System.InvalidCastExceptionが表れてしまいます。
("『"を上下反転したような文字)


ワイドバイトのStringを1バイトずつ区切ってByte配列やLong配列へ格納する手法というものはありませんでしょうか。

よろしくお願いします。

Aベストアンサー

Option Explicit On
Option Strict On
Option Compare Binary
Option Infer Off ' VB2008以上。
Class Q3512824

Shared Sub Main()
Dim Str1 As String = "ほげふが"
Dim ByteArray1 As Byte()
'Code Page 932 = Shift_JISもどき
'Code Page 65001 = UTF-8
ByteArray1 = System.Text.Encoding.GetEncoding(65001).GetBytes(Str1)
For Each Byte1 As Byte In ByteArray1
System.Console.WriteLine(Byte1.ToString)
Next
End Sub
End Class

Qシリアル通信におけるバイトデータの送受信(VB.NET)

Visual Basic .NETで、WriteLine("テキスト")やReadLineを使えば、テキストデータは送受信できますが、バイトデータはどのようにすれば送受信できるのでしょうか?具体的なコードを知っている方がいたら教えて頂きたいです。

Aベストアンサー

こんにちは
http://msdn2.microsoft.com/ja-jp/library/ms143551(VS.80).aspx

そこまでご存知でしたらあともうひと調べでしたね。

QVBAのバイナリ出力について

この度はお世話になります。
VBAについて、調べながらやっているのですが・・・うまくいかずに悩んでいます。

エクセルのVBAでバイナリファイル(xxx.bin)を出力したいのですが
思った出力が出ないでいます。

エクセルの方でDEC2HEXをした512文字を、そのままの状態でバイナリファイルを生成をしたいです。

そこで、まずはtxtで書き出せるかやってみまして・・・
Sub test()

fnsave = "1.txt"

Worksheets("Sheet1").Activate

numff = FreeFile

Open fnsave For Output As #numff

temp = Range("C3")
Print #numff, temp

Close #numff

End Sub

(Sheet1のセルのC3に512文字入っています。)

これをOutputをBinaryにして・・・Putで書く?
多分2文字を取り出して・・・書き込む?ような感じなのですが
それをプログラムに起こす書き方がわからず困っています。

申し訳ございませんが、ご教授よろしくお願いします。。。

この度はお世話になります。
VBAについて、調べながらやっているのですが・・・うまくいかずに悩んでいます。

エクセルのVBAでバイナリファイル(xxx.bin)を出力したいのですが
思った出力が出ないでいます。

エクセルの方でDEC2HEXをした512文字を、そのままの状態でバイナリファイルを生成をしたいです。

そこで、まずはtxtで書き出せるかやってみまして・・・
Sub test()

fnsave = "1.txt"

Worksheets("Sheet1").Activate

numff = FreeFile

Open fnsave For Output As #num...続きを読む

Aベストアンサー

akichan1jp さん
こんにちは。
次のプログラムでできると思います。

Sub test()
 TEMP = Worksheets("Sheet1").Range("C3")
 ReDim BIN(Len(TEMP) / 2 - 1) As Byte
 For I = 1 To Len(TEMP) Step 2
   BIN((I - 1) / 2) = Val("&H" & Mid(TEMP, I, 2))
 Next I
 Open "1.BIN" For Binary As #1
 Put #1, , BIN
 Close #1
End Sub

注)"1.BIN"は事前に削除した方が安全です。
  例えばファイルの大きさが小さくなると、前のファイルの大きさがに維持されてしまいます。
  ご注意ください。

ご確認下さい。

QDoEvents関数って何?

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そこで「EXCEL VBA パーフェクトマスター」という本を見たら

for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
DoEvents
next i
unload userform1
と入力すれば解決することがわかりました。

しかし「DoEvents」についてあまり詳しく書いていなかったのでDoEvents関数をヘルプで見ると、
「発生したイベントがオペレーティング システムによって処理されるように、プログラムで占有していた制御をオペレーティング システムに渡すフロー制御関数です。」

と書いてあるのですが正直、書いてあることがよくわかりません。

どなたかDoEvents関数について、
もう少しわかりやすく教えていただけませんか。
それから、最初に書いたコードで実行すると
ユーザーフォームの背景が真っ白になってしまう原因も
教えていただけませんか?

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

こんにちは。

VBAやプログラミングに詳しい皆様に
教えていただきたい質問があります。

cells(1,1)からcells(5000,1)までの値を消去するときに
処理の進行状況を表示するためにuserform上にプログレスバーを表示したいと思います。

そこで下記のようなコードを入力しました。

userform1.show
for i =1 to 5000
cells(i,1)=""
userform1.progressbar1.value=i/5000*100
next i
unload userform1

しかしこれだとuserformの背景が真っ白になってしまい
ラベルの文字も消えてしまいます。
そ...続きを読む

Aベストアンサー

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
    DoEvents
    Cells(i,1) = ""
  Next i
End Sub

Private Sub CommandButton2_Click()
  MsgBox "hoge"
End Sub

っていうフォームのコードがあった場合、
DoEvents を入れることによって、ループ中にユーザーがCommandButton2 を押すことによって CommandButton2 のクリック イベントも動いちゃいます。
CommandButton1 のクリック イベントではループの前に
CommandButton1.Enabled = False
CommandButton2.Enabled = False
を書いてフォーム上の CommandButton を無効にしておき、ループが終わったら
CommandButton1.Enabled = True
CommandButton2.Enabled = True
と書いて CommandButton を有効に戻してください。

これを工夫すれば、CommandButton2 で CommandButton1 のループを途中キャンセルする処理もすることができます。

Private Canceled As Boolean

Private Sub CommandButton1_Click()

  CommandButton2.Enabled = False

  Dim i As Long
  For i = 1 To 50000
    DoEvents

    If Canceled = True Then
      MsgBox "キャンセルしました"
      Exit Sub
    End If

    Cells(i, 1).Value = ""
  Next i
End Sub

Private CommandButton2_Click()
  Canceled = True
End Sub



コードの行頭にあるスペースは見易さのために全角スペースで作成していますので、これをこのままコピペするとエラーになるかもしれません。
コピペするなら行頭の全角スペースを半角スペースに直してください。

簡単に言うと、
OS に制御を渡すってことです。(ヘルプそのまんま)
時間が掛かるループ処理などの場合、ループが終わるまで制御は独占されてしまいます。
ですのでループ中は OS や Excel そのものにも再描画をさせる暇さえ与えません。
途中に DoEvents を入れると制御が OS に渡るので、OS は溜まっていた処理をそこで行うことができます。
結果、フォームの再描画などが行われることになります。

注意点ですが、
Private Sub CommandButton1_Click()
  Dim i As Long

  For i = 1 To 50000
...続きを読む

QVB2010で、シリアル通信の方法を教えてください。

VB2010で、シリアル通信の方法を教えてください。

ツールボックスの「Serial Port」を使っています。
送信までは難なくできたのですが、受信が旨くいきません。
参考にしたサイトは、
http://msdn.microsoft.com/ja-jp/library/cc720852.aspx です。

これを実行すると、受信が出来ないだけでなく、フリーズしてしまいます。

どうやったら、受信できるのでしょうか?

Aベストアンサー

受信データが、
STX(&H02)とETX(&H03)には挟まれた形式のテキスト文字になっている。
エラーチェックのBCCは付加されない。
という仕様ならば
ポートをOpenした直後に
SerialPort1.NewLine = Chr(3)
とすれば良い。
受信したデータの先頭1文字がSTXの場合に正常なデータと判断できます。

QVBAでコードから漢字に変換するのは

VBAを使用していますが、コードから漢字を求める方法が見つかりません。
たとえば、3021から漢字の亜を求めたいのですが。
1バイト文字ならChr関数で求められますが、2バイト文字、つまり、漢字を求める方法が見つからないのです。 どなたか教えていただきたいのですが。

Aベストアンサー

一人で回答を汚しています。すいません。
一応、VBAの中だけでできました。JisからShiftJisに変換しています。何個かの漢字で確かめましたが全部ではないので何かあるかも・・・

Sub jiscode2Kanji()
Dim kjCD As String

kjCD = "3021" '*** これをセット ***

Jis2ShiftJis Val("&H" & Mid(kjCD, 1, 2)), Val("&H" & Mid(kjCD, 3, 2))
End Sub

Sub Jis2ShiftJis(HiByt As Double, LoByt As Double)
'下位バイト
If HiByt And 1 Then
If LoByt < &H60 Then
LoByt = LoByt + &H1F
Else
LoByt = LoByt + &H20
End If
Else
LoByt = LoByt + &H7E
End If
'上位バイト
If HiByt < &H5F Then
HiByt = (HiByt + &HE1) \ 2
Else
HiByt = (HiByt + &H161) \ 2
End If
'漢字
Dim knjCode As Double
knjCode = HiByt * &H100 + LoByt
If knjCode < 0 Then
knjCode = knjCode + 65536
End If
Range("A1") = Chr(knjCode)
End Sub

一人で回答を汚しています。すいません。
一応、VBAの中だけでできました。JisからShiftJisに変換しています。何個かの漢字で確かめましたが全部ではないので何かあるかも・・・

Sub jiscode2Kanji()
Dim kjCD As String

kjCD = "3021" '*** これをセット ***

Jis2ShiftJis Val("&H" & Mid(kjCD, 1, 2)), Val("&H" & Mid(kjCD, 3, 2))
End Sub

Sub Jis2ShiftJis(HiByt As Double, LoByt As Double)
'下位バイト
If HiByt And 1 Then
If LoByt < &H60 ...続きを読む


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング