(祝)東京オリンピック!

(祝)北京オリンピック!

小技関係

テキストボックスに数値と少数点のドットのみ入力できるようにする

UserForm1 に TextBox1 を貼り付け、貼り付けたコントロールに数字と小数点のドット(.)以外はキー入力できないようにします。

TextBox1のプロパティー

IMEMode を 3 - fmIMEModeDisable にセットします。

fmIMEMode の設定値は次のとおりです。
    定数                 値    説明
    fmIMEModeNoControl    0    IME を制御しません (既定値)。
    fmIMEModeOn           1    IME をオンにします。
    fmIMEModeOff          2    IME はオフの状態です。 英語モード。
    fmIMEModeDisable      3    IME をオフにします。 ユーザーはキーボードで IME をオンにできません。
    fmIMEModeHiragana     4    全角ひらがなモードで IME をオンにします。
    fmIMEModeKatakana     5    全角カタカナ モードで IME をオンにします。
    fmIMEModeKatakanaHalf 6    半角カタカナ モードで IME をオンにします。
    fmIMEModeAlphaFull    7    全角英数字モードで IME をオンにします。
    fmIMEModeAlpha        8    半角英数字モードで IME をオンにします。

COPY

'----------------------------------------------------------------------
Private Sub TextBox1_Change()
    Dim Txtbuf          As String
    Dim buf(1)          As String
    Dim val             As Variant

    Txtbuf = Me.TextBox1.Value

    
    If Len(Txtbuf) = 0 Then
        'テキストボックスに値がない場合
        buf(0) = 0
        buf(1) = ""

    Else
        'テキストボックスに値がある場合
        If Not IsNumeric(Txtbuf) Then
            '数値でない場合
            buf(0) = ""
            buf(1) = ""

        Else
            '数値の場合、整数部分と少数部分に分離します
            val = Split(Txtbuf, ".")

            '整数部分を格納します
            buf(0) = val(0)

            If UBound(val) = 0 Then
                '少数点がない場合
                buf(1) = ""
            Else
                '少数点がある場合、ドットを付けて格納します
                buf(1) = "." & val(1)
            End If

        End If
        
    End If

    '整数部分を位どりして繋げます
    Me.TextBox1.Value = Format(buf(0), "#,##0") & buf(1)

End Sub

'----------------------------------------------------------------------
Private Sub TextBox1_KeyPress(ByVal KeyAscii As MSForms.ReturnInteger)

    If (KeyAscii < Asc("0") Or KeyAscii > Asc("9")) Then
        If KeyAscii = Asc(".") Then
            If Len(Me.TextBox1) > 0 Then
                If InStr(Me.TextBox1.Value, ".") > 0 Then
                    '2つ目の小数点の場合、無効化
                    KeyAscii = 0
                Else
                    '初めての小数点の場合、制限しません
                End If
            Else
                '初めの入力でドット(.)を入力した場合、無効化
                KeyAscii = 0
                'その代わりにボックスに「0.」をセットする
                Me.TextBox1.Value = "0."
            End If
        Else
            '0~9でなく、かつドットでない場合、無効化
            KeyAscii = 0
        End If
    Else
        '0~9までの数値の場合、制限しません
    End If

End Sub 

シートの列行に名前を付け名前と列・列番号のハッシュテーブル



  

COPY

'----------------------------------------------------------------------
Public ShRowCol         As Dictionary

'----------------------------------------------------------------------
Public Sub ShRowColMake()
    Dim KRow            As Long
    Dim KCol            As Long
    Dim Sh              As Worksheet
    Dim EndNum          As Long
    Dim I               As Long
    Dim Dic             As Dictionary
    Dim cDic            As Dictionary
    Dim Buf             As String

    Set ShRowCol = New Dictionary

    For Each Sh In Worksheets

        KRow = 0
        KCol = 0
        '探査とすべき行番号、列番号を取得します。
        Call PosiRowCol(Sh, KRow, KCol)
        Set Dic = New Dictionary

        If KCol > 0 Then
            With Sh
                '行方向を探査します。
                EndNum = .Cells(.Rows.Count, KCol).End(xlUp).Row
                Set cDic = New Dictionary
                
                For I = KRow To EndNum
          '行名を取得
                    Buf = .Cells(I, KCol).Value
                    If Buf <> "" Then
                        '空でないこと
                        With cDic
                            If Not .Exists(Buf) Then
                                '未登録なら
                                '行名と行番号を登録します。
                                .Add Buf, I
                            End If
                        End With
                    End If
                Next I

                'キー行で登録します。
                With Dic
                    .Add "行", cDic
                End With
                Set cDic = Nothing

                '列方向を探査します。
                EndNum = .Cells(KRow, .Columns.Count).End(xlToLeft).Column
                Set cDic = New Dictionary

                For I = KCol To EndNum
          '列名を取得
                    Buf = .Cells(KRow, I).Value
                    If Buf <> "" Then
                        '空でないこと
                        With cDic
                            If Not .Exists(Buf) Then
                                '未登録なら
                                '列名と列番号を登録します。
                                .Add Buf, I
                            End If
                        End With
                    End If
                Next I

                'キー列で登録します。
            	With Dic
                    .Add "列", cDic
                End With
                Set cDic = Nothing

            End With

        End If

        'キーシート名で登録します。
        With ShRowCol
            .Add Sh.Name, Dic
        End With
        Set Dic = Nothing

    Next Sh

End Sub

'----------------------------------------------------------------------
Public Sub PosiRowCol(ByRef Sh As Worksheet, _
                      ByRef KRow As Long, _
                      ByRef KCol As Long)
    Dim Data            As Variant
    Dim baseRow         As Long
    Dim baseCol         As Long
    Dim I               As Long
    Dim J               As Long

    With Sh
        If .UsedRange Is Nothing Then
            Exit Sub
        End If
	
        '使われている領域の配列を取得します。
        Data = .UsedRange.Value
        '行・列番号を補正するため、UsedRange のトップセルの位置を取得
        With .UsedRange.Cells(1,1)
            baseRow = .Row
            baseCol = .Column
        End With
    End With

    '行列名を探します。
    For I = 1 To UBound(Data, 1)
        For J = 1 To UBound(Data, 2)
            If Data(I, J) = "行列名" Then
                '行番号、列番号を取得します。
                KRow = I + (baseRow - 1)
                KCol = J + (baseCol - 1)

                'I,J ループを抜けます。  
                I = UBound(Data, 1)
                J = UBound(Data, 2)
            End If

        Next J
    Next I

End Sub