TopProgramming LanguageVB/VBA > 2014年4月
2014年4月 8日

Excel VBAで配列を動的に変更する方法のまとめ

April 8,2014 12:55 AM
Tag:[, ]
Permalink

Excel VBAで配列を動的に変更する方法のまとめです。

1.配列の基本

動的変更の説明の前に、静的な配列変数の定義は次のように行います。

Sub Test()
    Dim foo(2) As String
    foo(0) = "a"
    foo(1) = "b"
    foo(2) = "c"
End Sub

通常の変数宣言と同様、Dimで宣言し、変数名の直後に配列変数の「0から数えたときの上限値」を指定します。

    Dim foo(2) As String

上記の例では「2」を設定しているので、配列のサイズは「3」になります。

宣言時に上限値を設定しているので、処理の中でいつでも配列に値を設定することができます。

    foo(0) = "a"
    foo(1) = "b"
    foo(2) = "c"

2.ReDimで配列のサイズを設定する

処理の途中で配列のサイズを設定する場合、DimとReDimを組み合わせます。

Sub Test()
    Dim foo() As String
 
    '処理...
 
    ReDim foo(2)
    foo(0) = "a"
    foo(1) = "b"
    foo(2) = "c"
End Sub

ReDimを使って要素数を指定する場合、最初の宣言ではカッコのみ記述し、上限値は設定しません。

    Dim foo() As String

上限値を設定して後続のReDimを行うと「配列は既に宣言されています」というコンパイルエラーになります。

コンパイルエラー

その後、ReDimで上限値を指定します。

    ReDim foo(2)

上限値を設定すれば配列に値を設定することができます。

    foo(0) = "a"
    foo(1) = "b"
    foo(2) = "c"

3.Preserveで変更前の内容を保持する

処理の途中で配列のサイズを動的に増やす場合、サイズを変更したときに、

  • 配列の内容を保持する
  • 配列の内容を保持しない

の2通りを選択できます。

サイズを変更したときに配列の内容を保持する場合、ReDimにPreserveを与えます(赤色部分)。

Sub Test()
    Dim foo() As String
 
    ReDim foo(2)
    foo(0) = "a"
    foo(1) = "b"
    foo(2) = "c"
 
    ReDim Preserve foo(5)
    MsgBox foo(0)
End Sub

上記のサンプルを実行すると、MsgBoxで指定したfoo(0)の内容「a」が表示されます。

逆に、サイズを変更したときに配列の内容を保持しない場合、ReDimにPreserveを与えません。

Sub Test()
    Dim foo() As String
 
    ReDim foo(2)
    foo(0) = "a"
    foo(1) = "b"
    foo(2) = "c"
 
    ReDim foo(5)
    MsgBox foo(0)
End Sub

上記のサンプルを実行すると、MsgBoxで指定したfoo(0)では何も表示されません。

4.配列のサイズを動的に減らす

3項の逆で、ReDimを使って配列のサイズを動的に減らすことも可能です。

Sub Test()
    Dim foo() As String
 
    ReDim foo(2)
    foo(0) = "a"
    foo(1) = "b"
    foo(2) = "c"
 
    ReDim Preserve foo(1)
End Sub

減らす場合、上限値を超えた元の要素にアクセスすることはできません。

上記の例では、上限値「2」を「1」に減らしたあと、foo(2)にアクセスすることはできません。

また、Preserveの使い方は動的に増やす場合と同様です。

5.配列のサイズを動的に増やすサンプル1

for文の中で配列のサイズを動的に増やすサンプルを示します。

Sub Test()
    Dim i As Integer
    Dim foo() As String
 
    For i = 0 To 9
        ReDim Preserve foo(i)
        foo(i) = i
    Next i
 
    For i = 0 To UBound(foo)
        MsgBox foo(i)
    Next i
End Sub

6.配列のサイズを動的に増やすサンプル2

処理の中で配列のサイズが不明な場合、UBoundを使って配列のサイズを1つ増やすサンプルを示します。

Sub Test()
    Dim i As Integer
    Dim foo() As String
 
    '処理...
 
    Dim size As Integer
    size = UBound(foo)
    ReDim Preserve foo(size + 1)
    foo(size + 1) = "OK"
End Sub

UBound関数で配列変数fooの上限値を取得し、変数sizeに保持します。

    size = UBound(foo)

「上限値+1」でReDimを実行します。

    ReDim Preserve foo(size + 1)

「上限値+1」の要素に値を設定します。

    foo(size + 1) = "OK"
Comments [0] | Trackbacks [0]
2014年4月 3日

VBAでファイルを出力する方法のまとめ

April 3,2014 1:33 AM
Tag:[, ]
Permalink

