- ベストアンサー
VBAの構造体について
大変、初歩的なことで、恐縮なんですが、教えて下さい。 やりたいことは、 文字列(50バイト)を1バイトずつ切り分けたいんです。 MIDを使う方法じゃなくて、 配列で再定義をするような方法を教えてください。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
あ、なるほど。そういう手もありましたね。>#2,TAGOSAKU7 さん APIを使わないのであれば、 Type typS1 a As String * 1 b As String * 1 c As String * 1 d As String * 1 e As String * 1 f As String * 1 End Type Type TypS2 a As String * 6 End Type Type TypS3 a(5) As String * 1 End Type Sub test() Dim S1 As typS1 Dim S2 As TypS2 Dim S3 As TypS3 S2.a = "一二三四五六" LSet S1 = S2 MsgBox S1.c LSet S3 = S2 MsgBox S3.a(2) End Sub ってな方法も…
その他の回答 (3)
- TAGOSAKU7
- ベストアンサー率65% (276/422)
あ!LSetの存在!すっかり忘れてた! 無理にAPIを使う必要ないです。LSetで十分です。 MoveMemoryでできない事が、まれにLSetでできてしまう事もあります。
- TAGOSAKU7
- ベストアンサー率65% (276/422)
確実に全角が入っていないないという条件で、、、 構造体を作り、それを配列にしたら、連続した領域が配列に割り当たるため、メモリコピーが可能です。このサンプルは固定長に限り有効です。 Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Long, Source As Long, ByVal Length As Long) Private Type typString str1byte As String * 1 End Type Private Sub Form_Load() Dim strA As String * 50 Dim strB(1 To 50) As typString Dim i As Long Dim strWk As String 'ダミーデータ For i = 1 To 50 strWk = strWk & Chr(i + &H20) Next i strA = strWk '文字バイト数のメモリコピー Call CopyMemory(ByVal VarPtr(strB(1)), ByVal StrPtr(strA), ByVal LenB(strA)) End Sub Private Sub Form_Load() Dim strA As String * 50 Dim strB(1 To 50) As typString Dim i As Long Dim strWk As String 'ダミーデータ For i = 1 To 50 strWk = strWk & Chr(i + &H20) Next i strA = strWk '文字バイト数のメモリコピー Call CopyMemory(ByVal StrPtr(strB(1)), ByVal StrPtr(strA), ByVal LenB(strA)) End Sub
お礼
ありがとうございました。 APIまで気がまわりませんでした。 勉強になりました。
- ARC
- ベストアンサー率46% (643/1383)
ん~、ちょっと、仰りたいことが掴めないのですが、こういうこと、でしょうか? Sub test() Dim a() As Byte Dim s As String s = StrConv("ABCDEFG", vbFromUnicode) a() = s MsgBox Chr(a(6)) End Sub MidBとかを使う方が汎用的だとは思いますが、現行のVBAではとりあえずは上記のようなことがこなせます。 「行儀が悪い」やり方ですが(^^;
お礼
ありがとうございます。 言葉足らずでもうしわけございません。 stra as string *50 を strb(50) as string *1 に入れる、もしくは再定義(参照)して、 strb(1)~strb(50)をループで処理したいんです。 MIDを使えば、できるのはわかっておりますが、 処理時間をいくらか短縮したいので、再定義でなんとかなりませんかね・・・ COBOLやPL1だと簡単にできるのに、むずがゆいばかりです。
お礼
ありがとうございました。 そうそう、LSETです。昔、VBで使ったなあと思っていて、普通にMoveしても、属性エラーでひっかかるから、 どうやってたかな・・・と、悩んでました。 本当に、胸のつかえがとれました。感謝です。