メシのタネ

Webプログラミング 備忘録

  • DOMをPHPで操作できたらいいよね

    そうだよね。そう思うよね。JavaScriptでやると、画面がガタついたりするもんね。そうならないようにする方法もあるかもしれないけど、僕はできませんので、サーバー側でなんとかできたらええなぁと思って挑戦したけど、できませんでしたよ。PHP標準でHTMLをDOMにできるらしい今、技[...]

    続きを読む
  • 設計書ってなんで書くの?

    設計書をなぜ書くのかから始めてかれこれ3年近くこの禅問答をやっているわけですが、いまだに答えは出ません。ただ、その禅問答をやる中で設計書に対する取り組み方は大きく変わったので、その一部でも書いていきたい。基本設計はとにもかくにも必要だと思う設計書はいらぬ!という話をよく聞くし、自分[...]

    続きを読む
  • 書ききってやる。

    久々に書いてみる。久々に文章を書くということをやってみようと思う。伝える作業を観察したいと思ったからそうしたいと考えた。情緒的な文章は基本的にゴミ箱にぽいしてきましたが、情緒的なのも自分だと思う。「文章をかくという作業は、とりもなおさず自分と自分をとりまく事物との距離を確認すること[...]

    続きを読む
  • 普通の会社で2年普通に働いて思う事

    えらい寒くなりました。文句言いながらも現職を続けて2017年12月1日にめでたく2年がたちました。分かりやすいが乱暴に言えばITドカタと呼ばれる業界に入って案件のヒエラルキーの無慈悲さを痛感しながらも、それでもしょうがないと頑張る人たちに心を打たれながら「じゃあ俺も」と頑張れない自分に挫折して、とあ[...]

    続きを読む
  • jQueryUiのDatepicker利用時にminDate設定するとバグる件

    題名の通りなんですが、DatepickerでminDate使うとバグります。また後でキャプチャ見て貰いますけど、灰色の部分が、minDateで設定した日付が反復して出るようになるんですね。こういうの気が付かない人がいるかも知れませんが、ChoromeでminDate設定してる人は気にしてみてくだ[...]

    続きを読む

【ExcelVBA】知らなきゃ困るもの

PP_gear-a_12

会社でマクロ組むことになりました。
でも僕の名刺の肩書きはWebデザイナーです。
この会社入って3年くらいですけど、
Webデザインは仕事で2回くらいしかやったことありませんがね。
そんな訳で迷走ついでにVBAVBAさっさとVBAです。ほんと。

VBAっていうのはExcelとかAccessについてるアプリの言語です。
普通に提供されてる機能だけじゃ物足りないからオリジナルで
Excelやaccessの機能実装してやるぜみたいな人の為の言語じゃないかと思います。
しかし物足りなくなるのは多くの場合、自分ではないんですが、
物足りなくなる人は多いようで、詳しい説明が書いてあるサイトは沢山あります。
もしかしたらPHPより多いかもしれないくらい。
やーやー言う人は居ますが、沢山の人に親しまれてる言語なんだなぁと思いました。
というわけで、マクロを組むにあたり、知らないと困るものを書いていきます。

変数

とりあえずマクロってどーはじめるのって人は
こちらの記事を読んで頂きたくおもいます。

</p>
<p>Dim s AS String</p>
<p>

これで変数sが使えるようになります。
このDimはDimensionの略で
As Stringは文字列でAを定義したよって意味です。
定義できる型は

Variant (全データ)
Byte (0~255)
Integer (-32,768~32,767の整数)
Long (-2,147,483,648~2,147,483,647の整数)
Currency (-922,337,203,685,477.5808 ~ 922,337,203,685,477.5807の固定小数点数)
Single (負の値:約-3.4×10(38乗)~-1.4×10(-45乗),正の値:約1.4×10(-45乗)~1.8×10(38乗))
Double (負の値:約-1.8×10(308乗)~-4.0×10(-324乗),正の値:約4.9×10(-324乗)~1.8×10(308乗))
Date (日付:西暦100年1月1日~西暦9999年12月31日)
String (文字列)
Object (オブジェクト)
Boolean (真偽値)

となってます。
整数を入れる場合はIntegerではなくLongが一般的だそうです。

IF

IF文はこうなります。

</p>
<p>IF (条件式) then</p>
<p>     Else (条件式) then</p>
<p>     Else</p>
<p>End If</p>
<p>

演算子は

= 等しい
<> 等しくない
And 右辺と左辺の条件両方を満たす
Or 右辺か左辺どちらか一方の条件を満たす
Not 条件式を満たさない

これ以外はよくあるやつです。

配列

配列の定義は

</p>
<p>     Dim s(10) AS String</p>
<p>

ってやれば10個の配列が出来ます。

動的に配列を定義したい場合は

