VBAより便利で手軽?

Posted on 2009年12月10日 (木) in articles • Tagged with Excel, VBA

Rubyist Magazine #27に「VBAより便利で手軽Excel操作スクリプト言語『Ruby』へのお誘い(前編)」という記事が掲載されていたので、読んでみたのだがちょっと寒い内容だ。VBAでもきっちりサンプルソースを書いた上でrubyとの比較をしていただきたい。むろん僕自身はVBA自身はバッドノウハウ(すでに死語の気もするが)の巣窟であり、出来る限る捨て去りたい物であるのはと思っていることを否定しないし、VBAになんの思い入れもない。VBAの話題自身がいまさらだろうが。

新規にVBAプログラムを書く鉄則はPerlの「use strictとuse warningsを必ず書け」というのと同様に「Option Explicitを必ず書け」で、静的型付け言語なので注意して書きましょうと言うのが前提。これをやってエラーが出るソースは放置するか捨てましょう。放置しておいたほうがよいものに関わってはいけません。(笑)

で、話を戻す。「VBA での文字列操作の不満やイライラを Ruby で解消する」と言う項で書かれているような定型なテンプレートにCellに入力した値を動的に入れて文書やソースを自動で生成したいと言う場合は、ソースにテンプレートを埋め込むと確かにぐちゃぐちゃになってしまうので、やらないというかやってはいけない。ただしヒアドキュメントの埋め込みのようなことはVBAでは出来ないので、下図のA5セルのように適当にテンプレー …


Continue reading

2006年06月16日 金曜日

Posted on 2006年06月16日 (金) in articles • Tagged with Excel, Photo, Equipment, VBA, 統計, Mathematics, C++, LaTeX, TeX, Ruby, Scheme, Network

Excel2007を評価中

体験って何だ・・・ というのは置いておいて、Excel2007 Betaをインストールしてみました。(正確にはOffice2007 Pro Betaだが)

Excel2007

メニューがなくなってリボンと言う奴になりました。最初は手惑いそうだけど操作自身は本質ではないし、まあ慣れれば気にはならないかも。マウスでオペレーションする方向になったような気はする。ちょっとしたことをするにもいちいち探索することが多いが、右クリックでうまく乗り切れそうではある。もうプルダウンメニューに飽きたし、IE7もそんな感じなので、Vistaではだいぶんかわるのだろう。とりあえずいろいろつっこみどころ満載のExcelで遊んでみよう。ざっくり使えるように設定の変更。

  1. デフォルトではVBA関係のアクセスができないので、アクセスできるようにする。
    • 「ファイル」-> 「Excelのオプション」->「個人設定」
    • 「開発タブをリボンに追加」にチェック
  2. Addinやマクロ関係の設定
    • 「ファイル」-> 「Excelのオプション」->「セキュリティ センタ」
    • 「セキュリティセンタの設定」は以下の物を設定。他はデフォルト
    • マクロの設定は「デジタル署名されたマクロを除きすべてのマクロを無効にする」
    • アドインの設定 「アプリケーションアドインに対し信頼できる発行元の署名を必須にする」

ここまで設定しておいてようやくVBAやつっこみどころ満載の分析ツールで遊ぶことができ …


Continue reading

2006年05月18日 木曜日

Posted on 2006年05月18日 (木) in articles • Tagged with VBA, PC, Equipment, XML, HTML

OutlookをRSS Readerに

メーラーのOutlook Expressではなく、PIMとしてOfficeの一角であるOutlookもVBAでプログラミングできるのであるが、いままでOutlookのVBAなんてウィルスを作成することくらいしかないんじゃないかと思っていたのである。そんなものいらんなと思っていたわけであるが、やっぱりマクロが使えると便利なので、設定に気を使って便利なものは使いましょう。

会社のPCへのソフトのインストール権限が無いことと、会社のサーバがどうもMicrosoft Exchange Serverで、会社内でスケジュールの公開とかもやっているっぽいので、デフォルト環境のOutlookを使う羽目になったのですが、Thunderbirdを使い込んだ後にOutlookを使って思うのは、_OutlookでRSS Readerが無いじゃない_というところ。まぁアドインとかを購入すればいいのだろうが、時間があったのと「OutlookをVBAでRSSリーダーにする」という記事があったので、VBAで書いてみることとした。codezine.jpにはアカウントを持っていないし、作る気も無いのでWebで公開されているソース片を元にいろいろ書き足してみた。自分で使うにはおおむね問題ない仕上がりにはなった。

