最近、卒論関係でデータ処理をしなきゃならなくて、VBSやVBAを書くことが多くなった。WindowsやOfficeちょっとしたことをやりたいなってときは、Cとかと違ってコンパイルする必要もなく、その場で書いてその場で使える。卒論はつらいが、VBAはとても便利だ。PHPばかりやってると、VB系のコードを書いたとき、PHPのくせが出てしまう。よくやるミスとしては↓行末に;を書いてしまう。関数とかを小文字にしてしまう。文字列結合は&であることを忘れて、ドットでつなげてしまう。変数の定義を忘れる。関数がよくわからないときは、とりあえずPHPにある関数を書いてみるが、当たらない。sleepとか、returnとか。自分がよく知ってる言語の習慣を、よく知らない言語にそのまま当てはめることを、言語学でトランスファー(転移)というけれど、プログラミング言語でも同じようなことをしている。関数名が偶然同じで、そのまま処理がとおれば正の転移、エラーが出て起こられた負の転移。言語学は自然言語しか扱わないことになってたんだっけな。言語学のふりして人工言語のことをあれこれ言ってはいけないな。PHPと違う特徴に出会うと、すこし学んだ気がしてくる。たとえば、VBAでもクラスが作れるが、クラス内のメンバ変数にアクセスするとき、PHPの$this->なるものがないというところ。だから、メソッド内で変数がメンバ変数なのか、それともメソッド内のただの変数だかわからなくなる。そこでハンガリアン記法が有効になる。m_というので、これはメンバ変数ですよ、ということを明らかにする習慣が生まれる。同じようなことを、XOOPSCubeのコーディング規約でメンバ変数の接頭辞はmとするというのがあるけれど、PHPではあまり意味がないかな。個人的には接頭辞をつけるのは好きなのだけれど。Class A'メンバ変数Private m_B As Integer' 関数Public Function GetB()GetB = m_BEnd Function' サブルーチンPublic Sub SetB(B As Integer)m_B = BEnd SubVBAだと、関数のほかに、サブルーチンというのが定義できる。関数とサブルーチンってなにが違うの?って感じだが、関数は値を返すが、サブルーチンは値を返さないという違いがある。サブルーチンという概念がPHPでは無い。無いと断言していいのかわからないが、少なくとも、VBAみたいに形態に現れてこない。こういうところも実におもしろい。自然言語でも、複数形とか名詞の性にうるさい西洋語があったり、敬語にうるさい日本語や韓国語があったりと、言語ごとに関心事がちがうのとおなじで、人工言語でもその言語によって、関心の持ち方が微妙に違う。PHPみたいに型にうるさくない言語を使っていると、型にうるさい言語で、よくつまづくようになる。文字列と思っていたら、数値だったり。"0"と0の違いはPHPが思ってるほど単純じゃなかったり。ずっと型を意識していると、PHPでももう少し型について厳しく接してもいいんじゃないかと思うようになってくる。でもやっぱり、PHPのルーズさってどうも嫌いになれない。型が勝手に判断されて、泣きたくなることもあるけど、それでも型を気にしないで書きたいときはそうできるからいいというとこもある。一長一短というところか。VBAとは話が変わるが、自分には「あこがれの言語」というものがある。自然言語ならロシア語、人工言語ならC#。そして、先日、ついにあのあこがれの言語C# をちょっと触ってみた。気分転換程度ののりだったので、HelloWorldしてひとりで盛り上がっていた。コンパイル言語はどうしても、そのワンステップのために近づきがたかった。C言語をやろうとして、開発用のソフトが高くて諦めたのは中学生のころだっただろうか。今とそのときじゃ比べものにならないくらいフリーな開発環境が増えた気がする。C#はJava系の影響をうけているから、VBAよりは親近感あるかな。今度ローカルで使うアプリを作るときはC#でやってみよう。C#が一人前に書けるころにはロシア語もぺらぺらになってるかな。
「MT4でコメントを投稿できないときの解決策 | My Color 「ダンクハーツ-谷春樹Blog-」」を読んで、「設定」→「登録/認証設定」→「認証方式」で承認無しコメントにもチェックを入れないと、ゲストからの投稿ができないと言うことを初めて知った。いままで全然コメントがつかなかったのは、記事がつまらなかったのもあると思うけど、はなから匿名で投稿ができなかったからということか〜。もう少しわかりやすく実装できなかったのかな・・・。使い始めて半年すぎてからわかるなんて・・・。
エクセルでは選択した部分だけを再計算する仕組みがないことを、「エクセルで選択範囲だけ再計算するようにするマクロ」で述べ、選択した範囲だけを再計算するマクロを紹介しました。当然ながら、再計算する量が増えるとそのぶん時間もかかります。何十秒で再計算が完了するような処理だと、すぐに結果が得られるので待ちきれないことはないですが、さすがに数分〜数十分かかるような処理だと、進行状況がわからないと、エクセルがフリーズしたのではないかと不安になりがちです。そこで、選択範囲だけ再計算するマクロをさらに改良し、選択した部分を崔英さんしつつ、進度状況をステータスバーに表示するマクロを作成しました。これを利用すると、現在どこまで作業したのかがパーセンテージで分かるようになり、長時間かかる処理でも不安が軽減されます。ステータスバーはこんな感じです。ソースは以下のようになります。コピーしてモジュールにペーストしてください。Sub 選択部分再計算()Dim Total As IntegerDim Counter As IntegerTotal = Selection.Cells.CountCounter = 1For Each SelectedCell In SelectionSelectedCell.CalculateCounter = Counter + 1Application.StatusBar = "しばらくお待ちください。再計算しています。 " & ProgressView(Counter, Total)NextApplication.StatusBar = FalseMsgBox ("再計算が完了しました。")End SubFunction ProgressView(Now As Integer, Total As Integer)Dim Per As IntegerDim Msg As StringDim Bar As StringPer = Int(Now / Total * 100)Select Case PerCase Is >= 90Bar = "**********"Case Is >= 80Bar = "*********_"Case Is >= 70Bar = "********__"Case Is >= 60Bar = "*******___"Case Is >= 50Bar = "******____"Case Is >= 40Bar = "*****_____"Case Is >= 30Bar = "***_______"Case Is >= 20Bar = "**________"Case Is >= 10Bar = "*_________"Case ElseBar = "__________"End SelectMsg = " | " & Bar & " | " & Per & "% | " & Now & " in " & Total & " | "ProgressView = MsgEnd Function
「エクセルで正規表現を使いたい。」そんな要望は意外と多いと思いますが、エクセルでは標準で正規表現の関数が用意されていないのです。そのため、ワークシート上で、ちょっとした正規表現が使えれば、用が足りてしまいそうな検索や置換といった処理が大変面倒になってしまいます。エクセルでも、正規表現が使えたらいいのになあと思っていたら、自前の関数を定義してしまえば、エクセルでも正規表現が使えるということがわかりました。Excel2007でのおもな手順は次のとおりです。「開発」→「Visual Basic」をクリックウインドウが出たら、「挿入」→「標準モジュール」次のコードをそこにコピペするFunction RegReplace(Regex, Replace, TargetText) Dim re As RegExp Set re = New RegExp re.Pattern = Regex RegReplace = re.Replace(TargetText, Replace)End FunctionFunction RegMatch(Regex, TargetText) Dim re As RegExp Set re = New RegExp re.Pattern = Regex RegMatch = re.Test(TargetText)End Functio最後に、ワークシートに戻り任意のセルに「=RegMatch()」「=RegReplace()」関数を入力する。つづいて、関数の使い方を説明します。RegMatch(Regex, TargetText)引数1 Regex : 正規表現を記述します。引数2 TargetText : 対象文字列。マッチするかどうかを調べたい文字列を割り当てます。もちろん、セル番地でもかまいません。戻り値 BoolRegReplace(Regex, Replace, TargetText)引数1 Regex : 置換ルールを正規表現で記述します。引数2 Replace : 置換後の文字列を記述します。$1なども使えます。引数3 TargetText : 対象文字列。置換する文字列を割り当てます。セル番地可。これでエクセルで、正規表現がつかえるようになったのではないかと思います。注意しなければならないのが、エクセルでの正規表現は非常に重く、時間がかかるという点です。スペックの低いコンピュータでは、正規表現の処理にかなり時間がかかります。特に、エクセルはデフォルトで再計算を実行してしまうので、再計算を手動にするように設定を変更するなどして、工夫する必要があるかとおもいます。