アプリ版:「スタンプのみでお礼する」機能のリリースについて

大変、初歩的なことで、恐縮なんですが、教えて下さい。

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

A 回答 (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


ってな方法も…
    • good
    • 0
この回答へのお礼

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

お礼日時:2003/04/02 23:02

あ!LSetの存在!すっかり忘れてた!


無理にAPIを使う必要ないです。LSetで十分です。
MoveMemoryでできない事が、まれにLSetでできてしまう事もあります。

    • good
    • 0

確実に全角が入っていないないという条件で、、、


構造体を作り、それを配列にしたら、連続した領域が配列に割り当たるため、メモリコピーが可能です。このサンプルは固定長に限り有効です。

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
    • good
    • 0
この回答へのお礼

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

勉強になりました。

お礼日時:2003/04/02 22:59

ん~、ちょっと、仰りたいことが掴めないのですが、こういうこと、でしょうか?



Sub test()
  Dim a() As Byte
  Dim s As String
  s = StrConv("ABCDEFG", vbFromUnicode)
  a() = s
  MsgBox Chr(a(6))
End Sub

MidBとかを使う方が汎用的だとは思いますが、現行のVBAではとりあえずは上記のようなことがこなせます。
「行儀が悪い」やり方ですが(^^;
    • good
    • 0
この回答へのお礼

ありがとうございます。
言葉足らずでもうしわけございません。

stra as string *50

strb(50) as string *1
に入れる、もしくは再定義(参照)して、
strb(1)~strb(50)をループで処理したいんです。

MIDを使えば、できるのはわかっておりますが、
処理時間をいくらか短縮したいので、再定義でなんとかなりませんかね・・・

COBOLやPL1だと簡単にできるのに、むずがゆいばかりです。

お礼日時:2003/03/31 23:10

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