ざっくり試したところRSS 0.9xとRSS 1.0では大体問題なくRSSを取得し、記事単位でメールにしてくれる。後の閲覧はメールと同じ。未読管理もOutlookにお任せできる。atomはXMLではなさそうな感じなので、別の枠組みが必要 …


Continue reading

2006年04月10日 月曜日

Posted on 2006年04月10日 (月) in articles • Tagged with Excel, VBA, Photo, Equipment, Network

Excel VBA Hacks (4)

前回まではテキスト処理を中心に書いてきたが、Excelと言えばワークシートを使ってなんぼ。ということで、ワークシートを使うお題から。先日つらつら仕事をしていて、Excelで書いた表の升目の大きさに合わせて、写真を貼らなければならない資料を作る必要が生じた。まぁ数枚だったら適当に貼り付けるのだが、さすがに貼り付ける写真の枚数が総数で400枚を越えると考えも変えざるえない。貼る時間よりマクロを書く方が数段速いので、サクサクこんなツールを書いてみる。

```vbnet InsertImages.bas Option Explicit

Sub InsertImages()

Dim FileName As String
Dim c, cs As Range
Dim fs As Object

Set fs = CreateObject("Scripting.FileSystemObject")
Set cs = Selection

For Each c In cs

    FileName = c.Value

    If fs.FileExists(FileName) = True Then

        c.Value = ""

        With ActiveSheet.Pictures.Insert(FileName)
            .ShapeRange.LockAspectRatio = msoTrue
            .ShapeRange.Height = c.Height - 2   ' 画像の高さをセルの高さに適当に合わせる
            .ShapeRange.Width = c.Width - 2     ' 画像の幅をセルの幅に適当に合わせる
            .ShapeRange.Top = c.Top + 1         ' 画像の上側の辺をセルの上側の辺に適当に合わせる
            .ShapeRange.Left = c.Left + 1       ' 画像の左側の辺をセルの左側の辺に適当に合わせる
        End With

    End If

Next c

End Sub ```

使い方は、写真を張り込みたい表を作ってしまって、写真を貼り付けたいセルに貼り付けたい写真のファイル名をフルパスで入力。あとは写真を貼りたいセルをすべて選択して上のマクロを実行。あっという間に作業は終了。ちなみに写真はセルに対して貼り付けられる訳ではなくワークシートに対して …


Continue reading

2005年12月07日 水曜日

Posted on 2005年12月07日 (水) in articles • Tagged with Excel, VBA, Equipment, PC, TeX

Excel VBA Hacks (3)

なんでもかんでもExcel症候群」なんて言う_刺激的な_タイトルを付けるとなんだかそれだけでアクセスする人がいるのと、シリーズ化してみても良いかもしれないということで、タイトル変更。本シリーズではVBAとWindowsの標準的な環境における機能だけを使ったExcelおよびOfficeの使いこなしを深めていきたいと思う。

そんなわけで第3弾。テキストデータをさわっているといろいろ考えさせてくれるのが文字コード周辺の問題となる。通常Unixではnkfやらiconvやらを使ってコード変換をするのであるが、Windowsではどうするかというと、たいていの記事ではnkfをDLL化したフリーのライブラリnkf.dllを使うのが常道である。が、これもいちいちインストールしないと使えないので、めんどくさい。(めんどくさくないよと言う人は以下の記事を読む必要はない。ただ数十人のPCにいちいちマクロ以外のプログラムやライブラリを導入しつつ、自分がそのバージョンの管理もしなきゃならないという事態に陥れば、考えるところもあるだろう。)

いろいろWindowsのドキュメントをひもといていけば、だいたいの場合でやっぱりnkf32.dllもいらないと言う結論に落ち着いた。とりあえず文字コード変換して取り込むと言う関数も書いてみよう。方法としてはUnixのファイルをバイナリでもらっ …


Continue reading

2005年11月24日 木曜日

Posted on 2005年11月24日 (木) in articles • Tagged with Excel, TeX, VBA, Perl, Ruby, Network, Equipment

