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

【VBA】If文を減らしてスマートに解く!FizzBuzz問題のエレガントな解法

プログラミングの入試問題とも言われる「FizzBuzz」。単純に条件分岐を重ねるだけでも解けますが、コードの美しさと拡張性を意識すると、全く違ったアプローチが見えてきます。今回は、VBA特有の文字列結合を活かした、If文の少ないスッキリとしたコードを解説します。

1. 仕様:FizzBuzz問題のルール

1から指定した数まで順番に数字を数え上げ、以下の条件に従って値を出力します。特に「15のとき」をどう処理するかが、If文を減らす鍵となります。

[ ルール ]
・3の倍数なら 「Fizz」
・5の倍数なら 「Buzz」
・両方の倍数(15の倍数)なら 「FizzBuzz」
・それ以外は 「その数字」 をそのまま表示

2. アルゴリズム:文字列結合による「条件分岐の集約」

重要ポイント:空文字変数に「付け足していく」発想

「15の倍数」を独立した条件として判定するのではなく、3の判定結果と5の判定結果を「結合」させることで、複雑なElseIfを排除します。最後に、変数の中身が空かどうかで数字を表示するか判定するだけの、極めてシンプルな構造です。

[ 具体的なロジック(i = 15 の場合) ]

Step 1: 初期化
変数 res を空にする。

Step 2: 3の倍数判定
15は3で割り切れるので、res に "Fizz" を代入(結合)。

Step 3: 5の倍数判定
15は5でも割り切れるので、res に "Buzz" を追加結合。
結果、res は "FizzBuzz" になる。

Step 4: 最終判定
res が空でないのでそのまま出力。もし空なら数字を出力。

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

イミディエイトウィンドウに出力する、If文の使用を最小限に抑えたエレガントな実装例です。

Sub ElegantFizzBuzz()
    Dim i As Long
    Dim res As String

    For i = 1 To 30
        res = "" ' 変数をリセット

        ' 3の倍数なら文字を入れる
        If i Mod 3 = 0 Then res = "Fizz"

        ' 5の倍数なら文字を「付け足す」
        If i Mod 5 = 0 Then res = res & "Buzz"

        ' 文字が入っていればそれを、空なら数字を表示
        Debug.Print IIf(res <> "", res, i)
    Next i
End Sub

4. 実行結果

上記コードを実行すると、イミディエイトウィンドウには以下のように出力されます。15と30の箇所が正しく「FizzBuzz」になっているのが分かります。

1
2
Fizz
4
Buzz
Fizz
7
8
Fizz
Buzz
11
Fizz
13
14
FizzBuzz
16
17
Fizz
19
Buzz
Fizz
22
23
Fizz
Buzz
26
Fizz
28
29
FizzBuzz

