3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

VBA - LSetで遊ぶ

Posted at

#LSetできること
LSetステートメントの基本的な使い方は固定長の文字列変数に左詰めで文字列をセットすることです。…が実はLSetを使うとユーザー定義型の変数に別のユーザー定義型の値を代入することができます。実際公式ドキュメントには以下のような記述があります。(推奨はされていません。)

ユーザー定義型の変数を別の変数にコピーする場合、要素に指定されているデータ型は考慮されず、一方の変数のバイナリ データがもう一方の変数のメモリ領域にコピーされます。

例えばVBAのDouble型のサイズは8バイトで内部的にはIEEE754という規格に基づいているようなので,3.1415という浮動小数点数を表すバイナリデータは
$${\rm 40, 09, 21, CA, C0, 83, 12, 6F}$$
になります。バイトオーダーはリトルエンディアンなので内部的にはこの8バイトを右から順に並んでいることになります。
一方,固定長配列は連続したメモリ領域にその要素が配置されるので上記の8バイトのデータを右から入れた長さ8のByteの配列を考えると,これはバイナリデータとしてみれば3.1415と同じ内部表現を持っているはずです。
したがって,公式ドキュメントによれば,上記のバイトの配列を要素に持つユーザ定義型をDoubleを要素にもつユーザ定義型にLSetで代入すれば,後者のDoubleには3.1415が入ることになります。自由度は劣りますがWIN32 APIのRtlMoveMemoryみたいなことができるわけですね。

#実験用コード

Option Explicit

Public Type AType
    value As Double
End Type

Public Type BType
    value(7) As Byte
End Type

Public Sub test()

    Dim a As AType
    Dim b As BType
    
    b.value(0) = &H6F
    b.value(1) = &H12
    b.value(2) = &H83
    b.value(3) = &HC0
    b.value(4) = &HCA
    b.value(5) = &H21
    b.value(6) = &H9
    b.value(7) = &H40
    
    LSet a = b
    Debug.Print a.value '3.1415
    
End Sub

3
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?