2012年1月17日火曜日

VB(VisualStudio2010Pro)でファイルのタイムスタンプ更新

Windows XPで、ファイルの作成日時、更新日時、アクセス日時をコマンドラインで変更する方法をアレコレ調べたけど、なんか厳しそうなので、いっそオレオレツールでもつくるか、と思ってVisualStudio立ち上げてみたのでメモ。
以下みたいな感じで3行でいけた。

System.IO.File.SetCreationTime(sFilePath, dDate)
System.IO.File.SetLastAcccessTime(sFilePath, dDate)
System.IO.File.SetLastWriteTime(sFilePath, dDate)

ちなみにPowerShellいれたら(Windows7だったら)、こんなん作らなくても、コマンドでさくっといけるっぽい。

2012年1月10日火曜日

VBAのApplication.FileSearchの高度なオプション

Excel 2003 VBAでApplication.filesearch使ってて、最終更新日が、ある日付以降のファイルだけ抽出したいな、と思ったので試行錯誤。とりあえず適当にググると以下のページ発見。

http://msdn.microsoft.com/en-us/library/aa191056(v=office.10).aspx

欲しかったのは、日付と日付に挟まれたのじゃなくて、ある日付から現在までのものだけど、これと大体おんなじようにやればいけるかな、と、目処がたったので、さらにググると以下発見。

http://msdn.microsoft.com/fr-fr/library/microsoft.office.core.filesearch.lastmodified(v=office.11).aspx
http://msdn.microsoft.com/ja-jp/library/microsoft.office.core.msocondition(v=Office.11).aspx

んで多分、↓みたいな感じでいけるかな、と思ったら、さっぱり動かない。
Call Application.FileSearch.PropertyTests.Add("Last Modified", msoConditionOnOrAfter, "4/1/09")

アレコレ試して、日本語環境だと以下が正解だとわかった。
Call Application.FileSearch.PropertyTests.Add("最終更新日", msoConditionOnOrAfter, "2009/4/1")

日本語環境ではプロパティの設定が変わるってのはありがちな話だけど、まさかメソッドに日本語いれなあかんとは盲点だったので、メモ。

ただ、そもそもExcel 2010だとこの方法使えないので、どーすっかなー。。。

2011年12月26日月曜日

ASUSのZenBook(Ultorabook)買うたった

秋葉原のソフマップでASUSのZenBook (Ultrabookとか呼ばれてるらしい) を購入。
http://zenbook.asus.com/jp/
CPUとかメモリとかが劇的に増えてるわけじゃないけど、SSDのおかげか、マシンの起動とか、LibreOfficeの起動とか、めっちゃ速なっとる。何かこの速さをいかした使い方をしてみたいと思いつつ思いつかないけど。

2011年12月12日月曜日

OOo(libreOffice) BasicでEval

ExelのVBAでは、文字列で渡された計算式を実行するためのApplication.Evaluate()ってメソッドがあるけど、OOo(LibreOffice)では見当たらなかったので。
ググると、以下のような投稿を発見。
http://www.oooforum.org/forum/viewtopic.phtml?t=58809

これの一番最後に答えが書いてあって、ようはJavaScriptのEvalを使って計算を行うマクロを作っておいて、それをOOo Basicから呼び出すというコード。まず、以下のようなJavaScriptの一行マクロをドキュメントのLibrary1のEvalCell.jsとして作成。

dResult = eval(String(ARGUMENTS[0]));

んで、そのあと以下のようなOOo Basicのコードで呼び出す、って感じ。

Function Eval(s as String) as Double
  oDocScriptProvider = ThisComponent.getScriptProvider()
  oScript = oDocScriptProvider.getScript("vnd.sun.star.script:Library1.EvalCell.js?language=JavaScript&location=document")

  On Error Resume Next
  Eval = oScript.Invoke(Array(s), Array(1), Array(dResult))
  On Error Goto 0
End Function

2011年11月24日木曜日

Calc(OOo, LibreOffice)のSylkファイル

に関してどーなってんの?と聞かれたのでちょいソースを見てみた。
http://svn.services.openoffice.org/opengrok/xref/Current%20(trunk)/sc/source/ui/docshell/impex.cxx
http://cgit.freedesktop.org/libreoffice/calc/tree/sc/source/ui/docshell/impex.cxx

この中のScImportExport::Doc2SylkとScImportExport::Sylk2Docってのが実体みたい。
中身は割と朴訥な感じで、セルの内容にXとかYとかくっつけてテキストに吐き出したり、逆にテキストファイルの中身を総なめしてXとかYとか出てきたらそこのセルにテキストを展開したり、ってことをやってるみたい。
Excelが出してくるやつより、かなりシンプルになるんじゃなかろうか、と思って実際出来たSylkファイルを比べてみると、やっぱりかなり違います。

もし昔のアプリケーションとかで、Exelが出すSylkファイルを取り込んで云々するものがあれば、OOo(LibreOffice)で作ったSylkファイルだとトラブルでるかも。

2011年11月1日火曜日

中国語MS OfficeでVBA

中国語MS OfficeでVBAマクロを作成し、それを日本語MS Officeで読み込むと文字化けします。(多分逆もそうなんじゃないか。)
内部的にはどっちもUnicodeを使ってるはずなので、UnicodeをUnicodeのまま素直に表示してくれるだけで良いはずなのに、どうも何か無駄な変換がかかってるようです。やっぱ過去のしがらみとかが関係してるのかな。

ちなみに同じ中国語ファイルをLibreOfficeで読み込むと、当たり前ですが、ちゃんと難しい漢字が(フォントが入ってれば)出ます。

VBAでテキスト出力(中国語)

VBAでテキスト出力する際に、素直に、Open hogehoge For Output As #i とかやるけど、中国語が混じってきたときに問題が発生したので、メモ。


そもそも、Windowsも、MS Officeも、その中のVBAも、全部Unicodeで処理されてるっぽいので、ファイル名だの、ファイルの中だのに中国語が入っていても問題ないけど、VBAからテキスト出力するときだけは、過去との互換性のためか、勝手にShift_JISに変換されちゃいます。
んでそこに中国語が入ってきたときに、あれやこれや問題が発生します。文字化けしたり、書き込みエラーになったり。
(多分OOoとかLibreでも似たような問題発生するんじゃなかろうか。。。)


対応策としてまず考えたのは、バイナリモードでUnicodeをそのまま出力することですが、割と修正箇所が多くて、文字列をバイト配列に変換したり挿入箇所を指定したり改行コード挿し込んだりが、めんどっちかったので、とりあえず文字列をURLエンコードして凌ぐことに。CreateObject("ScriptControl")とかしてJavaScriptの変換関数を呼び出すと簡単にできます。(MS Office 2010とか64bit版とかだと使えないって噂がありますが)


出力されたテキストを読むときはURLデコードする必要がありますが、コード修正の手間とのトレードオフってことで。