VBAでファイルを出力する方法を紹介します。

このエントリーでは、下記の2通りについて簡単なサンプルを使って説明します。

  • セルのデータをファイルに出力する
  • 配列データをファイルに出力する

1.セルのデータを出力するサンプル

以下のコードは、セルのA1~A10の内容を「C:\sample.txt」に出力するサンプルです。

Sub Test()
    Dim stream As Object
    Set stream = CreateObject("ADODB.Stream")
     
    stream.Type = 2
    stream.Charset = "UTF-8"
    stream.LineSeparator = 10
    stream.Open
    stream.Position = 0
 
    Dim i As Integer
    For i = 1 To 10
        stream.WriteText ThisWorkbook.Worksheets("Sheet1").Cells(i, 1).Value, 1
    Next i
    
    stream.SaveToFile "C:\sample.txt", 1
    stream.Close
    Set stream = Nothing
End Sub

以下、解説です。

まず最初にStreamオブジェクトを生成します。

    Dim stream As Object
    Set stream = CreateObject("ADODB.Stream")

Typeプロパティにモードを設定します。「1」はバイナリモード、「2」はテキストモードを示します。サンプルはテキストの書き込みなので「2」を設定します。

    stream.Type = 2

Charsetプロパティに文字コードを設定します。文字コードの設定値については3項で説明します。

    stream.Charset = "UTF-8"

LineSeparatorプロパティに改行コードを設定します。改行コードの設定値については4項で説明します。

    stream.LineSeparator = 10

OpenメソッドでStreamを開きます。

    stream.Open

Positionプロパティに、ストリームの先頭から現在位置までのオフセットを示す値を、バイト単位で設定します。デフォルトは「0」なので設定しなくてもよいかもしれません。

    stream.Position = 0

WriteTextメソッドでセルの内容をStreamオブジェクトに入力します。「1」はStreamオブジェクトにテキスト文字列と改行文字を書き込む場合の指示です。改行文字を書き込まない場合は「0」を指定します。

    Dim i As Integer
    For i = 1 To 10
        stream.WriteText ThisWorkbook.Worksheets("Sheet1").Cells(i, 1).Value, 1
    Next i

SaveToFileメソッドでファイルに出力します。「1」を指定するとファイルを上書きしません。「2」を指定するとファイルを上書きします。省略時のデフォルト値は「1」です。

    stream.SaveToFile "C:\sample.txt", 1

CloseメソッドでStreamオブジェクトを閉じます。

    stream.Close

最後にオブジェクトを初期化します。

    Set stream = Nothing

2.配列データをファイルに出力する

以下のコードは、配列データを「C:\sample.txt」に出力するサンプルです。

Sub Test()
    Dim list(9) As String
    Dim i As Integer
    For i = 0 To 9
        list(i) = i
    Next i
    
    Dim stream As Object
    Set stream = CreateObject("ADODB.Stream")
     
    stream.Type = 2
    stream.Charset = "EUC-JP"
    stream.LineSeparator = 10
    stream.Open
    stream.Position = 0
 
    For i = 0 To 9
        stream.WriteText list(i), 1
    Next i
    
    stream.SaveToFile "C:\sample.txt", 1
    stream.Close
    Set stream = Nothing
End Sub

ここでは1項のサンプルとの差分のみ説明します。

まず、配列変数listにデータを設定します。

    Dim list(9) As String
    Dim i As Integer
    For i = 0 To 9
        list(i) = i
    Next i

WriteTextメソッドで配列変数のデータをStreamオブジェクトに入力します。

    For i = 0 To 9
        stream.WriteText list(i), 1
    Next i

3.文字コードについて

文字コードを指定する場合、以下の値をCharsetプロパティに設定します。

  • UTF-8
  • Shift_JIS
  • EUC-JP

4.改行コードについて

改行コードを指定する場合、以下の値をLineSeparatorプロパティに設定します。

  • -1:CRLF
  • 10:LF
  • 13:CR

5.参考サイト

参考サイトは下記です。ありがとうございました。

2014.4.28
ソースコードに一部誤りがあったので修正しました。

Comments [0] | Trackbacks [0]
Now loading...
ギターに入った猫
掲載広告募集
Styles
Font Size
Default
For defective color vision
Gray Scale
RGB Color
Search this site

このブログをメールで購読する by:FeedBurner

AMN
Categories
Monthly Archives
2020年
2019年
2018年
2017年
2016年
2015年
2014年
2013年
2012年
2011年
2010年
2009年
2008年
2007年
2006年
2005年
2004年
2003年
BlogPeople
Syndicate this site
FeedBurner(RSS1.0/RSS2.0/Atom)
Counter
これまでのアクセス
Powered by
Movable Type 6.0.3