[[20060502100341]] 『VBA:SPLIT関数について』(BB) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『VBA:SPLIT関数について』(BB)
 SPLIT関数を用いて下記のデータを配列に組み込みたいのですが
 型が一致しないとでます。
 なぜなのかわかりません。どなたか教えて下さい。

 Data="A DATA,010,020, 30,40,50" 

 Sub yomi()
    Dim kariH() As Variant
    ReDim honH(12, 0) As Variant
    Dim myRng As Range
    Set myRng = ActiveSheet.Range("A1")
    i = 0
    Open "C:\WINDOWS\デスクトップ\Book1.txt" For Input As #1
    Do While Not EOF(1)
        Line Input #1, Data
        kariH() = Split(Data, ",")
        ReDim Preserve honH(12, i)
        For j = 0 To 12
            honH(j, i) = kariH(j)
        Next
        i = i + 1
    Loop
    Close #1
    myRng.Resize(UBound(honH(), 2), UBound(honH(), 1)) = honH
    Set myRng = Nothing
 End Sub


 これではどうなりますか。
    Dim kariH As Variant
 
    kariH = Split(Data, ",")

 (川野鮎太郎)


 あっ、ちゃんといきました。
 でも、原理がわかりません。
 解説していただくと嬉しいのですが。
 (BB)

 Dimステートメントで()を使うと、動的配列として宣言されます。
Dim kariH() As Variant
でヴァリアント型の動的配列として宣言しています。
(要素の一つ一つがヴァリアント型)
動的配列はReDimでその要素数を再定義しなければなりません。
下記のようにやればできますが、
    Dim kariH() As Variant
   ・
   ・
    ReDim kariH(0)
        kariH(0) = Split(Data, ",")
この場合は kariH(0)(0)〜kariH(0)(12) と二次元の配列構造になりますが、
一組しかない配列を一次元目がひとつしかない二次元の配列変数へ格納している
形になります。できるできない、というより、わざわざコードをややこしくする
だけです。kariH(0)(0)〜kariH(0)(12) の取得の仕方も変わってますしね。
 
ヴァリアント型変数はそれ自身一次元の配列の格納が可能ですから、
kariH = Split(Data, ",")
でSplit関数の結果に応じた配列を格納し、 kariH(0)〜kariH(12) の
インデックスを使って格納された値を取得します。
 
また、つぎの構文でも有効です。
    Dim kariH() As String
   ・
   ・
    ReDim kariH(12)
        kariH() = Split(Data, ",")
とすると、 kariH(0)〜kariH(12) の文字列型の動的配列が作成されます。
 
ちなみに、静的配列として宣言するとどうかというと、
    Dim kariH(12) As String
これは要素を一個ずつ変数に格納する必要があり、For〜Nextでループできるような
場合では良いのですが、Split関数の1ステートメントで配列を格納することは
できません。
 
(みやほりん)(-_∂)b


 みやほりんさん、丁寧な解説ありがとうございます。
 未だに配列変数が理解しきれていない(川野鮎太郎)

 なるほどー
 わかりやすく教えていただいてありがとうございます。
 動的配列の宣言は、redimでしかできないと勘違いしておりました。
 みやほりんさん、川野鮎太郎さん ありがとうございました。
 (BB)

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.