忍者ブログ
バイオインフォマティックス技術者試験、情報処理試験など、IT系の試験を基礎から勉強します。また、Javaなどプログラミングを勉強します。

【VBA】ユーザー定義型(Type句)の使い方!Object(クラス)との決定的な違いと使い分けの極意

VBAでバラバラな変数を一つにまとめたいとき、真っ先に候補に上がるのが「ユーザー定義型(Type句)」です。しかし、中級者以上になると「クラスモジュール(Object)」との使い分けに悩むことも。今回は、基本の書き方から、実務で役立つObjectとの使い分け判断基準まで徹底解説します。

1. 基本文法:Typeステートメントで「型」を作る

ユーザー定義型は、標準モジュールの先頭(宣言セクション)で Type を宣言します。これにより、複数の異なるデータ型を「一つの変数」として扱えるようになります。

[ 構文 ]
Type UserType
    Id As Integer
    Name As String
End Type

2. 実践サンプル:データの代入と出力

ポイント:Dimで宣言するだけで「実体」ができる

ユーザー定義型は、Objectと違い Set や New を使う必要がありません。宣言した瞬間からメモリ上に領域が確保されるため、非常に軽量で高速です。

Sub Macro1()
  Dim User As UserType  ' Newは不要!
  
  User.Id = 1
  User.Name = "いけいけ理系NEO"
  
  Debug.Print User.Id
  Debug.Print User.Name
End Sub

3. 徹底比較:ユーザー定義型 vs Object(クラス)

どちらを使うべきか迷ったときは、以下の「エンジニアの判断基準」を参考にしてください。

比較項目ユーザー定義型 (Type)Object (Class)
生成コスト 極めて軽量・高速 Newが必要でやや重い
メソッド 持てない(データのみ) 持てる(処理も内包)
配列・連想配列 Collectionに入れられない Collection等に格納可能

4. まとめ:結局どっちを使えばいいの?

1. Typeを使うべき時: 「単純に値をセットで持ちたいだけ」の場合です。例えば座標(X, Y)や、一時的な構造データの保持など、メモリ消費を抑えて「いけいけ」なスピードで回したいループ処理に向いています。
2. Object(クラス)を使うべき時: 「そのデータに関連する独自の処理(メソッド)」を持たせたい時や、データを Collection や Dictionary に詰め込んで管理したい時です。Javaなどのオブジェクト指向的な設計が必要な大規模開発ではクラス一択です。
3. エンジニアの視点: ユーザー定義型は「構造体」、Objectは「インスタンス」と考えるとスッキリします。VBAでも「データ」と「振る舞い」を分離することで、コードの保守性は見違えるほど良くなります。


5. 最後に

初心者はまず、手軽な「ユーザー定義型」から始めてみましょう。変数が整理される快感を覚えたら、次は「クラスモジュール(Object)」に挑戦して、より高度な設計を目指してみてください。使い分けができるようになれば、あなたのVBAスキルはプロの領域です。





PR

【VBA】行挿入の鉄則!各行を2行ずつに複製(コピー)する安全なアルゴリズム

Excel VBAで「特定の行をコピーして2行に増やしたい」という場面はよくあります。しかし、単純に上から順に行を挿入すると、無限ループのような挙動やデータのズレに悩まされることになります。今回は、行操作の鉄則である「逆順ループ」を用いて、安全かつ確実にデータを複製する方法を解説します。

1. 仕様:各行を2行ずつに複製(コピー)する

シートにあるデータを、以下のように各行2行ずつに増やす処理を実装します。1行につき1行の空行を挿入し、そこに元の内容をコピーするイメージです。

[ 処理前 ]      [ 処理後 ]
1行目: A        1行目: A
2行目: B   →   2行目: A (コピー)
3行目: C        3行目: B
                4行目: B (コピー)
                5行目: C
                6行目: C (コピー)

2. アルゴリズム:なぜ「下の行から上へ」処理するのか?

重要ポイント:行挿入は「逆順ループ(Step -1)」が鉄則

上から処理すると、新しく挿入した行を「次の処理対象」として誤認してしまい、同じデータを延々とコピーし続ける不具合が起きやすくなります。これを避けるため、最終行から1行目に向かって処理を遡ります。

[ 具体的な動作フロー(3行の場合) ]

Step 1 (i = 3)
3行目の「C」を認識。その直下(4行目)に空行を挿入してコピー。
結果: 1:A, 2:B, 3:C, 4:C (※3行目より下が確定)

Step 2 (i = 2)
2行目の「B」を認識。その直下(3行目)に空行を挿入してコピー。
この時、下の「C」たちは自動的に押し出されますが、カウンタ「i」はすでに上(2)に移動しているため、データが重複することはありません。

