こんにちは。
QA通信編集員です。
二日酔いの中、無事に午前中の打ち合わせが終了しました。
昨日(というか、今日ですね)のAM2:30に家に帰り、その後、この午前中の打ち合わせで使用する資料を作り上げ、7部ほど印刷しているうちに、いつの間にか深い眠りに落ち、今朝は、AM7:00に起床して、打ち合わせに挑んでました。
AM11:30ごろに打ち合わせが終わったところで、以前に、このブログのCSVファイルへ書きだそうで紹介したCSVファイルへの出力方法で、ダメ出し(バグがあるとかではないので、前の方法でも大丈夫ですからね)が出たので、別の方法でも出力出来るんだよってマクロを作り終えたところです。
そんな呑んだくれ人間が書いたコードですが、せっかくなので、ご紹介しておこうかと...。
まず、前回のCSVファイルへ書きだそうのどこがダメだったのかを説明しますね。
前回のブログの中では、ActiveSheet.SaveAsというメソッドを利用してCSVファイルの形式で出力するというものです。まぁ、いわゆるExcelの標準の『名前を付けて保存』と同等のことを、マクロの中で行っていました。
この方法で出力した場合、Excelでは、縦方向は書き出されている行数分×横方向に書き出されているカラム数分という四角形で切り出しを行います。このため、カラム数分に満たない行については、不足している部分が、すべて『,(カンマ)』がついてしまうのです。
文字だけで書くと、良く分からないですよね...(^_^;
以下のようなファイルがあったとします。
No.1 |
AAAAA |
BBBBB |
CCCCC |
DDDDD |
No.2 |
EEEEE |
FFFFF |
|
|
No.3 |
GGGGG |
HHHHH |
IIIII |
|
このファイルをCSVファイル形式で出力すると、以下のようになります。
No.1,AAAAA,BBBBB,CCCCC,DDDDD |
No.2,EEEEE,FFFFF,, |
No.3,GGGGG,HHHHH,IIIII, |
まぁ、縦横のサイズをちゃんと考えて、出力してくれるって訳ですわ。
これはこれで正しいものなのですが、見た目も含めて、ちょっと『,(カンマ)』が邪魔くさいってのは確かにありますよね。
ということで、この後ろについている『,(カンマ)』を取って欲しいというものです。
実際には、1行目だけが、1カラム分しか使っておらず、それ以外は、すべてのカラム分出力するって形です。
で、以下のような関数を作って、その関数を呼び出すようにしてみました。
|
'....+....1....+....2....+....3....+....4....+....5....+....6....+....7.. ' ' outputCSVFile ' CSVファイルへの出力 ' ' 指定されたファイル名のファイルに、アクティブシート内のデータを ' 書き出します。 ' ' Parameters : strFileName ... 出力ファイル名 ' Return : boolean ... True - 成功 ' False - 失敗 ' '....+....1....+....2....+....3....+....4....+....5....+....6....+....7.. Function outputCSVFile(strFileName As String) As Boolean Dim i As Integer, j As Integer Dim strLine as String, strWork As String Dim isOpen As Boolean Dim iMaxRow As Integer, iMaxCol As Integer '-------------------------------------------------------------------- ' Initialize Valiables '-------------------------------------------------------------------- On Error GoTo CSV_OUTPUT_ERROR
outputCSVFile = True isOpen = False iMaxRow = ActiveSheet.UsedRange.Rows.Count ' 最大行数 iMaxCol = ActiveSheet.UsedRange.Columns.Count ' 最大桁数 '-------------------------------------------------------------------- ' セル情報の出力 '-------------------------------------------------------------------- Open strFileName For Output As #1 isOpen = True ' Open For i = 1 To iMaxRow
strLine = "" strWork = "" For j = 1 To iMaxCol
If (j = 1) Then strWork = Cells(i, j) Else strWork = strWork & "," & Cells(i, j) End If ' 空白ではない場合 ' 該当セルが空白ではない場合に、ライン出力用文字列へ連結する。
If (Cells(i, j) <> "") Then strLine = strLine & strWork
strWork = "" End If
Next j Print #1, strLine Next i Close #1 Exit Function
CSV_OUTPUT_ERROR: If (isOpen) Then Close #1 End If outputCSVFile = False End Function
|
とまぁ、こんな感じです。
ファイルをオープンし、そこに各セルを『,(カンマ)』で連結し、行単位で出力をしていくというものです。
一旦、strWorkという文字列に格納しているのは、以降がすべて空白ばっかりだったら破棄するようにするために、利用しており、空白が続いて、その後のセルが設定されているのであれば、その途中も含めてちゃんと書き出すようにしなければいけないため、このようなアルゴリズムにしているということですね。
なお、このマクロの中では、Printステートメントを利用していますが、書き出すだけならば、Writeステートメントというのもあります。しかし、Writeステートメントで書き出すと、書き出した文字列の両端に、『"(ダブルクォーテーション)』が付けられてしまいますので、このダブルクォーテーションを出力しないようにするために、Printステートメントを利用しています。
また、On Error GoTo...というステートメントも使って、ファイルオープン後に、エラーが発生してしまった場合に、ちゃんとファイルをクローズするために利用しています。まぁ、マクロが終了すれば、ファイルも閉じられるので、そんなに気にする必要もないのですが、安全のために、このような処理を追加しています。