VBAの入力規則について質問です。
Excelで、D列は全角50文字(半角100文字)以内の入力を可能とし、
それ以上の入力の場合、エラーを表示させたいと思います。
全角と半角をバイト数で判別し、以下のようなコードを考えましたが、
全角の場合しかうまくできません。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim ByteCount As Long
ByteCount = LenB(StrConv(Target, vbFromUnicode))
If Target.Column = 4 Then
Select Case ByteCount
Case Is > 100
With Target.Validation
.Add _
Type:=xlValidateTextLength, _
AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:=1, Formula2:=100
.ErrorTitle = "入力エラー"
.ErrorMessage = "全角50文字(半角100文字)以内で入力してください。"
.IgnoreBlank = False
End With
Case 1 To 100
With Target.Validation
.Add _
Type:=xlValidateTextLength, _
AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, Formula1:=1, Formula2:=50
.ErrorTitle = "入力エラー"
.ErrorMessage = "全角50文字(半角100文字)以内で入力してください。"
.IgnoreBlank = False
End With
End Select
End If
End Sub
アドバイスをよろしくお願いいたします。
No.2ベストアンサー
- 回答日時:
>ファイルの軽量化のため、VBAで設定したいと思っています。
そういう趣旨なら、全部、マクロにしてしまえばいかがですか?
なお、CheckByte関数はおまけです。ESCを押した時に、バイト数で文字を切るプログラムです。Mid 関数では、Byte では切ることは出来ません。しかし、100Byte でもなると、長くなり、Application.Undo のほうが楽です。
CheckByteは、また、Option 引数を付けなければ、バイト数をカウントすることになります。
'//
Const mLIMIT As Long = 10 '文字制限数
Private Sub Worksheet_Change(ByVal Target As Range)
Dim msgRtn As VbMsgBoxResult
If Target.Column <> 4 Then Exit Sub 'D列
If Target.Cells.Count > 1 Then Exit Sub
If Target.Value = "" Then Exit Sub
Application.EnableEvents = False
If LenB(StrConv(Target.Value, vbFromUnicode)) > mLIMIT Then
msgRtn = MsgBox("全角50文字(半角100文字)以内で入力してください。", 16 + vbRetryCancel, "入力エラー")
If msgRtn = vbIgnore Then
Application.SendKeys "[F2]"
Application.EnableEvents = True
Exit Sub
ElseIf msgRtn = vbCancel Then
Application.Undo
'Target.Value = CheckByte(Target.Value, mLIMIT) 'ESCで、文字を制限まで切る
On Error GoTo 0
End If
End If
Application.EnableEvents = True
End Sub
Function CheckByte(ByVal strTxt As String, Optional ilimit As Long)
'バイトで文字列を切る
Dim i As Long
Dim a() As Byte
Dim b(1) As Byte
Dim cnt As Long
Dim buf As String
a = strTxt
For i = 0 To UBound(a) Step 2
If CLng(a(i + 1)) < 10 Then
cnt = cnt + 1
Else
cnt = cnt + 2
End If
b(0) = a(i): b(1) = a(i + 1)
buf = buf & CStr(b())
If cnt >= ilimit Then
Exit For
End If
Next
If ilimit > 0 Then
CheckByte = buf
Else
CheckByte = cnt
End If
End Function
ありがとうございます。
すばらしい動きになりました。
コードの全てを理解することはできないので、
理解できる部分のみ引用させていただきます。
No.1
- 回答日時:
なぜ、マクロにしているのかさっぱり分かりません。
一端、文字が入ってから、マクロで入力規則が設定されるわけですから、その前に、マクロでも判定しなければ、意味がないと思います。それに、入力規則の上から入力規則を設定しようとしても、エラーが発生してしまいますから、入力規則が設定されているか判定が必要になります。
----
入力規則の「ユーザー設定」で
数式
=AND(LENB(D1)>1,LENB(D1)<100)
----
エラーメッセージを
タイトル 入力エラー
「全角50文字(半角100文字)以内で入力してください。」
といればよいと思いますね。
----
一応、ここまでにしておきます。どうしたらよいかは、レスを付けてください。
この回答への補足
回答ありがとうございます。
マクロを使わずにセルに設定すると、ファイル容量が大きくなってしまうのです。
ここでは1列しか設定しませんでしたが、実際は5列あり、
データ件数も莫大な量です。
ファイルの軽量化のため、VBAで設定したいと思っています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Visual Basic(VBA) エクセルのVBAでダブルクリックでチェックを入れたあと 1 2022/10/26 20:30
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Access(アクセス) Accessのテキストボックスの入力文字制限 1 2023/01/18 20:43
- Visual Basic(VBA) 【再投稿】VBAで動作しなくて困っています 2 2022/10/11 11:05
- Visual Basic(VBA) Excelにて、シート1の行を削除するとシート2のシート1と同じ番号の行も削除したい 3 2022/05/08 04:24
- Visual Basic(VBA) 【再々投稿】VBAのプログラムで動作しなくて困っています 8 2022/10/14 09:06
- Visual Basic(VBA) 【追加】ファイルを閉じてダイアログで保存した時だけ処理の実行をする 3 2022/03/23 15:43
- Excel(エクセル) エクセル VBA For Next 繰り返しの書き方を教えてください 6 2022/09/01 14:11
- Visual Basic(VBA) 【Excel VBA】自動メール送信の機能追加 5 2022/09/29 12:53
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「キャンディ」
-
エクセル文字列で縦書きカタカ...
-
DELLのパソコンで大文字小文字...
-
再インストールで…
-
入力していない文字が勝手に連...
-
ユーザー名に大文字を使用して...
-
マイページの出し方が分かりま...
-
2週間ほど前からtokyomotionと...
-
PCのグーグルマップで現在地が...
-
ワードで直径4cmの円を作成...
-
アイコンに、四角い枠が出来て...
-
パソコンの画面上に黒い四角が...
-
パソコンで見た時とスマホで見...
-
パソコンから、いきなり警告音...
-
リンクに飛べる様にする際 「C...
-
メールソフト「Thunderbird」で...
-
ヤフー。トップページに戻ると1...
-
office365 対処方法を教えてく...
-
化学のケムスケッチの質問です ...
-
Windows Defender Scheuled Sca...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
エクセル文字列で縦書きカタカ...
-
DELLのパソコンで大文字小文字...
-
「キャンディ」
-
ユーザー名に大文字を使用して...
-
3種類の円マークの違い
-
MOS検定 カナ入力でもOK?
-
VBAの入力規則について質問です。
-
ギフトIDの登録がよくわからない。
-
キーボードの、入力の半角英数...
-
データ入力のコツ
-
エクセルとアクセスでローマ数...
-
SO902iの「ヴ」の入力の仕方に...
-
入力していない文字が勝手に連...
-
キーボードで入力される文字が...
-
しっかりローマ字打ちはできる...
-
windowsのエクスプローラの検索...
-
マインクラフトpc版を買おうと...
-
男性に質問です。 40代男性なの...
-
英語の小文字が出ない
-
ブログ等でのリンクの貼り方に...
おすすめ情報