Step 3 (i = 1)
1行目の「A」を認識。その直下(2行目)に空行を挿入してコピー。
最終結果: 1:A, 2:A, 3:B, 4:B, 5:C, 6:C

3. サンプルコード(そのままコピーOK)

実務でもそのまま使える、高速化設定(ScreenUpdating)を組み込んだコードです。

Sub DoubleRows()
    Dim lastRow As Long
    Dim i As Long

    ' A列の最終行を取得
    lastRow = Cells(Rows.Count, "A").End(xlUp).Row

    ' 画面更新を停止して処理を高速化
    Application.ScreenUpdating = False

    ' 下の行から順に処理(逆順ループ)
    For i = lastRow To 1 Step -1
        ' 現在の行の下に1行挿入
        Rows(i + 1).Insert Shift:=xlDown

        ' 現在の行をコピーして、挿入した空行に貼り付け
        Rows(i).Copy Destination:=Rows(i + 1)
    Next i

    ' 画面更新を再開
    Application.ScreenUpdating = True

    MsgBox "処理が完了しました!"
End Sub

1. 技術的な補足: 行の削除や挿入を伴う処理では、Step -1(デクリメント)を使うのがVBAのセオリーです。上から処理して「行番号がズレる」というバグは、初心者が最もハマりやすい落とし穴の一つです。
2. エンジニアの視点: この「データの末尾から処理を確定させる」という考え方は、データベース移行(Migration)やスタックの操作など、IT全般に通ずる論理的なアプローチです。シンプルですが、非常に「堅牢(ロバスト)」なコード構造と言えます。


4. まとめ

「行を操作するなら下から上へ」。このルールを一つ覚えるだけで、VBAでのデータ加工の幅は大きく広がります。実行速度を意識した ScreenUpdating の制御と合わせて、ぜひ自身のツールに組み込んでみてください。





【生物学問題】空の芸術!ムクドリの集団行動「マーマレーション」を攻略

夕暮れの空で、数千、数万羽のムクドリが一斉に形を変えながら舞う姿を見たことはないでしょうか。まるで一つの巨大な意志を持っているかのようなこの集団運動には、科学的な名称があります。

1. 問題:動物の集団による波のような動き

【 問題 】 ムクドリなどの鳥の群れが、空中で一斉に方向を変えたり、形を複雑に変化させたりしながら動く集団運動のことを何と呼ぶでしょうか?

① マーマレーション   ② フォーメーション   ③ マイグレーション   ④ ナビゲーション

2. 正解:集団行動に関する正解

正解: ① マーマレーション

3. 解説:個のルールが生む全体の秩序

マーマレーション(Murmuration)は、ムクドリ(Starling)の群れが見せる特有の振る舞いを指します。語源はムクドリの羽音や鳴き声が「ざわざわ(murmur)」聞こえることに由来します。

[ 集団運動の仕組み ]
リーダーの不在:この動きに指揮官はいません。個々の鳥が「隣の数羽の動きに合わせる」という単純なルールに従うことで、全体として複雑な動きが生まれます。
目的:主にタカなどの天敵から身を守るためと考えられています。群れ全体が波のように動くことで、敵の標的を絞らせない効果があります。

[ 他の選択肢との違い ]
マイグレーション:渡り鳥などの「渡り(長距離移動)」を指します。
フォーメーション:V字飛行などの「特定の隊列」を指します。

1. 試験のポイント: 生物学では、個々の単純な相互作用から全体として高度なパターンが現れることを「創発(そうはつ)」と呼びます。マーマレーションはその代表例としてよく挙げられます。
2. バイオインフォ・計算機科学の視点: この動きは「ボイド(Boids)モデル」というアルゴリズムでシミュレーション可能です。隣との距離を保つ、向きを合わせる、中心へ向かうという3つのルールだけで、コンピュータ上にリアルな群れの動きを再現できます。群知能(Swarm Intelligence)の研究において重要な基礎となっています。


4. まとめ

「ムクドリのざわめくような集団運動=マーマレーション」です。一見ランダムに見えて、実は物理学的な秩序に基づいた美しい動きであることを理解しておきましょう。生物の集団が持つ不思議な知性に触れる興味深いキーワードですね!


【VBAスタンダード対策】処理を中断する「Exit Sub」の構造を攻略!

Subプロシージャは通常、上から下へと順番に実行されますが、エラー発生時や特定の条件を満たした際に「それ以降の処理を行わずに呼び出し元へ戻る」という制御が必要になります。この「途中で終わる」ための正確な記述を確認しましょう。

