ラベル ExcelVBA の投稿を表示しています。 すべての投稿を表示
ラベル ExcelVBA の投稿を表示しています。 すべての投稿を表示

2014年1月10日金曜日

ExcelVBA マクロでオートフィルを使用する

Excelで選択されているセルの右下をえいやって引っ張ると連続データが作成される。
この機能をオートフィルというらしい。(機能は知ってたけど名前は知らなかった)
この機能をマクロで使用する。

参考サイト
Office TANAKA - Excel VBA Tips[連続データを作成する]

/*---------------------------------------------------------------------------*/
    With Range("A1:A2")
        .Value = "1月"
        .AutoFill Destination:=.Resize(12)
    End With
/*---------------------------------------------------------------------------*/

これだけで12月までの連番が出来上がる。
しかし、このやり方だと設定されていない値は連番にならない。
そういう時は2つ以上データを入力してからオートフィルを行う。

/*---------------------------------------------------------------------------*/
    Range("A1") = "1"
    Range("A2") = "2"
    Range("A1:A2").AutoFill Destination:= Range("A1:A2").Resize(100)
 /*---------------------------------------------------------------------------*/

これであっという間に1から100までの連番が出来上がり。
Resizeの代わりにRangeで範囲を指定することもできる。

ExcelVBA ワークシートの最終行を取得する

ワークシートの最終行を取得する。

参考サイト
No.8 ワークシートの最終行、最終列を取得する

/*---------------------------------------------------------------------------*/
Dim rowCount As Integer
rowCount = Range("A1").End(xlDown).row
/*---------------------------------------------------------------------------*/

任意のシートの最終行を取得したい場合はそのシートを取得してRange以下を呼んでやる。

ExcelVBA UTF-8でファイルを保存する

ExcelVBAはExcelなので、普通にファイルを保存するとShift-JISで保存する。
文字コードをUTF-8で保存したい。のでやる。

BOM付きでファイルを保存する


参考サイト
[Excel]Excel VBAでUTF-8のテキストファイルを扱う(ADODB.Stream)

ADODB.Streamとやらを使えばよござんす、ということで。

/*---------------------------------------------------------------------------*/
    Sub saveFile(filename, data)
' ADODB.Streamのモード
        Dim adTypeBinary : adTypeBinary = 1
        Dim adTypeText : adTypeText = 2
        Dim adSaveCreateOverWrite : adSaveCreateOverWrite = 2

        ' ADODB.Streamを作成
        Dim adodb : Set adodb = CreateObject("ADODB.Stream")
       
        ' データを書き込む
        With adodb
            .Type = adTypeText
            .Charset = "UTF-8"
            .Open
            .WriteText data
            .SaveToFile filename, adSaveCreateOverWrite
            .Close
        End With
    End Sub
/*---------------------------------------------------------------------------*/

渡されたデータをUTF-8で保存するためのプロシージャを作成。
ADODB.Streamにデータを書き込み保存している。

BOMなしでファイルを保存する


環境によってはBOMがあるとエラーを起こすので、BOMなしでの保存もやってみる。

参考サイト

/*---------------------------------------------------------------------------*/
    ' BOMデータのバイトサイズ
    Dim bomSize As Integer: bomSize = 3

    ' データを書き込む
    With temp
        .Type = adTypeText
        .Charset = "UTF-8"
        .Open
        .WriteText data
    End With

    ' BOMを飛ばす
    With temp
        .Position = 0
        .Type = adTypeBinary
        .Position = bomSize
    End With
    
    ' 出力用のストリームを使って出力
    With output
        .Type = adTypeBinary
        .Open
        .Write temp.Read()
        .SaveToFile filename, adSaveCreateOverWrite
        .Close
    End With
    
    ' ストリームを閉じる
    temp.Close
/*---------------------------------------------------------------------------*/

すでにストリームが作成されている前提のサンプル。
データを書き込んだストリームのデータ位置をBOMを飛ばした位置に設定。
出力用のストリームに書き込み保存している。
出力用のストリームのCharsetプロパティを弄ると
「このコンテキストで操作は許可されていません」
というエラーが出たのでしないように。ここで割りと悩んだ。



ExcelVBA With~End Withステートメントってなんじゃい

なにかがどうしてExcelVBAを使ってマクロを記述。
気づけば言語も色々触っているので大体はわかるけどぱっと見でわからなかった
With~End Withステートメントについてメモを残しておく。

参考サイト
Excel VBA 入門講座 With ~End With

このステートメントの中では指定したオブジェクトに対する操作をまとめることができる。

/*---------------------------------------------------------------------------*/
With object
.Hoge = "Hoge"
.Fuga "Fuga"
End With
/*---------------------------------------------------------------------------*/

オブジェクトの中身は適当。
.HogeでobjectのHogeプロパティに値を代入。
.FugaでobjectのFugaメソッドに引数を渡して実行している。

処理をまとめて可読性を上げようということなのかもしれんけど、どんな操作もできるとなると、
かえって混乱しないような気がしないでもない。