<?xml version="1.0" encoding="UTF-8" ?>
<rss version="2.0">
<channel>
<title>スイナシア(VBA)</title>
<link>http://suin.asia/tag/VBA</link>
<description>「VBA」なエントリー</description>
<language>ja</language>
<lastBuildDate>Fri, 10 Sep 2010 15:01:01 +0900</lastBuildDate>
<docs>http://backend.userland.com/rss/</docs>
<category>VBA</category>
<item>
<title>VBAを書いててPHPが懐かしくなった（涙）</title>
<link>http://suin.asia/2009/01/02/vba-php.html</link>
<description><![CDATA[ <p>最近、卒論関係でデータ処理をしなきゃならなくて、VBSやVBAを書くことが多くなった。WindowsやOfficeちょっとしたことをやりたいなってときは、Cとかと違ってコンパイルする必要もなく、その場で書いてその場で使える。卒論はつらいが、VBAはとても便利だ。</p>

<p>PHPばかりやってると、VB系のコードを書いたとき、PHPのくせが出てしまう。よくやるミスとしては↓</p>
<ul>
<li>行末に；を書いてしまう。</li>
<li>関数とかを小文字にしてしまう。</li>
<li>文字列結合は＆であることを忘れて、ドットでつなげてしまう。</li>
<li>変数の定義を忘れる。</li>
<li>関数がよくわからないときは、とりあえずPHPにある関数を書いてみるが、当たらない。sleepとか、returnとか。</li>
</ul>
<p>自分がよく知ってる言語の習慣を、よく知らない言語にそのまま当てはめることを、言語学でトランスファー（転移）というけれど、プログラミング言語でも同じようなことをしている。関数名が偶然同じで、そのまま処理がとおれば正の転移、エラーが出て起こられた負の転移。言語学は自然言語しか扱わないことになってたんだっけな。言語学のふりして人工言語のことをあれこれ言ってはいけないな。</p>
<p>PHPと違う特徴に出会うと、すこし学んだ気がしてくる。</p>

<p>たとえば、VBAでもクラスが作れるが、クラス内のメンバ変数にアクセスするとき、PHPの$this-&gt;なるものがないというところ。だから、メソッド内で変数がメンバ変数なのか、それともメソッド内のただの変数だかわからなくなる。そこでハンガリアン記法が有効になる。m_というので、これはメンバ変数ですよ、ということを明らかにする習慣が生まれる。同じようなことを、XOOPS
Cubeのコーディング規約でメンバ変数の接頭辞はmとするというのがあるけれど、PHPではあまり意味がないかな。個人的には接頭辞をつけるのは好きなのだけれど。</p>
<pre>Class A

'メンバ変数
Private m_B As Integer

' 関数
Public Function GetB()

        GetB = m_B

End Function

' サブルーチン
Public Sub SetB(B As Integer)

        m_B = B

End Sub</pre>
<p>VBAだと、関数のほかに、サブルーチンというのが定義できる。関数とサブルーチンってなにが違うの？って感じだが、関数は値を返すが、サブルーチンは値を返さないという違いがある。サブルーチンという概念がPHPでは無い。無いと断言していいのかわからないが、少なくとも、VBAみたいに形態に現れてこない。こういうところも実におもしろい。</p>
<p>自然言語でも、複数形とか名詞の性にうるさい西洋語があったり、敬語にうるさい日本語や韓国語があったりと、言語ごとに関心事がちがうのとおなじで、人工言語でもその言語によって、関心の持ち方が微妙に違う。</p>
<p>PHPみたいに型にうるさくない言語を使っていると、型にうるさい言語で、よくつまづくようになる。文字列と思っていたら、数値だったり。"0"と0の違いはPHPが思ってるほど単純じゃなかったり。</p>
<p>ずっと型を意識していると、PHPでももう少し型について厳しく接してもいいんじゃないかと思うようになってくる。でもやっぱり、PHPのルーズさってどうも嫌いになれない。型が勝手に判断されて、泣きたくなることもあるけど、それでも型を気にしないで書きたいときはそうできるからいいというとこもある。一長一短というところか。</p>
<p>VBAとは話が変わるが、自分には「あこがれの言語」というものがある。自然言語ならロシア語、人工言語ならC#。そして、先日、ついにあのあこがれの言語
C# をちょっと触ってみた。気分転換程度ののりだったので、HelloWorldしてひとりで盛り上がっていた。コンパイル言語はどうしても、そのワンステップのために近づきがたかった。C言語をやろうとして、開発用のソフトが高くて諦めたのは中学生のころだっただろうか。今とそのときじゃ比べものにならないくらいフリーな開発環境が増えた気がする。C#はJava系の影響をうけているから、VBAよりは親近感あるかな。今度ローカルで使うアプリを作るときはC#でやってみよう。C#が一人前に書けるころにはロシア語もぺらぺらになってるかな。</p>
]]></description>
<pubDate>Fri, 02 Jan 2009 00:47:54 +0900</pubDate>
<guid>http://suin.asia/2009/01/02/vba-php.html</guid>
<category domain="http://suin.asia/tag/Web">Web</category>
<category domain="http://suin.asia/tag/VBA">VBA</category>
</item>
<item>
<title>選択した部分だけ再計算し進度状況がわかるマクロ</title>
<link>http://suin.asia/2008/12/20/progress-bar.html</link>
<description><![CDATA[エクセルでは選択した部分だけを再計算する仕組みがないことを、「<a href="http://suin.asia/2008/12/17/recalculate-macro.html">エクセルで選択範囲だけ再計算するようにするマクロ</a>」で述べ、選択した範囲だけを再計算するマクロを紹介しました。<div><br /></div><div>当然ながら、再計算する量が増えるとそのぶん時間もかかります。何十秒で再計算が完了するような処理だと、すぐに結果が得られるので待ちきれないことはないですが、さすがに数分～数十分かかるような処理だと、進行状況がわからないと、エクセルがフリーズしたのではないかと不安になりがちです。</div><div><br /></div><div>そこで、選択範囲だけ再計算するマクロをさらに改良し、選択した部分を崔英さんしつつ、進度状況をステータスバーに表示するマクロを作成しました。これを利用すると、現在どこまで作業したのかがパーセンテージで分かるようになり、長時間かかる処理でも不安が軽減されます。</div><div><br /></div><div>ステータスバーはこんな感じです。</div>
<a href="http://picasaweb.google.co.jp/lh/photo/EIHqbAD-nf3hvpmxuFZbaw?feat=embedwebsite"><img src="http://lh6.ggpht.com/_dG0BBWAhWis/SUyyM4223CI/AAAAAAAAAVE/16U6nieUWxY/s400/status_bar.png" /></a>
<div>ソースは以下のようになります。コピーしてモジュールにペーストしてください。</div>
<script src="http://www.bytemycode.com/api/blogit/877/1/" type="text/javascript"></script>

<noscript><pre><code class="VBA">Sub 選択部分再計算()

    Dim Total As Integer
    Dim Counter As Integer
    
    Total = Selection.Cells.Count
    Counter = 1

    For Each SelectedCell In Selection
    
        SelectedCell.Calculate
        
        Counter = Counter + 1
        
        Application.StatusBar = "しばらくお待ちください。再計算しています。 " &amp; ProgressView(Counter, Total)
    
    Next

    Application.StatusBar = False
    
    MsgBox ("再計算が完了しました。")

End Sub

Function ProgressView(Now As Integer, Total As Integer)

    Dim Per As Integer
    Dim Msg As String
    Dim Bar As String

    Per = Int(Now / Total * 100)

    Select Case Per
        Case Is >= 90
            Bar = "**********"
        Case Is >= 80
            Bar = "*********_"
        Case Is >= 70
            Bar = "********__"
        Case Is >= 60
            Bar = "*******___"
        Case Is >= 50
            Bar = "******____"
        Case Is >= 40
            Bar = "*****_____"
        Case Is >= 30
            Bar = "***_______"
        Case Is >= 20
            Bar = "**________"
        Case Is >= 10
            Bar = "*_________"
        Case Else
            Bar = "__________"
    End Select

    Msg = " | " &amp; Bar &amp; " | " &amp; Per &amp; "% | " &amp; Now &amp; " in " &amp; Total &amp; " | "

    ProgressView = Msg
    
End Function</code></pre></noscript>]]></description>
<pubDate>Sat, 20 Dec 2008 17:40:41 +0900</pubDate>
<guid>http://suin.asia/2008/12/20/progress-bar.html</guid>
<category domain="http://suin.asia/tag/%E3%81%9D%E3%81%AE%E4%BB%96">その他</category>
<category domain="http://suin.asia/tag/VBA">VBA</category>
</item>
<item>
<title>エクセルで選択範囲だけ再計算するようにするマクロ</title>
<link>http://suin.asia/2008/12/17/recalculate-macro.html</link>
<description><![CDATA[何万件といったデータが入ったシートで、再計算を行うと、非常に時間がかかる場合があります。エクセルは親切にもセルの値が修正された段階で、自動的に再計算してくれます。しかし、このような仕様ですと、大量の計算が始まってしまい、作業が一向に進みません。<br /><br />そのような問題の解決策としては、「オプション」→「数式」→「計算方法の設定」で「ブックの計算」の設定を「手動」にしておくという方法があります。「手動」に設定すると、再計算は自動的に行われず「F9」を押したときのみ行われるようになります。ある意味これだけでもひと安心できます。<br /><br />私は、再計算したいセルを選択してF9を押せば、選択した範囲だけが再計算されると思っていました。ところが、実際は選択した範囲とは関係なく、シート全体が再計算されていたことに気がつきました。これはエクセルの仕様なので、これ以上どうすこともできません。<br /><br />そこで、選択した範囲だけ再計算するシンプルなマクロを作りました。<br />
<script src="http://www.bytemycode.com/api/blogit/870/1/" type="text/javascript"></script>
<noscript><pre><code>
Sub RecalculateSelection()
    Selection.Calculate
End Sub
</code></pre></noscript>
上のマクロをショートカットキーで指定しておくと非常に便利です。<br />]]></description>
<pubDate>Wed, 17 Dec 2008 13:10:08 +0900</pubDate>
<guid>http://suin.asia/2008/12/17/recalculate-macro.html</guid>
<category domain="http://suin.asia/tag/%E3%81%9D%E3%81%AE%E4%BB%96">その他</category>
<category domain="http://suin.asia/tag/VBA">VBA</category>
</item>
<item>
<title>VBAでランダムな文字列を生成する関数</title>
<link>http://suin.asia/2008/12/15/vba-random-letters.html</link>
<description><![CDATA[ランダムな文字列を生成する関数です。エクセルなどでパスワードを生成するなどの用途に用います。<br /><!--
Public Function pass(Optional intLength As Integer = 8, Optional boolIncUpper As Boolean = False, Optional boolIncSign As Boolean = False)

    Dim strPass As String
    Dim strLower As String
    Dim strUpper As String
    Dim strNumber As String
    Dim strSign As String
    Dim strChars As String
    Dim intMax As Integer
    Dim i As Integer
    
    strLower = "qwertyuiopasdfghjklzxcvbnm"
    strUpper = "QWERTYUIOPASDFGHJKLZXCVBNM"
    strNumber = "123456789"
    strSign = "-^@[;:],./!""#$%&'()=~|`{+*}<>?_"

    strChars = strLower & strNumber

    If boolIncUpper = True Then
    
        strChars = strChars & strUpper
    
    End If
    
    If boolIncSign = True Then
    
        strChars = strChars & strSign
        
    End If

    intMax = Len(strChars)
    
    For i = 1 To intLength
    
        strPass = Mid(strChars, Int((intMax - 1 + 1) * Rnd + 1), 1) & strPass
    
    Next i

    pass = strPass

End Function
-->
<script src="http://www.bytemycode.com/api/blogit/869/1/" type="text/javascript"></script>]]></description>
<pubDate>Mon, 15 Dec 2008 20:57:42 +0900</pubDate>
<guid>http://suin.asia/2008/12/15/vba-random-letters.html</guid>
<category domain="http://suin.asia/tag/%E3%81%9D%E3%81%AE%E4%BB%96">その他</category>
<category domain="http://suin.asia/tag/VBA">VBA</category>
</item>
</channel>
</rss>