こないだのExcelVBAの続編として、また記事を書いて行きたいと思います。
とあるシステムにとある機能が実装可能かどうかを調べていて、
また機能追加のご要望が着たので、VBAを触りました。
でまた、作ってたら結構はまったりしたので、その際に
困った事や便利だった事をメモ的な感じで書いて行きたいなぁと思います!
INDEX
バリアント型
バリアント型ってなんぞやと思って
翻訳しても出てこなかったので、変数の型を動的に判断してくれる
箱みたいな変数の型だと僕は勝手に認識しました。
PHPの変数みたいに使えて便利なので、こればっか使うようになりました。
定義の仕方はDim e1 As Variantみたいにして書けば良いと思います。
ちょっと使った例を書いてみます。
Dim e1 As Variant e1 = Range("B4:B31").Value For Each searchFrom In e1 Debug.Print(searchFrom) Next
みたいな感じで使う事が出来て便利ーです。
データの入ってる最終行を探す
こんな感じでやるみたいです。
Dim endRowAs Long endRow = ActiveSheet.Range("O5").End(xlDown).row
が、たまに上手く行かないので、ちゃんと分かる時が着たら詳細書きます。
A1に文字入れて、さっきの使ったら65536になったりしました・・・。
1行のifならendifが省略可能
if文が一行で済む場合End Ifが省略できます。
構文が長めな気がするので、結構ありがたいと思いました。
ブック間のコピペ
例えばブックAからブックBに
文字をコピーしたい場合にはこうやります。
ファイルをオープンさせた状態でコピーしてペーストします。
ファイルオープンさせずにこれやったので軽くはまりました。
Workbooks("A.xls").Worksheets("Sheet1").Range("A1").Copy Workbooks("B.xls").Worksheets("Sheet1").Range("A2").PasteSpecial
後引数を文字列で受け取るので、変数使う場合は注意してください。
Workbooks(e2fileName).Worksheets("データ出力シート").Range("E" & rowAddress & "," & "O" & rowAddress & "," & "G" & rowAddress).Copy Workbooks(e3fileName).Worksheets("Sheet1").Range("A" & e3endRow & ":C" & e3endRow).PasteSpecial
なんかカンマがあるのにカンマが文字列って不思議な感じ。
関数の付いたセルを作成する
Formulaってのを使うみたいです。
デバックしにくいので、作成するセルの値は一度変数に入れてやると
デバックしやすいと思います。
こんな感じで書きました。
formuraCells = "=A" & e3endRow & "*" & "B" & e3endRow Workbooks(e3fileName).Worksheets("Sheet1").Range("D" & e3endRow).Formula = formuraCells
関数セルコピーすると関数がついてきてUZEEEEEEEEEEE
PasteSpecialにちょっと付け足すと大丈夫になります。
Range("A1:C1").PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False
マクロで出力したので意味は分かりませんが機会があれば調べてみようと思います。
マクロで出力
Excelの場合、操作を記録する機能があります。
開発タブのマクロの記録ってとこを押すと操作が記録できます。
僕みたいにVBAの習熟度が低い場合、操作をコードに置き換えるのが
調べながらやらないとダメなので、いちいち面倒臭いです。
そういうときに、これを利用して、操作を記録すれば、記録した操作を
マクロとしてsubプロシージャに書き出してくれます。
このマクロを見て、余裕があれば意味を調べながらやれば、
気持ちよく作業を進めることができます。