【Excelマクロ(VBa)】[変数]構造体について


 構造体とは


人・会社・物 等を表すのに、色々な情報があります。

会社を例に取ってみると、会社コード・会社名・設立年月日・資本金・郵便番号・住所・電話番号・FAX番号・・など様々な情報があります。

これらを単純に変数で定義しようとすると以下のようになります。

Dim strCompanyCode As String '会社コード
Dim strCompanyName As String '会社名
Dim dtEstablishment As Date '設立年月日
Dim curCapital As Currency '資本金
Dim strPostNo As String '郵便番号
Dim strAddress As String '住所
Dim strTEL As String '電話番号
Dim strFAX As String 'FAX番号
     ・
     ・

このように個々に書くと、それぞれの関連性が分かりにくくなり、「変数設定忘れ」「重複変数設定」「データの更新し忘れ」・・などのリスクがあります。

これらの変数の情報を会社で括ると非常に見やすくなります。
具体的には下記のように記述します。

'[構造体]会社
Type typCompany
  strCompanyCode As String '会社コード
  strCompanyName As String '会社名
  dtEstablishment As Date '設立年月日
  curCapital As Currency '資本金
  strPostNo As String '郵便番号
  strAddress As String '住所
  strTEL As String '電話番号
  strFAX As String 'FAX番号
       ・
       ・
End Type

Dim stCompany As typCompany '会社

これだけだとピンとこないかもしれませんが、構造体を設定する事で、全て会社に紐づけられた状態となります。

新たに変数を設定する場合、Type typCompany ~ End Typeまでをチェックすれば、会社として定義すべき変数が網羅されているか、二重登録されていないかチェックしやすくなります。

また、電話番号やFAX番号は会社だけではなく、自社の組織や個人情報としても持っています。今回、電話番号の変数は strTEL と設定しましたが、「会社」で括らなければ何の電話番号か分からなくなります。変数に 会社・組織・人・・・を入れると、変数名だけで非常に長く、管理が大変になり、変数名のネーミングルールや管理が非常に大変となります。



 構造体と配列の組み合わせ


構造体は、配列と組み合わせて使う事で最も効果的な使い方となります。(配列については「[変数]配列について」参照)

システムで処理を行う場合、複数レコードを扱う事が一般的で、取引のある会社は1社だけではありません。

処理する会社を都度データベースから読み込んで処理を行う方法も考えられますが、I/Oは処理レスポンスが悪いため、都度I/Oが発生する処理は極力控えた方が良いです。

上記を例に構造体を配列(10万件)で定義すると、下記のようになります。

'[構造体]会社
Type typCompany
  strCompanyCode As String '会社コード
  strCompanyName As String '会社名
  dtEstablishment As Date '設立年月日
  curCapital As Currency '資本金
  strPostNo As String '郵便番号
  strAddress As String '住所
  strTEL As String '電話番号
  strFAX As String 'FAX番号
       ・
       ・
End Type

Dim stCompany(100000) As typCompany '会社

このように設定し、配列の数値を変える事で、その会社の情報が管理出来るようになります。



 構造体の使い方


構造体の変数を使う場合は、構造体.変数 とします。
配列を使っている場合は、構造体(カウント数).変数 とします。

電話番号を例にすると下記の様に記述します。

stCompany.strTEL = "03-1234-5678" '配列ではない場合
stCompany(0).strTEL = "03-1234-5678" '配列の場合



 構造体の初期化


変数が多くなる程1つ1つ初期化するのは大変です。例えば「実行」ボタンを押した後、再度「実行」ボタンを押して再処理を行う場合、1回目のデータが残ったままになり障害に繋がるケースがあります。

構造体の場合、項目数が多いので一括でクリア(初期化)したいのですが、そういう関数は用意されていなさそうなので、下記のように実際に使う構造体と初期化用の構造体を作成し、初期化する時は初期化用の構造体で上書きします。

Dim stCompany As typCompany '実際に使う構造体
Dim del_stCompany As typCompany '初期用の構造体

stCompany.strTEL = "03-1234-5678" '値をセット
MsgBox stCompany.strTEL 'セットした値を表示