続・なんでもかんでもExcel症候群

Unixな機械からテキストファイルを直接持ってくると、改行がWindowsと異なるので、Excelで扱うのがちょっとめんどくさい。FTPできるときは、ASCIIで持ってくればDOS/Windowsなテキストファイルになるのだけど、世の中FTPできなくて専用のクライアントを共用されることもあって涙が出てくることがもうしょっちゅうあって困る。で、そんな_だめだめクライアント_に泣く泣くつきあわなければならないのだが、この際_なんでもかんでもExcelにお任せ_なのだ。

これからはASCIIモード転送のことは忘れて、すべてBINARYモード転送にしてしまいましょう。DOS/Windowsの世界ではUnixで作成したテキストは何行あっても、_たった1行のテキストファイル_と見なせるから、これを全部1つの文字列に取り込んで、ばらす方向で考える。ソースを示す。

```vbnet TextRead.bas Sub TextRead(FileName As Variant) ' TextReadプロシジャ: FileNameで指定されたファイルを読み込む ' FileName: 入力するファイルのファイル名

Dim RE As Object
Dim StreamString As String
Dim textlines As Object
Dim textline As Object
Dim tmp(2) As String
Dim myDate As Date
Dim PATTERN as String

Set RE = CreateObject("VBScript.RegExp")

With RE
    .Pattern = ".+\n"
    .IgnoreCase = False
    .Global = True
End With

Open FileName For Input As #1
Line Input #1, StreamString
Close #1

Set textlines = RE.Execute(StreamString)

For Each textline In textlines

' textlineはUnixにおける行と同じ。ここに処理したいことを書く

Next

Set RE = Nothing

End Sub

こんなことをやると、textlinesコレクションに入る各要素はUnixで言うところの行の集合、その要素は行と同じ …

Continue reading

2005年11月22日 火曜日

Posted on 2005年11月22日 (火) in articles • Tagged with Excel, Equipment, PowerPoint, XML, Emacs, VBA, Perl, Ruby, Network, PC, C++

なんでもかんでもExcel症候群

何でもかんでもPowerPoint症候群の弊害を日記で書いたのだが、それよりも世の中に広く広まっている病的な物と言えば、_なんでもかんでもExcel症候群_であろう。とにかく通常の表だけに飽きたらず、提出書類から報告書まで_何でもかんでもExcel_なのである。つまり「何でもかんでもExcel症候群」とはExcelだけですべての仕事が完結してしまう恐ろしい病気なのだ。

その病巣の由来を簡単に予想するとすれば、子供の頃に升目の入ったノートで漢字の書き取りをやらされ(つまりカーニングとかに無頓着になる)、読書感想文などの類は原稿用紙で書かされ、漢字は少ない文字数で情報量を詰め込めることからすっきりとした表が書きやすく、何でもかんでも_表にしないと気が済まない_という日本人の悲しい習性に由来する物であろうと思うのだ。

まぁUnixでEmacsしか使わないというのと似たような話ではあるのだが、典型的なEmacsユーザーが扱うのは汎用的なテキストファイルであり、Emacs LISPでがんがんプログラムを書く(設定ですらLISPを書かねばならないので、多少は誰でも書く物だ)人が多い用に思われる。Excelの場合は、XLS形式という特殊なフォーマット(最近のはXMLなのか?)を用い、適当なワークシート関数などを表層的に使いこなしている人が多く、Excelの基本 …


Continue reading

2005年04月21日 木曜日

Posted on 2005年04月21日 (木) in articles • Tagged with Excel, VBA, PC

久しぶりにExcel VBA

今日は午後から頼まれたExcel VBAのマクロ書き。1つのファイルに10個くらいのデータ系列があって、それぞれに対して単回帰分析をしたいらしいのだが、そんなファイルが100個くらいあるんだそうな。ということで、作りためていたライブラリを組み合わせて、ちゃきちゃき作ってみた。2.5時間で完成。

マクロを渡したところ... 動かないんですけど!_というご意見をいただいたので調べてみたところ、マクロはExcel2002で作ったのだが、実行環境はExcel97で、その部分の非互換性な部分だった。身の回りにExcel97は残しておく必要がありそうだ。(だれだよ、_互換性でMS Officeが優れているなんていったのは、些細な非互換性が非常に腹立たしいのだけど...)

今日は家のPC関係はいったんお休み

ちょっと寝不足気味なのと、1日Excel VBAと闘ったので、久しぶりに疲れた... 今日はいろいろ追いかけるのはお休み。


2005年04月13日 水曜日

Posted on 2005年04月13日 (水) in articles • Tagged with Photo, Java, PC, Network, Equipment, TeX, HTML, Excel, VBA

続・Photoshopのスクリプト機能

今日はプログラミングしてみることにする。いろいろめんどくさいので、Java Scriptで遊んでみることにする。とりあえず画像解像度を変更するプログラムなど。ダイアログボックスで縦か横を選び、サイズを入れると設定された値に応じて、サイズが変更となる。スクリプトはJava Scriptの場合「PhotoshopCS」のディレクトリの中の「プリセット」ディレクトリの中にある「スクリプト」ディレクトリに適当な名前を付けてコピーする。

```javascript resize.js // 解像度の変更(お試し版)

