メシのタネ

メシのタネになる、Laravelや設計思想の技術配信サイト


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

, ,

  1. Windows
  2. Excel
  3. 【ExcelVBA】知らなきゃ困るもの

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

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

変数

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


Dim s AS String

これで変数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文はこうなります。


IF (条件式) then

     Else (条件式) then

     Else

End If

演算子は

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

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

配列

配列の定義は


     Dim s(10) AS String

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

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


    Dim moge() As Long

    ReDim moge(3)

    moge(0) = 1
    moge(1) = 2
    moge(2) = 3

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

     Dim setting As Object

            Set setting = CreateObject(&amp;amp;quot;scripting.dictionary&amp;amp;quot;)
            setting.Add &amp;amp;quot;Pref&amp;amp;quot;, xx県
            setting.Add &amp;amp;quot;City&amp;amp;quot;, &amp;amp;quot;xx市&amp;amp;quot;
            setting.Add &amp;amp;quot;Town&amp;amp;quot;, &amp;amp;quot;xx町&amp;amp;quot;
            setting.Add &amp;amp;quot;Address&amp;amp;quot;, &amp;amp;quot;1-12&amp;amp;quot;

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

で使い終わったら


Set setting = Nothing

開放してあげましょう。

ループ

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


    For Each c In setting

        If c = &amp;amp;quot;pref&amp;amp;quot; Then

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

        End If

    Next

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

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

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

functionで猿を鳴かす例


Sub say()

     Dim say As String
     say = monkey()
     Debug.Print (say)

End Sub

Function monkey()

     '多分returnの変わりに関数名に代入するんだと思います。
     monkey = &amp;amp;quot;ウキッ&amp;amp;quot; 

End Function

subでゴリラを鳴かす例


Sub main()

    animal (&amp;amp;quot;ウホ&amp;amp;quot;)

End Sub

Sub animal(say)

    Debug.Print (say)

End Sub

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


Sub main()

    '引数が二つになるとcallが必要になる。何でかは知らない!
    Call animal(&amp;amp;quot;ウホ&amp;amp;quot;, &amp;amp;quot;ウキ&amp;amp;quot;)

End Sub

Sub animal(say, say1)

    Debug.Print (say)
    Debug.Print (say1)

End Sub

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

エクセルの操作基本

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

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


ActiveWorkbook.Worksheets(&amp;amp;quot;設定&amp;amp;quot;).Activate

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


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

ファイルオープン


 Workbooks.Open &amp;amp;quot;フルパス&amp;amp;quot;

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

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


Workbooks(&amp;amp;quot;ファイル名&amp;amp;quot;).Activate

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

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


            Worksheets(&amp;amp;quot;Sheet1&amp;amp;quot;).Select
            Range(&amp;amp;quot;A1:A37&amp;amp;quot;).Select
            Selection.Copy

           Worksheets(&amp;amp;quot;月次損益計算書&amp;amp;quot;).Select
            Range(&amp;amp;quot;G4:G41&amp;amp;quot;).Select
            ActiveSheet.Paste

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

            ActiveWorkbook.Save
            ActiveWorkbook.Close (False)

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


コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.