スクリプトで得られるcsvに日付が入っていて、ソコから曜日を求めたかったんだけど、マクロ作ると色々面倒になるから、csvに関数直書きしてどうにかならないかな~っていうのが動機でちょっと作ってみた。

先ずは曜日を求める関数。これは「WEEKDAY(日付,種別)」。
なお、日付はシリアル値。種別は曜日と得られる数字の対応を変更するもの。詳細はここ

csvにsedで「…,"=weekday(シリアル値,3)",…」ってな感じで突っ込むと数字が出るので関数自体は入れられることが発覚。あとはシリアル値の部分を日付があるセルを参照するようにするだけ。

でもセルを直に指定すると行数をカウントしないといけなくなるので、単に左のセルを参照するようにしたい。
セルの行と列はそれぞれ「ROW()」と「COLUMN()」で求められるので、1つ左はCOLUMNを-1するとOK。
この値をセルのアドレスとして認識させるには、「ADDRESS(行,列,参照方法,シート名)」。
ようするに「ADDRESS(ROW(),COLUMN()-1,1)」。シート名は不要だし参照方法も不要かもしれない。

これを組み合わせて「"=weekday(ADDRESS(ROW(),COLUMN()-1,1),3)"」ってやってもまだダメ。
だってADDRESSはアドレスをくれるだけ、WEEKDAYが欲しいのはシリアル値。
よってADDRESSの結果得られるセルの値を取ってこないとダメ。
これは「INDIRECT(セル,形式)」で可能。形式はTRUE=A1形式、FALSE=R1C1方式。
これも組み合わせて「WEEKDAY(INDIRECT(ADDRESS(ROW(),COLUMN()-1,1),TRUE),3)」ってやると、月曜=0~日曜=6の数値として出てくる。

さらに数値だとわかりづらいのでこの数値を元に文字を生成。
これは「MID(文字列,始点,長さ)」でできる。
※書式設定でaaaとかにするとMID不要だけど、CSV読んでから一手間が面倒…

最終形は「…,"=MID(""MonTueWedThuFriSatSun"",WEEKDAY(INDIRECT(ADDRESS(ROW(),COLUMN()-1,1),TRUE),3)*3+1,3)",…」

もっと簡単にできるかもしれないけど、素直に考えたらこうなった。
ダブルクォート連続の意味はこちら
全体をダブルクォートで括るのはこちら

これでもかなり面倒だったね(;´∀`)



ーーー追記ーーー
text使えばmidとweekdayいらないじゃん。
=TEXT(INDIRECT(ADDRESS(ROW(),COLUMN()-1,1),TRUE),"ddd")
これだけでよかったorz



Excel VBA 逆引き辞典パーフェクト 2010/2007/2003対応/翔泳社

¥2,786
Amazon.co.jp