// 今の設定を保存 var saveRulerUnit = app.preferences.rulerUnits; app.preferences.rulerUnits = Units.PIXELS;

// 開いている画像の縦・横の大きさを得る var orig_height = activeDocument.height.value; var orig_width = activeDocument.width.value;

// 入力用ダイアログボックス var uDlg = new Window('dialog','高さ・幅をそろえる'); uDlg.bounds = [200,200,200+300,200+300];

uDlg.rBtnHeight = uDlg.add("radiobutton",[15,10,15+100,10+20], "縦方向を揃える"); uDlg.rBtnWidth = uDlg.add("radiobutton",[15,40,15+100,40+20], "横方向を揃える"); uDlg.rBtnHeight.value = true; // 縦がデフォルト

uDlg.sText1 = uDlg.add("statictext",[15,70,15+100,70+20], "揃える大きさ(px):"); uDlg.ePixels = uDlg.add("edittext",[15+50,85,15+110,85+20], orig_height);

uDlg.okBtn = uDlg.add("button",[240,265,240+50,265+25], "OK", {name:"ok"}); uDlg.show();

var Pixels=parseInt(uDlg.ePixels.text);

if (uDlg.rBtnHeight.value = true){ var current_height = Pixels; var current_width = orig_width * Pixels/orig_height; }else{ var current_height = orig_height * Pixels/orig_width; var current_width = Pixels; }

// 画像の大きさを元に戻す activeDocument.resizeImage(current_width, current_height);

// 元の設定に戻す preferences.rulerUnits = saveRulerUnit; ```

こんな感じ。あと注意点はエンコードはUTF-8で保存することですか... 思ったより簡単に書けたけど、GUIを手で書くのはつらすぎる。なんかいい方法はない …


Continue reading

2004年12月31日 金曜日

Posted on 2004年12月31日 (金) in articles • Tagged with Equipment, PC, Network, HTML, Ruby, Scheme, C++, VBA, Linux, Photo, Portrait, Flower

今日で2004年もおしまい

毎年こんな見出しで大晦日の日記を書いているわけだが、ついこないだ2003年もおしまいどころか2002年もおしまいなんて言う記事を書いた気がするのは気のせいではない。今年は転職・引越しと人生の転機となる大きな変化のあった1年で、住環境や人間関係もがらっと変化して、めまぐるしい変化があった1年だった。気が付くともう今年もおしまい。今年お世話になった方々はいっぱいいて名前を挙げきれないが、今年1年本当にありがとうございました。来年もよろしくお願いします。

大晦日と言うことで、行く年に思いをはせ、今年はどういう戦いの1年だったか、今年の戦術・戦略とその戦いの成果を主要な分野別にまとめておこう。(と、ほぼ毎年と同じ文章にしてみた。こういうのは毎年そろえておいたほうがよいもので、断じて_手抜きではない_。)

2004年の総括

はじめに概況

2004年の戦況がどのようなものであったか述べていくことにする。前の会社の上司の年賀状には_今年は攻めと成果_と書かれていたのだが、個人的には攻めに攻めた1年だったかと思う。アクティブに変化を求めて行動したが、いまいち成果があったとはいえない。まぁ来年あたりから取り返していきたい。今年から技術系よりは研究系に寄った立場になったので、よ …


Continue reading