429910 ランダム
 ホーム | 日記 | プロフィール 【フォローする】 【ログイン】

かぶもーちゃん

かぶもーちゃん

【毎日開催】
15記事にいいね!で1ポイント
10秒滞在
いいね! --/--
おめでとうございます!
ミッションを達成しました。
※「ポイントを獲得する」ボタンを押すと広告が表示されます。
x

PR

カレンダー

コメント新着

かぶもーちゃん@ Re[1]:vbaで構造体を関数の引数と戻値で使う(10/20) すみませんさっきコメントに気付きました…
柳沢由香里@ Re:vbaで構造体を関数の引数と戻値で使う(10/20) あなたさまのおかげで、データ構造体が理…
individual.investor@ Re:採用しなかったほうはどうなった? (2/26) (02/27) もーちゃん、こんにちは(^^) ぷちお久しぶ…

バックナンバー

2024年06月
2024年05月
2024年04月

カテゴリ

2010年10月20日
XML
カテゴリ:その他
vba構造体の防備録

vbaはちょっと便利に使えるようにしようとすると途端にややこしくなる。

実はこりゃ便利、という話なんだが、最近まで困っていなかったので使わなかった。
いや、実は使ってみたのだが、速度を犠牲にしても困らないときに限るとおもう。

しっかし便利だな。これは。戻り値が簡単に複数戻せる。

以下は構造体の見本。
タイトル通り、構造体を宣言しておき、プロシージャ内部で(シートの2列を構造体配列に読み出しておき)目的の関数に構造体を引数として渡す。関数内部では配列をReDimして増やしデータを追加する。
プロシージャ内部で関数の戻り値を受け取りシートに追加(というより書き換え)している。

'---------------------------------------------------
Option Explicit

'ユーザ定義型と呼ぶらしいが、ここでは構造体と呼ぶことにする。
Type Dt '構造体の名称
name As String '名前
num As Integer '数値データ
End Type

' 構造体(変数)の受渡の見本。構造体を関数の引数に渡す。
'※下記のプロシージャ内にカーソルをおいてF5キーを押すと実行される。
Sub test()
Dim dtArray() As Dt '構造体の配列
Dim lastrow As Long: lastrow = Range("A65536").End(xlUp).Row
Dim ii As Integer

Debug.Print "これは呼出元"
'+--- 構造体の配列に読み出す ----------+
For ii = 1 To lastrow
ReDim Preserve dtArray(ii)
dtArray(ii).name = Cells(ii, 1).Value
dtArray(ii).num = Cells(ii, 2).Value
Debug.Print dtArray(ii).name, dtArray(ii).num
Next ii

Dim tmpArray() As Dt
tmpArray = hyoji(dtArray())

'+--- 関数の戻り値を表示する ----------+
Debug.Print "これは関数の戻り値"
For ii = 1 To UBound(tmpArray)
Debug.Print tmpArray(ii).name, tmpArray(ii).num
'+--- シートにもここで追加される -----+
Cells(ii, 1).Value = tmpArray(ii).name
Cells(ii, 2).Value = tmpArray(ii).num
Next ii

End Sub

' 構造体(変数)を引数として受け取り、戻り値に追加してセットする

Function hyoji(ByRef dtArray() As Dt) As Dt()
Dim ii As Integer
Dim kk As Integer

Debug.Print "これは関数内"
kk = UBound(dtArray)
For ii = 1 To kk
Debug.Print dtArray(ii).name, dtArray(ii).num
Next ii

ReDim Preserve dtArray(kk + 2) '関数内部で配列を追加した
'+--- 追加した --------------------+
dtArray(kk + 1).name = "sheet4" '追加した配列に値セット
dtArray(kk + 1).num = 500 '追加した配列に値セット
dtArray(kk + 2).name = "sheet5" '追加した配列に値セット
dtArray(kk + 2).num = 400 '追加した配列に値セット
'+--- 関数の戻り値に構造体を渡す --+
hyoji = dtArray() '戻り値セット

End Function
'---------------------------------------------------

このまま標準モジュールに貼り付けてF5キーで実行可能。
sheet1のa1,b1からa3,b3に下記のように入力しておく。
sheet1 100
sheet2 200
sheet3 300

実行するとシートに下記が追加される。
sheet3 500
sheet3 400

注)処理内容に意味はなし。


構造体のメリットは、
共通Public変数を排除できること、
引数が沢山あっても1個にまとまること。
複数の戻り値を返せるようになること。
見た目がすっきりすること。

などが挙げられる。

ま、誤解を恐れずに簡単にざっくり表現すると、
親分として構造体に子分としての個別変数がぶら下がっているイメージ。

oyabun.kobun1
oyabun.kobun2
oyabun.kobun3

配列にもできる。
oyabun(1).kobun4

以上





お気に入りの記事を「いいね!」で応援しよう

最終更新日  2010年10月20日 13時52分08秒
コメント(2) | コメントを書く
[その他] カテゴリの最新記事


■コメント

お名前
タイトル
メッセージ
画像認証
別の画像を表示
上の画像で表示されている数字を入力して下さい。


利用規約に同意してコメントを
※コメントに関するよくある質問は、こちらをご確認ください。


Re:vbaで構造体を関数の引数と戻値で使う(10/20)   柳沢由香里 さん
あなたさまのおかげで、データ構造体が理解でき、2週間躓いていたデータの読み出しができるようになりました。
本当にありがとうございました。 (2017年05月06日 23時35分02秒)

Re[1]:vbaで構造体を関数の引数と戻値で使う(10/20)   かぶもーちゃん さん
すみませんさっきコメントに気付きました。
意外ですが、私のブログの中でダントツに読まれている記事のようです。
構造体が理解できるようになったとのこと。よかったですね。

(2017年05月07日 07時46分38秒)


© Rakuten Group, Inc.