Vbaはユーザーフォームを作成し、フォーム入力のエラー処理を実行する

フォームは常用な機能です。次には、Excelとvbaでフォーム機能の使用と例外処理の方法も説明します。

ユーザーフォームがWebページでの使用は熟知です。ユーザー入力を受け取るための主要なツールとして、テキストボックス、パスワードボックス、ドロップダウンリストなどのユーザーフォームコンポーネントがあります。ここには詳細を詳しく説明しません。

Excelには、2種類のユーザーフォームモードがあります。

1つは、ワークシートに直接挿入されるフォームです。

開発ツールの[挿入]ボタンから対応するフォームコントロールを選択します。

例えば、現在のワークシート(フォームコントロールの左上にある最初の“ボタン”)にカスタムボタンを挿入すると、ボタンコントロールのclickイベントのコールバック関数を指定するように自動的に求められます。

このモードにより、バックグラウンドのコードをシールドすることができ、通常のユーザーがVBAに実装されたカスタム機能を呼び出すのに便利です。

このモードは非常に便利ですが、少し複雑なユーザーのニーズに対応するのは難しいです。この場合、VBEプロジェクトのユーザーフォームモジュールを使用できます。

次には、ツールボックス内のコントロールをマウスでドラッグして、独自のユーザーフォームを作成できます。

上記のフォームは、この記事の例に関連しています。

各コントロールのプロパティは、プログラム或はプロパティで調整できます。

右側のウィンドウで対応するコントロールを選択した後、左下のプロパティでフォント、位置やその他のプロパティを調整できます。

次の図に示すように、ユーザーフォームをダブルクリックすると、フォームのプロジェクトコードに自動的にジャンプします。

例:連結財務諸表のエントリを調整する

説明:グループの連結財務諸表では、子会社は異なる国にあるため、使用されるERPシステムも異なります。元のデータの処理が完了した後、レポートを連結する必要があります。

Overviewワークシートには、要約情報が格納されています。G1-G9と記された列は、子会社の取りまとめたデータです。列ラベルCol1-Col6には、結合されたオフセットエントリの列です。

連結の過程では何千個の異なるサブジェクトに関与する可能性があります。結合されたオフセットエントリの管理を容易にするために、入力されたエントリを別のワークシートに保存し、数式を使用してサマリーテーブルに関連付ける必要があります。

エントリを格納するワークシートはBookingsと呼ばれ、構造は次のとおりです。最初の列はエントリの説明で、2列目は対応する列ラベルです。

結果は次のとなります。

要求

  • アカウントの指定された列に対応するセルをダブルクリックして、イベントをトリガーし、ユーザーフォームを表示します。
  • ユーザーフォームのドロップダウンリストデータは、ワークシートの内容に基づいて自動的に生成され、上図に示すように自動入力機能があります。例えば、Trailと入力すると、Trailに対応する項目が自動的にフィルタリングされます。
  • ボタンEqualizerの機能は貸借バランスです。
  • 数値フィールドが等号で始まる場合、簡単な演算機能が必要です。例えば、=49+51の結果は100です。
  • 入力データに基づいて、エントリが自動的に生成され、会社を通じて元のテーブルに関連付けられます。

このプロジェクトは、レポートの統合プログラムはの一部として始まりました。この例では、Option Explicitのない以前のバージョンを使用しています。ご容赦ください。

プロジェクトのコードは大きくて理解しにくいと友人からいつも言われています。

これによって、去年の司法試験の受験者からの質問が思い出しました。試験の前に緩みやすいですが、どうすれば頑張りますか?答えはうまくいかない場合は、また来年です。

学習の各段階でボトルネックが発生します。ほとんどの人は困難を恐れて特定の段階で停止します。この大きな一歩を踏み出すのはあなた次第です。

各プロジェクトには独自のロジックがあります。実装の原則を理解したら、時間をかかって自分で実行してください。実際のプログラミングはチュートリアル自体を読むだけで体験できません。すべてのステートメントには道理があります。脳から画面へのプロセスを体験してから、プログラミングの知識をマジで理解できます。

また、実際のプロジェクト自体の複雑程度がコードの規模を決定します。難問を解決し、考えることの楽しさを楽しむことは、VBAプログラミングを学ぶという本来の意図ではないでしょうか?

次には業務のロジックを分析してみましょう。

フォームをダブルクリックして表示します。ワークシートイベントWorksheet_BeforeDoubleClickに対応して、このイベントを通じて、ダブルクリックイベントをトリガーしたセルが取得され、行と列の情報、つまり対応する項目コードとマージされた列の名前です。

各コンポーネントのプロパティとメソッドの使い方については、ドキュメントを確認してください。ユーザーフォームは比較的常用ではないため、ドキュメントを参照するだけで済みます。 ユーザーフォームのドロップダウンリストは、Overviewワークシートからデータを読み取り、それに応じてドロップダウンリストのItemsオブジェクトを更新します。 自動入力機能は、ドロップダウンリストのChangeイベントに対応します。つまり、ユーザーがデータを入力すると、ドロップダウンリストのItemsオブジェクトが自動的に更新されます。

値を入力するためのテキストフィールドは、等号で始まるときに計算されます。この機能については詳しく説明します。

テキストフィールドの結果は文字列の形式で渡されます。この時点でユーザーが“abc”のような数字以外の文字を入力すると、cdblは値を変換する時にエラーが報告されます。

例えば、イミディエイトウィンドウで次のコマンドを入力して実行すると、エラーメッセージが表示されます。

? cdbl("12as")

エラーが発生すると、プログラムがブロックされるため、次にはエラー処理の方法を提供します。

モジュール/プログラムスコープで指定する

On Error Resume Next ' エラーを無視して、実行し続きます。

或は

On Error GoTo … ' エラーが発生した場合、…にジャンプします。

プログラミングおよびデバッグ時にOnError Resume Nextを追加することはお勧めしません。これは、エラーメッセージが表示されなくなり、エラーを具体的に処理できないためです。 この方法は、特定のシナリオにのみ適しています。

On Error GoToをご覧ください。

上記の例から、プログラムの実行過程を分析します。

Private Function pareseValue(ByVal s As String) As Double

    On Error GoTo dblparesehdl
    
    s = Trim(s)
    
    If Left(s, 1) = "=" Then
        s = Right(s, Len(s) - 1)
        pareseValue = Application.Evaluate(Replace(Replace(s, " ", ""), ",", "."))
    Else
        pareseValue = CDbl(Replace(Replace(s, " ", ""), ".", ","))
    End If
    
    pareseValue = Round(pareseValue, 2)
    
dblparesehdl:
    
    If Err.Number <> 0 Then
        pareseValue = 0
    End If

End Function

ユーザーが”12as”を入力すると、前に等号がないため、2番目の代替ブランチに入ります。このとき、cdblは変換できないため、エラーが表示されます。

関数スコープで、 On Error GoTo dblparesehdlを宣言します。 エラーが発生する場合、自動的にdblparesehdlでマークされた行に移動し、[通常、エラー処理のマークされた行の名前はhandler/handle/hdlです]、この行と次のコードを実行します。

Err.Number <> 0

エラーコードが0でない場合は、プログラムが異常に実行されていることを意味します。 このとき、意味のない入力を0として割り当てます。
プログラムの編集過程では、Err.Raiseを介してエラーをスローするか、Debug.Assertを使用して、指定された条件が満たされているかどうかを判断してプログラムの実行を中断することもできます。

Share

コメントを残す

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