Xamarin 日本語情報

Xamarin(ザマリン) の代理店だったエクセルソフト田淵のブログです。主に Xamarin に関するエントリーをアップしていきます。(なるべく正しい有益な情報を掲載していきたいと考えていますが、このブログのエントリーは所属組織の公式見解ではありませんのでご注意ください)

久しぶりに VBA 触ったのでメモ

こんにちは。エクセルソフトの田淵です。

何日か Excel VBA と格闘していたので今回使った関数とかを備忘録として残しておきます。やりたかったことは単純に選択行のいくつかの列のデータを纏めて一番上に転記するだけです。

ネットの情報だと、Range("A1:C3") とか直書きになってて、そんなケースあるわけないし、自動化する意味ないでしょ?と思って苦労してしまいました笑

選択行の取得

何はともあれ選択行の取得ですね。データがある最大行数を求めたりするのはググればすぐ出てきます。

firstRow = Selection(1).Row
lastRow = Selection(Selection.Count).Row

Range を変数で指定する

Range( Cells関数で開始セル位置 , Cells関数で終了セル位置 ) です。

Dim dataRange As Range
Set dataRange = Range( Cells(firstRow, ColumnNumber), Cells(lastRow, ColumnNumber) ) '上で取得した選択行の ColumnNumber 列を Range に格納

プロシージャーで戻り値を返す

Function AppendStrings(firstRow As Long, lastRow As Long, columnNumber As Long, devideText As String) As String '戻り値の型

Dim msg As String

...
...

AppendStrings = msg 'プロシージャー名 = で返す

End Function

ジャグ配列とアクセス方法

プロシージャーに渡す引数を一個一個書いていくのが面倒だったのでジャグ配列(VBA的にはジャグ配列と呼ぶらしい?)で値を用意する

Excel VBA で多次元配列から複数の要素を抽出する方法についての質問 - Yahoo!知恵袋

■ジャグ配列をシートに書き込む - 半角チルダ

例えば J列、L列、N列のデータを , や / で列挙するとか。

targetData= Array(Array(10, ", "), _
                  Array(12, "/ "), _
                  Array(14, ", ")

用意したジャグ配列は (0)(0) でアクセスするみたいで、ハマリました。(0,0) ではないので注意。また、プロシージャーに渡す時は何かキャストが必要でした。

i = LBound(targetData)
For i = LBound(targetData) To UBound(targetData)
    Cells(firstRow, targetData(i)(0)).Value = AppendStrings(firstRow, lastRow, CLng(targetData(i)(0)), CStr(targetData(i)(1)))
Next i

ソート

Range をソートする場合はソートする列の優先度順に Key1,Order1 Key2,Order2 Key3,Order3 まで追加可能

Range.Sort メソッド (Excel)

dataRange.Sort key1:=dataRange, order1:=xlAscending, Header:=xlNo

文字列の空白を取った後の最後の一文字を削除する

文字列の先頭 / 末尾のスペースを削除する(LTrim / RTrim / Trim関数):Excel VBA|即効テクニック|Excel VBAを学ぶならmoug

msg = Left(RTrim(msg), Len(RTrim(msg)) - 1)

Excel 関数を使える時は使う

xxx = WorksheetFunction.SumIf(範囲,検索条件,[合計範囲]) 

何か凄く無駄に時間を使ってしまった気がしますが、昔に比べると VBA も少しはマクロではなくプログラムっぽく書けるようになってきたなぁと思いますです。

以上です。

エクセルソフト | ダウンロード | 学習用リソース | JXUG リンクページ | ブログ購読