こんにちは。エクセルソフトの田淵です。
何日か 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 まで追加可能
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 も少しはマクロではなくプログラムっぽく書けるようになってきたなぁと思いますです。
以上です。