コントロールの配列化サンプル

テキストボックスを6個並べただけのサンプルです。
VBAのユーザーフォームと比べて下さい。  VBA応用」の「ユーザーフォーム上の数値入力や日付入力の工夫」「ユーザーフォームのコントロールを配列にする。」VB.NETでやってみたというものです。
VBAと同じように通常のテキストボックスを6個並べて作成しており、 VB.NETにある「DateTimePicker」「NumericUpdown」「MaskedTextBox」等は使用していません。



VBAでも上のリンクのようなことをやっている方はかなりベテランなのでしょうが、 ベテランの方にこそ申し上げたいのは、ユーザーフォームを主体にする仕組みとか、VBAでメニューを用意するような複雑な仕組みを考えているのであれば、 VB.NETも考えていただいた方が良いと思うのです。
ここでは簡単な例ですが、実際の動作や記述内容の違いなどを比べて参考にしていただければと思います。

まず、実行画面を見て下さい。



サンプルを実行した画面
(この画像をクリックすると、このページのサンプルがダウンロードができます。)
この画像からダウンロードしたZIPファイルには、VisualStudio2010で作成したプロジェクトフォルダと 実際にビルド済みの「NumberDateEditTEST.exe」が入っています。
.NET Framework 3.5環境があれば「NumberDateEditTEST.exe」はそのまま実行でき、この画面が表示されます。



このサンプルでは実際のデータのI/Oや、レジストリへの書き込みは行なっていませんが、フォームの表示位置の再現のために.NET Frameworkの設定フォルダは使用しています。



2種類のテキストボックスの動作は以下のようにしています。
種類内容
日付 [フォーカスイン]
  ⇒月日の前ゼロを除去("yyyy/M/d"形式)
[フォーカスアウト]
  ⇒"yyyy/MM/dd"形式に編集
金額 [フォーカスイン]
  ⇒カンマを除去
[フォーカスアウト]
  ⇒3桁ごとにカンマを付けて編集(整数のみ)
なお、日付、金額の属性チェックは行なっておらず、不正値入力の場合は再編集されずにそのままの値で表示されたままになり、Tabキー等の移動はそのまま行なわれます。

それではソースコードです。
できるだけ簡単なサンプルとするために、ソースコードはこの「frmNumberDateEdit1」のみとしており、共通モジュール等の読み込みはしていません。 また、VBAの方も同じですが、動作はテキストボックスにフォーカスが入った時と出た時の値編集のみで、入力チェックなどは行なっていません。 6個のテキストボックスを配列で処理するあたりを含めてVBAと比べてみて下さい。
特に6個のテキストボックスに対してそれぞれ2種類のイベントが発生するので本来は12プロシージャになるところです。