</p>
<p>    Dim moge() As Long</p>
<p>    ReDim moge(3)</p>
<p>    moge(0) = 1<br />
    moge(1) = 2<br />
    moge(2) = 3</p>
<p>

配列に代入する前に再定義してやる必要があります。
連想配列みたいな奴を作りたいなら

<br />
     Dim setting As Object</p>
<p>            Set setting = CreateObject(&quot;scripting.dictionary&quot;)<br />
            setting.Add &quot;Pref&quot;, xx県<br />
            setting.Add &quot;City&quot;, &quot;xx市&quot;<br />
            setting.Add &quot;Town&quot;, &quot;xx町&quot;<br />
            setting.Add &quot;Address&quot;, &quot;1-12&quot;</p>
<p>

こんな感じでやると良いみたいです。
ただscripting.dictionaryを使えるようにする必要があります。
でも大体の場合最初から使えるようになってるので気にしなくても良いでしょう。

で使い終わったら

</p>
<p>Set setting = Nothing</p>
<p>

開放してあげましょう。

ループ

ForEachしか使ってないのでさっきの連想配列を例にとって
特定の文字列を条件にとって、文字列の変換を行うサンプルを書きます。

</p>
<p>    For Each c In setting</p>
<p>        If c = &quot;pref&quot; Then</p>
<p>'Indexがprefで中身が愛知県の場合<br />
           If setting(c) = &quot;愛知県&quot; Then<br />
'その配列を削除して<br />
                setting.Remove c<br />
'もっかい定義する<br />
                setting.Add c, 1<br />
           End If</p>
<p>        End If</p>
<p>    Next</p>
<p>

PHPなら上書きできたりしますが、
vbaだと出来ないので再定義する必要があるそうです。

subプロシージャとfunctionプロシージャ

要は値を返すか返さないかです。(自分の調べた限り)

functionで猿を鳴かす例

</p>
<p>Sub say()</p>
<p>     Dim say As String<br />
     say = monkey()<br />
     Debug.Print (say)</p>
<p>End Sub</p>
<p>Function monkey()</p>
<p>     '多分returnの変わりに関数名に代入するんだと思います。<br />
     monkey = &quot;ウキッ&quot; </p>
<p>End Function</p>
<p>

subでゴリラを鳴かす例

</p>
<p>Sub main()</p>
<p>    animal (&quot;ウホ&quot;)</p>
<p>End Sub</p>
<p>Sub animal(say)</p>
<p>    Debug.Print (say)</p>
<p>End Sub</p>
<p>

subでゴリラと猿を鳴かす例

</p>
<p>Sub main()</p>
<p>    '引数が二つになるとcallが必要になる。何でかは知らない!<br />
    Call animal(&quot;ウホ&quot;, &quot;ウキ&quot;)</p>
<p>End Sub</p>
<p>Sub animal(say, say1)</p>
<p>    Debug.Print (say)<br />
    Debug.Print (say1)</p>
<p>End Sub</p>
<p>

引数が二つになった時に
sub使いたいときはcallってのをつけないとダメみたいです。

エクセルの操作基本

今回はAccessでなくてExcelのマクロ作ったので
簡単なエクセルの操作もやりました。
よく使いそうなのを書いていきます。

指定のsheetを選択(アクティブに)する

</p>
<p>ActiveWorkbook.Worksheets(&quot;設定&quot;).Activate</p>
<p>

設定っていうシートをアクティブにしています。

</p>
<p>Dim filepath As String<br />
filepath = Cells(2, 3)<br />
'2行目の3列目なんでCの2が選択されます。<br />
filepath = Cells(1, 1)<br />
'これはAの1です。<br />

ファイルオープン

</p>
<p> Workbooks.Open &quot;フルパス&quot;</p>
<p>

フルパスで書かないとダメみたいです。

指定のExcelをアクティブにする

</p>
<p>Workbooks(&quot;ファイル名&quot;).Activate</p>
<p>

指定のファイルをアクティブにすることもできます。

sheet1のA1~A37をコピーして指定先へコピー

</p>
<p>            Worksheets(&quot;Sheet1&quot;).Select<br />
            Range(&quot;A1:A37&quot;).Select<br />
            Selection.Copy</p>
<p>           Worksheets(&quot;月次損益計算書&quot;).Select<br />
            Range(&quot;G4:G41&quot;).Select<br />
            ActiveSheet.Paste</p>
<p>

ワークブックを保存して確認なしで閉じる

<br />
            ActiveWorkbook.Save<br />
            ActiveWorkbook.Close (False)<br />

全部書いてやろと思ったけど、
以外に量があったので、また今度書きたくなったらやりますう。
全体的に駆け足になってしまいましたが、誰かが助かってくれれば幸いです。
Functionは初見だと、ハメられるので、てこずりました・・・。

関連記事

コメントをお待ちしております