vbaでcsvファイル出力

シート1番目の内容をCSVファイルで出力する方法

Sub writeCSV()

Dim ws As Worksheet
Set ws = ThisWorkbook.Worksheets(1)

Dim csvFile As String
csvFile = ActiveWorkbook.Path & "\data.csv"

Open csvFile For Output As #1

Dim i As Long, j As Long
i = 1

Do While ws.Cells(i, 1).Value <> ""

    j = 1
    Do While ws.Cells(i, j + 1).Value <> ""

        Print #1, ws.Cells(i, j).Value & ",";
        j = j + 1

    Loop

    Print #1, ws.Cells(i, j).Value & vbCr;
    i = i + 1

Loop

Close #1

MsgBox "data.csvに書き出しました"

End Sub

VBAのユーザー定義関数でできないこと

・スプレッドシートでのセルの挿入、削除、または書式の設定。
・別のセルの値の変更。
・ブックでのシートの移動、名前の変更、削除、または追加。
・計算方法や画面表示など、環境オプションの変更。
・ブックへの名前の追加。
・プロパティの設定およびほとんどのメソッドの実行。


関数で実行できるのは、入力元のセルに値またはテキストを返す計算だけとのこと。
他のセルに対してごにょごにょはダメなんですね。

phpでExcel操作(PHPExcel)

※今では非推奨となったが、古いPHP環境で動かすならPHPExcelを使うしかない。

新しい環境ならPHPOffice/PhpSpreadsheetを使ってね。

準備

  • PHPExcelのコードをgithubからzipでダウンロード
  • 解凍してClassesフォルダ内にあるPHPExcelフォルダとPHPExcel.phpをサーバー上にコピー。参照できる位置におくこと。

使い方

<?php
$filepath = "/home/saito/File/sample.xls";

//Classesディレクトリを配置したパスを指定
$path = "Classes/";
require_once($path . "PHPExcel.php");
require_once($path . "PHPExcel/IOFactory.php");

//拡張子がxlsx対応 拡張子によって読み込みの仕方を変える
preg_match('/[^.]+$/', $filepath, $tmp);
$extension = $tmp[0];

//xls
if($extension == "xls"){
	$xls = PHPExcel_IOFactory::load($filepath);
//xlsx
}else{
	$xls = PHPExcel_IOFactory::createReader('Excel2007')->load($filepath);
}

//ファイル内に複数のシートがある時対応
foreach ($xls->getSheetNames() as $i => $sheetName) {

	//下記二行で$i番目のシートを開く
	$xls->setActiveSheetIndex($i);
	$sheet = $xls->getActiveSheet();

	//各行を取得 $rには行番号が格納される
	foreach ($sheet->getRowIterator() as $r => $row) {

		//セルを取得 $cには列の記号(AとかB)が格納される
		foreach ($row->getCellIterator() as $c => $cell) {

			//セルの番号とセル内の値を出力
			echo $c . $r . ":" . $cell->getCalculatedValue() . "<br>";
		}
	}
}

参照するシートが決まってるなら

for($i=0;$i<4;$i++){

	// シートを取得
	$sheet = $excel->getSheet($i);

        ....
}

というやり方もあり。

phpでurl指定でファイルを保存(ダウンロード)

//メモリにファイル全てを読み込まずに、新しいファイルへ保存する。
function download($fromurl, $tofile) {
    $fp = fopen($fromurl, 'r');
    $fpw = fopen($tofile, 'w');
    $size = 0;
    
    while (!feof($fp)) {
        $buffer = fread($fp, 1024);
        if ($buffer === false) {
            $size = false;
            break;
        }
 
        $wsize = fwrite($fpw, $buffer);
        if ($wsize === false) {
            $size = false;
            break;
        }
 
        $size += $wsize;
    }
 
    fclose($fp);
    fclose($fpw);
    return $size;
}