stCompany = del_stCompany '初期化
MsgBox stCompany.strTEL '初期化された事を確認

一方、構造体に配列を使っている場合、配列の初期化 Erase を使う事ができます。

Dim stCompany(10) As typCompany '配列化した構造体

stCompany(0).strTEL = "03-1234-5678" '値をセット
MsgBox stCompany(0).strTEL 'セットした値を表示

Erase stCompany '初期化
MsgBox stCompany(0).strTEL '初期化された事を確認



カテゴリー: VBa(Excelマクロ), システム開発 | コメントする

【Excelマクロ(VBa)】[変数]配列について


 配列とは


変数は「定義した文字(変数)に可変する色々な値を一時的に保管する入れ物」であり「型が重要」と説明しました。(「定数と変数について」参照)

例えば3人[定数]のテストの点数を変数に入れて平均(整数)を出す場合、変数をどのように定義したら良いでしょうか?

何も考えずに機械的に変数を定義するならば、下記の様に記載するかもしれません。

Const cnstNumber As Integer = 3 '[定数]人数
Dim int1, int2, int3 As Integer '[変数]3人のテストの点
Dim intAverage As Integer '[変数]平均

人数が増えるだけ変数が増えるとすると、処理が非常に大変でミスが発生しやすくなります。

上記の例で10人分の処理をしようと変数の定義をすると以下のようになります。100人だと書ききれません。

Const cnstNumber As Integer = 10 '[定数]人数
Dim int1, int2, int3, int4, int5, int6, int7, int8, int9, int10 As Integer '[変数]10人のテストの点(増加分)
Dim intAverage As Integer '[変数]平均

このような場合に配列を使い「テストの点」という10個の入れ物(変数)を用意します。記述の仕方は下記の通りで括弧()の中に10と書きます。

Dim intTestPoint(10) As Integer '[変数]10人のテストの点


しかし、使い方は下記のように0から開始するので9で終わります。

intTestPoint(0) = 10 '1人目のテストの点
intTestPoint(1) = 20 '2人目のテストの点
intTestPoint(2) = 30 '3人目のテストの点
  ・
  ・
intTestPoint(9) = 100 '10人目のテストの点


 配列によるメリット


変数を配列にする事で、変数定義が楽になるだけではなく、実際の処理も非常に効率が良くなります。

平均を求める処理だったので10人の場合の処理を書くと下記のようになります。

▽ 配列を使わない場合
'10人のテストの平均点(整数)
intAverage = (int1 + int2 + int3 + int4 + int5 + int6 + int7 + int8 + int9 + int10) / cnstNumber

▽ 配列を使った場合(ループ処理に使っている intLoopCNT は別途変数定義が必要)
'10人のテストの合計点
for intLoopCNT = 0 to cnstNumber - 1
  intAverage = intAverage + intTestPoint(intLoopCNT)
next intLoopCNT

'10人のテストの平均点(整数)
intAverage = intAverage / cnstNumber

初心者には「配列を使わない場合」の方が単純に見えるかもしれませんが、人数が増えれば変数が増えてプログラムの修正が多く発生しますので、プログラムの拡張性も損なわれます。

是非配列の使い方を覚えて活用しましょう。



カテゴリー: VBa(Excelマクロ), システム開発 | コメントする

【Excelマクロ(VBa)】ローカル変数とグローバル変数について


 ローカル変数とグローバル変数


変数には、関数内(Sub~End Sub)でしか使えないローカル変数とプログラム内(1ファイル内のExcelマクロ)で使えるグローバル変数の2種類があります。

管理人がプログラムを始めた頃は、1プログラムをどのような関数の構成にするか見通せなかった事と、どんな変数・型が必要か読めなかった事もあり、試行錯誤しながら開発していました。

従って、関数毎にいちいち変数定義をしなければならない苦痛さから「全てグローバル変数にしてしまえ!」と乱暴な考え方をした時期がありました。(実際にはやりませんでしたが・・)

しかし、複雑なプログラムの小さな関数の中でしか使われない変数をグローバル化する意味はなく無駄なメモリを確保する等、デメリットしかありません。