1. 技術的な補足: IIf 関数(Immediate If)を使用することで、条件出力を1行に集約しています。また、3と5の判定を独立させることで、「15のときは…」という重複した条件式を書く必要がなくなり、コードの「DRY(Don't Repeat Yourself)」原則を守っています。
2. エンジニアの視点: この手法は、将来的に「7の倍数のときはWoof」といった条件が追加されても、If文を1行足すだけで対応できる「拡張性」に優れています。多分岐を力技で書くのではなく、データの流れ(パイプライン)を作るような意識で書くのが「いけいけ」なエンジニアへの近道です。


PR

【生物学問題】遠くの細胞へメッセージ!「ホルモン」を攻略

私たちの体には、神経系とは別に「血液」の流れを利用して情報を伝えるシステムがあります。今回は、特定の細胞に指令を届ける情報伝達物質「ホルモン」について学びましょう。

1. 問題:内分泌細胞から分泌される物質

【 問題 】 内分泌細胞で作られ、血液中に分泌されて特定の標的細胞へと運ばれ、体の状態を調節する情報伝達物質を何と呼ぶでしょうか?

① 酵素   ② ホルモン   ③ 神経伝達物質   ④ 抗体

2. 正解:内分泌系に関する正解

正解: ② ホルモン

3. 解説:血液という「郵便」で届く指令

ホルモンは非常に微量で効果を発揮し、体内の恒常性(ホメオスタシス)を保つために働きます。

[ ホルモン伝達の仕組み ]
内分泌:分泌腺から直接血液中へ放出されることを指します(汗などの「外分泌」との違いに注意)。
標的細胞:ホルモンを受け取るための専用の「受容体(レセプター)」を持つ細胞のことです。受容体がない細胞には作用しません。

[ 代表的なホルモンの例 ]
・インスリン(血糖値を下げる)、アドレナリン(血糖値を上げる・興奮)、成長ホルモンなど。

1. 試験のポイント: ホルモンは「血液」によって運ばれるため、全身に行き渡りますが、実際に働くのは「受容体を持つ標的細胞」だけです。この「鍵と鍵穴」のような関係が重要です。
2. バイオインフォの視点: ホルモン受容体の構造解析や、ホルモンが細胞内の遺伝子発現をどう変化させるかの解析(シグナル伝達パスウェイ解析)は、生活習慣病やホルモン依存性疾患の治療薬開発において、膨大なデータベースを活用した研究が行われています。


4. まとめ

「内分泌細胞が分泌し、血液で運ばれる物質=ホルモン」です。神経伝達が「有線(速い)」だとすれば、ホルモン伝達は「無線や郵便(比較的ゆっくり、持続的)」というイメージで捉えると、その役割の違いが分かりやすくなりますよ!

【生物学問題】生命の触媒!「酵素」の働きを攻略

生物の体の中では、常に膨大な数の化学反応が起こっています。これらの反応を、体温程度の低い温度で速やかに進めるために欠かせないのが「酵素(こうそ)」です。

1. 問題:代謝を支える生体触媒

【 問題 】 生体内で起こる多くの化学反応(代謝)において、反応を促進させる触媒として利用される物質を何と呼ぶでしょうか?

① ホルモン   ② 酵素   ③ ビタミン   ④ ミネラル

2. 正解:生体物質に関する正解

正解: ② 酵素

3. 解説:特定の相手とだけ反応する専門家

酵素の多くはタンパク質でできており、非常に高度な選択性(特異性)を持っています。

[ 酵素の3大特徴 ]
生体触媒:自らは変化せず、反応速度だけを劇的に高めます。
基質特異性:鍵と鍵穴のように、特定の物質(基質)としか反応しません。
最適条件:働くのに適した温度(約37度前後)やpH(胃の中なら酸性など)が決まっています。

[ 代表的な例 ]
・アミラーゼ(デンプンの分解)、ペプシン(タンパク質の分解)など。

1. 試験のポイント: 酵素は「触媒」なので、反応が終わればまた次の反応に使われます。消耗品ではなく、使い回される作業員のようなイメージで捉えましょう。
2. バイオインフォの視点: タンパク質の立体構造データ(PDBなど)を解析し、酵素が基質と結合する「活性部位」をコンピュータ上でシミュレーションする「ドッキング解析」は、創薬研究において非常に重要な手法です。酵素の働きを邪魔する薬(阻害剤)の設計などに役立てられています。


4. まとめ

「生体内の触媒=酵素」です。その正体が主にタンパク質であること、そして特定の相手としか働かない「基質特異性」という性質をセットで覚えておきましょう!

【BI技術者認定試験対策】細胞の司令塔を守るバリア!「核膜」を攻略

真核細胞の最大の特徴は、遺伝情報であるDNAが特別な膜に包まれていることです。今回は、核を保護し、物質の出入りをコントロールする「核膜(かくまく)」について整理しましょう。

1. 問題:核を包む構造体

【 問題 】 真核細胞において、内部のDNA(染色質)を細胞質から隔て、核を包んでいる二重の膜のことを何と呼ぶでしょうか?

① 細胞膜   ② 核膜   ③ 核小体   ④ 核板

2. 正解:細胞の構造に関する正解

正解: ② 核膜

3. 解説:二重構造と情報の出入り口

核膜は単なる袋ではなく、高度な検問所の役割を果たしています。

[ 核膜の主な特徴 ]
二重膜構造:内膜と外膜の2枚の生体膜からできています。外膜は「小胞体」へとつながっています。
核膜孔(かくまくこう):膜にある小さな穴です。ここを通って、核内で作られたRNAが細胞質へ出たり、必要なタンパク質が核内に入ったりします。

[ 役割 ]
・大切な設計図(DNA)を細胞質中の化学反応から保護し、転写と翻訳のタイミングや場所を分ける役割を担っています。

1. 試験のポイント: 核膜を持つのが「真核生物」、持たない(核がむき出し)のが「原核生物(細菌など)」です。この分類は生物学の超基本ですので、必ずセットで覚えましょう。
2. バイオインフォの視点: 核膜孔を通る物質の輸送には「核移行シグナル(NLS)」という特定のペプチド配列が関わっています。アミノ酸配列からこのシグナルを予測することで、そのタンパク質が細胞内のどこ(核か細胞質か)で働くかをコンピュータ上で推定することが可能です。


4. まとめ

「核の包み紙は核膜」です。二重膜であること、そして核膜孔という穴があることをセットで理解しておきましょう。細胞の「核」をしっかりイメージできるようになると、その中で起こる転写の仕組みも理解しやすくなりますよ!


【VBA】標準モジュール vs クラスモジュール:違いと使い分けの極意を徹底解説!

VBAをステップアップさせる鍵は、2つのモジュールの使い分けにあります。「いつものSub/Function」と「設計図としてのクラス」、それぞれの特徴を整理してみましょう。

1. 標準モジュール:どこでも使える「道具箱」

VBAを始めたときに書くコードのほとんどはここに入ります。「どこからでも呼べる関数や変数を置いておく場所」であり、特定の対象に縛られない汎用的な処理に向いています。

[ 特徴 ]
★ 性質:常にメモリ上に存在し、呼び出せばすぐに動く。
★ 状態:データの保持には不向き。変数は全体で共有されるため、意図しない書き換えのリスクがある。
★ 用途:マクロ記録の保存先、共通の計算(消費税計算など)、メインの実行フロー。

2. クラスモジュール:個性を生み出す「設計図」

こちらは「新しい『モノ(オブジェクト)』の作り方を定義する場所」です。実体(インスタンス)を生成して初めて機能する、プロフェッショナルな開発には欠かせないモジュールです。

ポイント:インスタンスごとに別々のデータを保持できる

例えば「Logger(記録係)」というクラスを作れば、ファイル出力用のLogger A、画面出力用のLogger Bといった具合に、同じ設計図から「個性の違う部品」を複数生み出せます。

3. 実践比較:コードで違いを体感する

【標準モジュール:誰でも使える「道具」】
' 名前を呼ぶだけで即実行可能
Public Sub CalcTax(price As Long)
    MsgBox "税込価格は " & price * 1.1 & " 円です"
End Sub

【クラスモジュール:生み出して使う「部品」】
' クラス名: clsLogger
Private pName As String
Public Property Let LoggerName(val As String)
    pName = val
End Property
Public Sub Log(msg As String)
    Debug.Print "[" & pName & "] " & msg
End Sub

【呼び出し側:Newで実体化して個性を与える】
Sub Test()
    Dim logA As New clsLogger
    logA.LoggerName = "ファイル出力係"
    
    Dim logB As New clsLogger
    logB.LoggerName = "画面表示係"
    
    logA.Log "保存完了" ' 結果:[ファイル出力係] 保存完了
    logB.Log "保存完了" ' 結果:[画面表示係] 保存完了
End Sub

4. エンジニアの視点:どちらを選ぶべきか?

1. 判断の基準: 処理の「手順」や「共通の計算」をまとめたいなら標準モジュール、データと処理をセットにした「役割を持つ部品」を作りたいならクラスモジュールを選びます。
2. 保守性の違い: 大規模な開発では、何でも標準モジュールに書くとコードがスパゲッティ状態になります。役割ごとにクラス化(カプセル化)することで、影響範囲が限定され、修正に強い「いけいけ」なシステムが構築できます。
3. Javaエンジニアの感覚: 標準モジュールは static メソッドが集まった Utility クラス、クラスモジュールは通常の Class 定義そのものだと考えると、その設計意図がスッキリ理解できるはずです。


5. まとめ

最初は標準モジュールだけで十分かもしれません。しかし、複雑なツールを作る際には「これは何かの役割(クラス)にできないか?」と考える癖をつけてみてください。クラスモジュールを使いこなせたとき、あなたのVBAは単なる自動化ツールから、洗練された「ソフトウェア」へと進化します。