テキストボックスに数値と少数点のドットのみ入力できるようにする
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 をオンにします。
'----------------------------------------------------------------------
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
シートの列行に名前を付け名前と列・列番号のハッシュテーブル
'----------------------------------------------------------------------
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