Excelマクロ(VBa)は変数定義をしなくても変数として利用できる場合があり、初心者にはとっつき易い開発環境ですが、この環境に慣れてしまわないように変数定義は厳密にしましょう。[途中で型を変えたりすると影響箇所が大きいです!]



 ローカル変数の設定方法


ローカル変数は Sub ~ End Sub の中に [ Dim 定義した文字 As 型 ] で設定します。
定義した文字は、下記 intX, intY のようにカンマ区切りで複数定義する事ができます。

Sub test()
  Dim intX, intY As Integer '数値X, 数値Y
  Dim strUserID As String 'ユーザーID
     ・
     ・
End Sub



 グローバル変数の設定方法


グローバル変数は Dim の代わりに Globalを使い、 [ Global 定義した文字 As 型 ] で設定します。なお、グローバル定数は[ Global Const 定義した文字 [As 型] = (不変な)値 ]で設定します(参考「定数と変数について」)

定義する場所ですが、Microsoft Excel Objectsの中(Sheet や Book)の中に定義しようとすると、コンパイルエラーが発生します。(例として strTest という文字列変数を作成します)

  

エラーの内容は「定数、固定長文字列、配列、ユーザー定義型およびDeclareステートメントは、オブジェクトモジュールのパブリック メンバーとしては使用できません。」というものです。

  

従って、まず標準モジュールを作成します。
作成方法は、[プロジェクト エクスプローラー](表示されていなければ[表示]メニューから[プロジェクト エクスプローラー]を選択)上で右クリックを押し、[挿入] - [標準モジュール] を選択します。

  

[標準モジュール]のフォルダに[Module1]が作成されるので、その中にグローバル変数定義を行います。

  

これで、このExcelマクロ内ならば何処でも strTest という文字列変数を利用する事が可能となりました。



カテゴリー: VBa(Excelマクロ), システム開発 | コメントする

【ポケモンGO】アドベンチャーウィーク開催!(2018年)



2017年も開催されたアドベンチャーウィークが、2018年も開催されます!

開催時期は下記の通りです。

  日時 : 2018年5月25日 ~ 2018年6月5日


余り見かけない「リリーラ」「アノプス」「ココドラ」が沸くようです!(公式サイト)
(ひょっとしたら色違いも?!)

2017年の時は、当時余り見かけなかった「イシツブテ」「カブト」「サイホーン」が大量発生し、超レアな「プテラ」「ヨーギラス」が町中で見かけるようになりました。

という事で、ポケGOイベントの中でも、このアドベンチャーウィークは非常に期待が高いです!(^^)!


カテゴリー: ポケモンGO | コメントする

【ポケモンGO】第6回コミュニティ・デイ(2018/6/16)



第6回コミュニティ・デイのポケモンはヨーギラスです!(公式サイト)

第二世代が登場した時は、非常にレアなポケモンで、その当時は最強を誇っていたバンギラスの進化前のポケモン。お台場付近に出掛けてゲットしてましたが、いよいよ!時間は3時間と短いですが、大量発生です!!

その開催時期は下記の通りです。

  日時 : 2018年6月16日 土曜日 12:00 ~ 15:00

コミュニティ・デイに登場したポケモンで、過去に非常に人気のあった(レア)ポケモン「ミニリュウ」「メリープ」は(多分)参加者が非常に多かったためか、接続しにくく、延長がありました。今回は?!

さて、第6回のイベント内容ですが、
 ・(多分)色違いのヨーギラスが登場
 ・イベント中に進化するとバンギラスが特別な技を覚える
 ・ルアーモジュールの効果が3時間
 ・経験値(XP)が3倍
 ・(多分)リサーチにヨーギラス3体ゲットのお題が登場
です。

ちなみに過去のコミュニティ・デイは下記の通りです。

回数 日にち ポケモン
第5回 2018/05/19 ヒトカゲ
第4回 2018/04/15 メリープ
第3回 2018/03/25 フシギダネ
第2回 2018/02/24 ミニリュウ
第1回 2018/01/20 ピカチュウ



カテゴリー: ポケモンGO | コメントする