CSVの値を元に生成した文字列を返すユーザ定義関数の例
すごく忙しいわけじゃないのですが、なんとなく忙しい雰囲気に負けている今日この頃。bonlifeです。
今日は人力検索はてなのEXCELに関する質問(http://q.hatena.ne.jp/1161677895)の回答を見てビックリしちゃいましたよ。4つ目のid:talepandaさんの回答が秀逸。Excelで"1,3,7,12,13"を"1010001000011"に変換したい、っていう質問なんですが、id:talepandaさんはワークシート関数を使ってシンプルなコードで見事に要望を実現。勉強になりました。なんとなくVBA中ではワークシート関数を避けていましたが、適材適所で使いこなしていきたいものです。関数を甘くみちゃいけないなぁ…。
ちなみに私が今の実力で普通に書いてみたら以下のような感じになりました。
Option Explicit Function csvToZeroOne(csvNum As String) ' 変数の宣言 Dim numArray, i As Long, arraySize As Long, strLen As Long, outputStr As String numArray = Split(csvNum, ",") ' 第1引数に指定された値をカンマで分割 arraySize = UBound(numArray) ' 分割結果の配列の大きさを取得 ' ' csvNum中では数値が昇順に並んでいると仮定 ' 最後の値を最大値として取得し、出力文字列の桁数とする ' strLen = numArray(arraySize) ' strLenの値を元にゼロ埋めされた文字列を生成 For i = 0 To strLen - 1 outputStr = outputStr + "0" Next i ' 配列に取得した数値と一致する部分を"1"に変更 For i = 0 To arraySize outputStr = Left(outputStr, Trim(numArray(i)) - 1) + "1" + Mid(outputStr, Trim(numArray(i)) + 1) ' MsgBox (outputStr) Next i ' 関数の戻り値に文字列を設定 csvToZeroOne = outputStr End Function
なんだかあんまりですね…。Excelの関数はちゃんと勉強したことがないので、一冊ぐらい本買って読んでみようかしら。オススメがあれば教えてくださいませ。