'***************************************************************************************************
'   フォーム上の数値、日付の編集(テスト)                         frmNumberDateEdit1(Form)
'
'   作成者:井上治  URL:https://www.ne.jp/asahi/excel/inoue/ [Excelでお仕事!]
'***************************************************************************************************
' 変更日付 Rev     変更履歴内容-------------------------------------------------------------------->
' 20/02/24(1.0.0.0)新規作成
'***************************************************************************************************
Public Class frmNumberDateEdit1
    '===============================================================================================
    Private Const g_cnsTitle As String = "フォーム上の数値、日付の編集(テスト)"
    ' その他定数
    Private Const g_cnsTypeTextBox As String = "010101"         ' TextBoxのタイプ(0=日付, 1=金額)
    Private Const g_cnsFormatDate As String = "yyyy/MM/dd"      ' 日付フォーマット(表示)
    Private Const g_cnsFormatDateE As String = "yyyy/M/d"       ' 日付フォーマット(入力)
    '-----------------------------------------------------------------------------------------------
    ' TextBoxテーブル
    Private g_tblTextBox() As TextBox                           ' TextBoxテーブル

    '***********************************************************************************************
    ' ■■■ フォームイベント ■■■
    '***********************************************************************************************
    '* 処理名 :Form_FormClosed
    '* 機能  :フォーム閉鎖(FormClosed)
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :(デフォルト)
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2020年02月24日
    '* 作成者 :井上 治
    '* 更新日 :2020年02月24日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:
    '***********************************************************************************************
    Private Sub Form_FormClosed(ByVal sender As Object, _
                                ByVal e As FormClosedEventArgs) Handles Me.FormClosed
        '-------------------------------------------------------------------------------------------
        ' 設定退避
        With My.Settings
            .FormLocation = Me.Location
            ' 設定を保存
            .Save()
        End With
        '-------------------------------------------------------------------------------------------
        ' 独自イベントハンドラ解放
        For Each objTextBox As TextBox In g_tblTextBox
            With objTextBox
                ' Enterイベント
                RemoveHandler .Enter, AddressOf TextBox_Enter
                ' Leaveイベント
                RemoveHandler .Leave, AddressOf TextBox_Leave
            End With
        Next objTextBox
    End Sub

    '***********************************************************************************************
    '* 処理名 :Form_Load
    '* 機能  :フォーム初期化(Load)
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :(デフォルト)
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2020年02月24日
    '* 作成者 :井上 治
    '* 更新日 :2020年02月24日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:
    '***********************************************************************************************
    Private Sub Form_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
        '-------------------------------------------------------------------------------------------
        ' 設定値復旧
        With My.Settings
            If .UpgradeRequired Then
                .Upgrade()
                .UpgradeRequired = False
            End If
            Me.Location = .FormLocation
        End With
        '-------------------------------------------------------------------------------------------
        ' TextBoxテーブルを作成
        g_tblTextBox = {TXT_DATE1, TXT_NUMBER1, TXT_DATE2, TXT_NUMBER2, TXT_DATE3, TXT_NUMBER3}
        ' 独自イベントハンドラ設定
        For Each objTextBox As TextBox In g_tblTextBox
            With objTextBox
                ' Enterイベント
                AddHandler .Enter, AddressOf TextBox_Enter
                ' Leaveイベント
                AddHandler .Leave, AddressOf TextBox_Leave
            End With
        Next objTextBox
    End Sub

    '***********************************************************************************************
    '* 処理名 :Form_Shown
    '* 機能  :フォーム初期表示(Shown)
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :(デフォルト)
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2020年02月24日
    '* 作成者 :井上 治
    '* 更新日 :2020年02月24日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:
    '***********************************************************************************************
    Private Sub Form_Shown(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Shown
        '-------------------------------------------------------------------------------------------
        ' フォームクリア
        Call GP_ClearForm()
        ' 初回は全選択されないので一旦次項目を選択して戻す
        TXT_NUMBER1.Focus()
        TXT_DATE1.Focus()
    End Sub

    '***********************************************************************************************
    ' ■■■ コントロールイベント ■■■
    '***********************************************************************************************
    '* 処理名 :TextBox_Enter
    '* 機能  :テキストボックスイベント(Enter)
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :(デフォルト)
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2020年02月24日
    '* 作成者 :井上 治
    '* 更新日 :2020年02月24日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:
    '***********************************************************************************************
    Private Sub TextBox_Enter(ByVal sender As Object, ByVal e As System.EventArgs)
        '-------------------------------------------------------------------------------------------
        ' テキストボックスの再編集(入力用)
        Call GP_ReFormatTextBox(CType(sender, TextBox), False)
    End Sub

    '***********************************************************************************************
    '* 処理名 :TextBox_Leave
    '* 機能  :テキストボックスイベント(Leave)
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :(デフォルト)
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2020年02月24日
    '* 作成者 :井上 治
    '* 更新日 :2020年02月24日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:
    '***********************************************************************************************
    Private Sub TextBox_Leave(ByVal sender As Object, ByVal e As System.EventArgs)
        '-------------------------------------------------------------------------------------------
        ' テキストボックスの再編集(表示用)
        Call GP_ReFormatTextBox(CType(sender, TextBox), True)
    End Sub

    '***********************************************************************************************
    ' ■■■ サブ処理 ■■■
    '***********************************************************************************************
    '* 処理名 :GP_ClearForm
    '* 機能  :フォームクリア
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :(なし)
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2020年02月24日
    '* 作成者 :井上 治
    '* 更新日 :2020年02月24日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:
    '***********************************************************************************************
    Private Sub GP_ClearForm()
        '-------------------------------------------------------------------------------------------
        Dim strDate As String = Today.ToString(g_cnsFormatDate)     ' 本日(編集)
        ' 各テキストボックスを巡回
        For Each objTextBox As TextBox In g_tblTextBox
            With objTextBox
                Dim intIx As Integer = Integer.Parse(.Tag)          ' テーブルINDEX
                ' タイプを判定
                If Integer.Parse(g_cnsTypeTextBox(intIx)) = 1 Then
                    ' 金額
                    .Text = "0"
                Else
                    ' 日付
                    .Text = strDate
                End If
            End With
        Next objTextBox
    End Sub

    '***********************************************************************************************
    '* 処理名 :GP_ReFormatTextBox
    '* 機能  :テキストボックスの再編集
    '-----------------------------------------------------------------------------------------------
    '* 返り値 :(なし)
    '* 引数  :Arg1 = テキストボックス(Object)
    '*      Arg2 = 編集方法(Boolean)            ※True=表示用、False=入力用
    '-----------------------------------------------------------------------------------------------
    '* 作成日 :2020年02月24日
    '* 作成者 :井上 治
    '* 更新日 :2020年02月24日
    '* 更新者 :井上 治
    '* 機能説明:
    '* 注意事項:
    '***********************************************************************************************
    Private Sub GP_ReFormatTextBox(ByVal objTextBox As TextBox, ByVal blnFormat As Boolean)
        '-------------------------------------------------------------------------------------------
        Dim intIx As Integer = Integer.Parse(objTextBox.Tag)        ' テーブルINDEX
        Dim intType As Integer = Integer.Parse(g_cnsTypeTextBox(intIx)) ' タイプ
        Dim blnReEdit As Boolean = False                            ' 再編集判定
        Dim strText As String = objTextBox.Text.Trim                ' 入力値
        ' タイプを判定して再編集
        If intType = 1 Then
            ' 金額
            Dim decGaku As Decimal                                  ' 金額
            ' 金額に変換できるか
            If Decimal.TryParse(strText, decGaku) Then
                blnReEdit = True
                ' 表示用か
                If blnFormat Then
                    strText = decGaku.ToString("#,##0")
                Else
                    strText = decGaku.ToString("0")
                End If
            End If
        Else
            ' 日付
            Dim dteDate As Date                                     ' 日付
            ' 日付に変換できるか
            If Date.TryParse(strText, dteDate) Then
                blnReEdit = True
                ' 表示用か
                If blnFormat Then
                    strText = dteDate.ToString(g_cnsFormatDate)
                Else
                    strText = dteDate.ToString(g_cnsFormatDateE)
                End If
            End If
        End If
        ' 再編集結果を更新
        If blnReEdit Then objTextBox.Text = strText
    End Sub

    '----------------------------------------<< End of Source >>------------------------------------
End Class
6個のテキストボックスについては「フォーカスイン(Enter)」及び「フォーカスアウト(Leave)」のイベントを扱いますが、 6個のテキストボックスそれぞれに各イベントを記述するのではなく、「TextBox_Enter」「TextBox_Leave」にまとめてしまいます。
実際のテキストボックスのイベントとの関連は「Form_Load」にある「AddHandler」で紐付けられます。 「TextBox_Enter」「TextBox_Leave」からは共通のサブプロシージャ(GP_ReFormatTextBox)が呼び出されますが、 呼ばれたサブプロシージャからはテキストボックスのTagプロパティで「何番目のテキストボックス」かが判るようにしてあり、 定数の「g_cnsTypeTextBox」のそのインデックス位置から「日付か金額か」が判るようにしています。