• ベストアンサー

VBAの構造体について

大変、初歩的なことで、恐縮なんですが、教えて下さい。 やりたいことは、 文字列(50バイト)を1バイトずつ切り分けたいんです。 MIDを使う方法じゃなくて、 配列で再定義をするような方法を教えてください。

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

  • ベストアンサー
  • ARC
  • ベストアンサー率46% (643/1383)
回答No.3

あ、なるほど。そういう手もありましたね。>#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 ってな方法も…

gooco_chan
質問者

お礼

ありがとうございました。 そうそう、LSETです。昔、VBで使ったなあと思っていて、普通にMoveしても、属性エラーでひっかかるから、 どうやってたかな・・・と、悩んでました。 本当に、胸のつかえがとれました。感謝です。

その他の回答 (3)

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.4

あ!LSetの存在!すっかり忘れてた! 無理にAPIを使う必要ないです。LSetで十分です。 MoveMemoryでできない事が、まれにLSetでできてしまう事もあります。

  • TAGOSAKU7
  • ベストアンサー率65% (276/422)
回答No.2

確実に全角が入っていないないという条件で、、、 構造体を作り、それを配列にしたら、連続した領域が配列に割り当たるため、メモリコピーが可能です。このサンプルは固定長に限り有効です。 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

gooco_chan
質問者

お礼

ありがとうございました。 APIまで気がまわりませんでした。 勉強になりました。

  • ARC
  • ベストアンサー率46% (643/1383)
回答No.1

ん~、ちょっと、仰りたいことが掴めないのですが、こういうこと、でしょうか? Sub test()   Dim a() As Byte   Dim s As String   s = StrConv("ABCDEFG", vbFromUnicode)   a() = s   MsgBox Chr(a(6)) End Sub MidBとかを使う方が汎用的だとは思いますが、現行のVBAではとりあえずは上記のようなことがこなせます。 「行儀が悪い」やり方ですが(^^;

gooco_chan
質問者

お礼

ありがとうございます。 言葉足らずでもうしわけございません。 stra as string *50 を strb(50) as string *1 に入れる、もしくは再定義(参照)して、 strb(1)~strb(50)をループで処理したいんです。 MIDを使えば、できるのはわかっておりますが、 処理時間をいくらか短縮したいので、再定義でなんとかなりませんかね・・・ COBOLやPL1だと簡単にできるのに、むずがゆいばかりです。

関連するQ&A

専門家に質問してみよう