「セルごとにサブルーチン呼び出し」メソッド のバグを修正しました

Pocket

「セルごとにサブルーチン呼び出し」メソッド のバグを修正しました
「セルごとにサブルーチン呼び出し」メソッドのバグを修正しました

今回の主題のプログラムの実行結果画面

"セルごとにサブルーチン呼び出し" の 実行結果
“セルごとにサブルーチン呼び出し” の 実行結果

今回、議題にしている日本語VBAプログラムの期待する実行結果の画面は上図のようになります。

バグの出ていたプログラムと原因

バグの出ていたプログラムの日本語VBAコードは以下のようなコードです。

Public Sub 先頭行に第n月挿入()
    Dim w_整数 As 整数
    
    Set w_整数 = h_変数取得.整数
    
    w_整数.接頭辞を設定 "第"
    w_整数.接尾辞を設定 "月"
    
    g_道具.セル.選択範囲(, , 1, 0).セルごとにサブルーチン呼び出し "月埋める", w_整数
    
    Set w_整数 = Nothing
End Sub

Public Sub 月埋める(w_セル As セル, w_整数 As 整数)
    If w_セル.値 = "" Then
        w_整数.増やす
        w_セル.値 = w_整数.文字列化
    End If
End Sub

上記のうち、

    g_道具.セル.選択範囲(, , 1, 0).セルごとにサブルーチン呼び出し "月埋める", w_整数

が、バグで動作していませんでした。

原因はアドイン側で、サブルーチン”月埋める”の存在するワークブック名がわからなかったためです。

そのため、”月埋める”を呼び出すことができていませんでした。

また、その直接の原因は、日本語VBAのデバッグを、アドイン内部の日本語VBAコードで行っていたためです。

ver0.12までアドイン側でデバッグを行っていました。

しかし、アドインの外側では今回のような問題や、ver0.13の時に出ていた「数値クラス」や「文字列クラス」がアドインの外で生成できないバグなどが出るのに、アドイン側だけでデバッグ・テストしてもエラーとならず、デバッグできない、という問題がありました。

対策

そこで、現在ベクターに公開申請中のver0.13では、”月埋める”などのサブルーチンが、「現在のワークブック」に存在するものと仮定して、”月埋める”などのサブルーチンを呼び出すことにしています。

そのため、下記日本語VBAのコードは、ver0.13では動作しますし、動作確認済みです。

Public Sub 先頭行に第n月挿入()
    Dim w_整数 As 整数
    
    Set w_整数 = h_変数取得.整数
    
    w_整数.接頭辞を設定 "第"
    w_整数.接尾辞を設定 "月"
    
    g_道具.セル.選択範囲(, , 1, 0).セルごとにサブルーチン呼び出し "月埋める", w_整数
    
    Set w_整数 = Nothing
End Sub

Public Sub 月埋める(w_セル As セル, w_整数 As 整数)
    If w_セル.値 = "" Then
        w_整数.増やす
        w_セル.値 = w_整数.文字列化
    End If
End Sub

また、「セルごとにサブルーチン呼び出し2」というメソッドで、第1引数に、「ワークブック名 & “!” & サブルーチン名」を指定して、ワークブック名を直接指定できるようにもしています。

Public Sub 先頭行に第n月挿入()
    Dim w_整数 As 整数
    
    Set w_整数 = h_変数取得.整数
    
    w_整数.接頭辞を設定 "第"
    w_整数.接尾辞を設定 "月"
    
    g_道具.セル.選択範囲(, , 1, 0).セルごとにサブルーチン呼び出し2 g_道具.ワークブック名(False) & "!" & "月埋める", w_整数
    
    Set w_整数 = Nothing
End Sub

Public Sub 月埋める(w_セル As セル, w_整数 As 整数)
    If w_セル.値 = "" Then
        w_整数.増やす
        w_セル.値 = w_整数.文字列化
    End If
End Sub

「g_道具.ワークブック名(False) 」の箇所は適宜、「WorkBook(2).Name」や、「WorkBook(“商品データ”).Name」など、ご自分のワークブック名に置き換えられてください。

「g_道具.ワークブック名(False) 」はそのままでは、「現在使っているワークブックの名前」である「ActiveWorkBook.Name」を返します。

結論

今回のバグを反省し、

  • デバッグは、アドイン側で行うことはせず、「サンプルコード.xlsm」などアドインの外側で行う。そのことでよりユーザー側での使用に寄ったデバッグができる。

ということを行うことにします。

なお、上記バグを修正した「エクセルVBA日本語化」ver0.13 beta バージョンは、以下のURLからダウンロードできます。

 

The following two tabs change content below.
KaBA@フリーランス修行中

KaBA@フリーランス修行中

こんにちは!IT業界で勤めて17年くらい務めています。プログラミング大好きやろーです。 自分も独学でC言語を覚えIT会社に就職しました。その後紆余曲折を経て、VB6.0、VBA、Perl、C#、HTML、CSS、JavaScript、PHPなどを覚えていきました。全部C言語の独学時の経験がベースとなって、学習曲線が良いカーブを描いていました。 情報工学科を出ていなくても、独学でエンジニアは育つことができると思います! このブログで皆さんがプログラミングに興味を持たれるのを心待ちにしています! 頑張って覚えられてください!よろしくお願いします。 趣味は読書で、小宮一慶さんや松下幸之助さんなど著名人の本を読んでいる他、赤川次郎さんの三毛猫ホームズシリーズ司馬遼太郎吉川英治さんの三国志などが好きです。