1. 問題:プロシージャの中途終了

【 問題 】 以下のコードにおいて、変数 ans が 0 の場合に、メッセージを表示せずにプロシージャを途中で終了させたい。空欄 ( A ) に入る正確な記述はどれでしょうか?

Sub CheckValue(ans As Integer)
    If ans = 0 Then
        ( A )
    End If

    MsgBox "結果は " & ans & " です"
End Sub

① End   ② Exit Sub   ③ Stop   ④ Return Sub

2. 正解:中途終了の構文に関する正解

正解: ② Exit Sub

3. 解説:なぜ「Exit Sub」でなければならないのか?

プロシージャを物理的な終端(End Sub)まで実行させずに、その場で呼び出し元に制御を戻す命令が Exit Sub です。これは「出口を無理やり作る」ような構造的役割を果たします。

[ プロシージャ脱出の構造図 ]

Sub Main()              Sub CheckValue(ans)
  |                        +-------------------+
  +--[ 呼出 ]-----------> | If ans = 0 Then  |
  |                       |   Exit Sub ------|---(即座に復帰)
  +<-[ 復帰 ]------------- | End If           |
  |                       |  [以降の処理]      |
  |                       | End Sub          |
  |                       +-------------------+

[ 注意すべきキーワードの違い ]
Exit Sub:現在のプロシージャのみを終了し、呼び出し元へ戻ります。
End:プログラム全体の実行を完全に停止し、すべての変数をリセットします。影響範囲が大きすぎるため、中途終了には通常使いません。

1. ここが試験に出る!: 試験では「このコードを実行した際、MsgBoxが表示されるか否か」を問う形式で出題されます。If 文の条件が成立し、Exit Sub を踏んだ時点で、その下のコードは一行も実行されないという構造的遮断を正しく読み解く必要があります。
2. エンジニアの視点: Java 17などの return; ステートメントに相当します。異常な値を最初にはじく「ガード句」として Exit Sub を活用することで、後続のメインロジックをシンプルに保つことができ、保守性の高い「いけいけ」なコード構造が実現します。


4. まとめ

「異常があれば Exit Sub で即脱出」。この中途終了の構造を使いこなすことで、予期せぬエラーや不要な処理の実行を防ぐことができます。減数分裂が特定のチェックポイントで制御されるように、VBAも Exit Sub という関門を設けることで、確実かつ安全なプログラム制御が可能になるのです。



【生物学問題】植物の給排水システム!「蒸散」の仕組みを攻略

植物は根から取り込んだ水を、ポンプのような装置を使わずに高い枝の先まで運び上げます。その原動力となる重要な現象が「蒸散(じょうさん)」です。水の流れの仕組みを正しく理解しましょう。

1. 問題:植物から水蒸気が放出される現象

【 問題 】 植物が根から吸い上げた水が、茎や葉のすみずみまで届けられた後、主に葉の気孔から水蒸気となって空気中に放出される現象を何と呼ぶでしょうか?

① 光合成   ② 蒸散   ③ 呼吸   ④ 浸透

2. 正解:植物の生理作用に関する正解

正解: ② 蒸散

3. 解説:水を吸い上げる「引き金」

葉から水が蒸発することで、導管の中の水が上へと引っ張り上げられる力が生まれます。

[ 蒸散の役割と特徴 ]
吸水の原動力:葉から水が失われることで、根から新しい水を吸い上げる力が生じます。
体温調節:水が蒸発する際の気化熱により、強い日光による葉の温度上昇を防ぎます。
気孔(きこう):主に葉の裏側に多く存在する小さな穴から、水蒸気が放出されます。

[ 水の流れのルート ]
根毛(吸収)→ 導管(上昇)→ 葉の気孔(放出)

1. 試験のポイント: 蒸散は「気孔」の開閉によって調節されます。昼間や乾燥している時、温度が高い時などに活発になります。また、蒸散によって無機養分も水と一緒に全身へ運ばれることも覚えておきましょう。
2. バイオインフォの視点: 植物の「気孔」の密度や開閉に関わる遺伝子群の解析は、乾燥に強い作物(耐乾性作物)の開発において重要です。画像解析技術を用いて葉の表面の気孔の数や形を自動計測し、ゲノム情報と照らし合わせる研究が進んでいます。


4. まとめ

「根から吸って、葉から逃がす」という一連の水の流れを引き起こすのが蒸散です。この仕組みのおかげで、植物はエネルギーを使わずに重力に逆らって水を運ぶことができます。導管(血管)と維管束(ネットワーク)の知識とあわせて整理しておきましょう!