特定の列に特定の形式を強制する方法を見つけるのに問題があります。
私が扱っているのは、在庫を追跡するために使用するスプレッドシートです。複数の人が使用しているため、場所の形式に一貫性がありません。
(例:A1、A01、A-1、A-01)
これにより、A1、A2ではなく、A1がA10を超える、少しの痛みがソートされます。入力内容に関係なく、Letter + 2桁の数値形式(A01)に修正されるように修正する必要があります。
前もって感謝します
特定の列に特定の形式を強制する方法を見つけるのに問題があります。
私が扱っているのは、在庫を追跡するために使用するスプレッドシートです。複数の人が使用しているため、場所の形式に一貫性がありません。
(例:A1、A01、A-1、A-01)
これにより、A1、A2ではなく、A1がA10を超える、少しの痛みがソートされます。入力内容に関係なく、Letter + 2桁の数値形式(A01)に修正されるように修正する必要があります。
前もって感謝します
回答:
これは、入力列内では不可能です。
また、わかりやすいプロンプトとメッセージでデータ検証を使用することもできます。データ検証式(文字の大文字を使用すると仮定)は次のようになります。
=AND(CODE(A1)>=65,CODE(A1)<=90,CODE(MID(A1,2,1))>=48,CODE(MID(A1,2,1))<=57,CODE(MID(A1,3,1))>=48,CODE(MID(A1,3,1))<=57)
ワークシートのコード領域に次のイベントマクロを配置します。
Private Sub Worksheet_Change(ByVal Target As Range)
Dim B As Range, s As String
Set B = Range("B:B")
If Intersect(Target, B) Is Nothing Then Exit Sub
s = Target.Value
If Len(s) <> 3 Then GoTo fixit
If Not Left(s, 1) Like "[A-Z]" Then GoTo fixit
If Not IsNumeric(Mid(s, 2, 2)) Then GoTo fixit
Exit Sub
fixit:
Application.EnableEvents = False
Target.Value = "A00"
Application.EnableEvents = True
End Sub
このサンプルマクロは、列Bのエントリを監視および修正します。エントリが有効な場合、それらはそのまま残されます。エントリが無効な場合、A00に置き換えられます。
値を確認するだけで、確認ロジックがそれほど複雑ではない場合、これは標準のExcelデータ検証で実行できます。ただし、値を正しい形式に再フォーマットする必要があるため、VBAまたはVisual Studio Tools for Officeを使用する必要があります。以下は、必要なことを行う簡単なVBAマクロです。
この魔法は、Worksheet_Changeイベントが発生したときに発生します。例のために、最初の列に単一の値を入力すると仮定します。CorrectPartNoの関数は力仕事を行います。入力された値を分析し、正しい形式の値を返すか、検証エラーがあったことを示す何も返しません(最大長のみをチェックします)。処理はあなたの例で動作しますが、おそらく現実世界には単純すぎます。正規表現または他の同様の強力な処理で簡単に拡張できます。
イベントハンドラは、セルを正しくフォーマットされた部品番号で更新するか、ユーザーが入力した値を太字と赤にしてエラーを示します。
Private Sub Worksheet_Change(ByVal Target As Excel.Range)
Dim NewValue As String
If (Target.Column = 1 And Target.Count = 1) Then
Application.EnableEvents = False
NewValue = CorrectPartNo(Target.Value)
If (Len(NewValue) = 0) Then
Target.Font.Color = vbRed
Target.Font.Bold = True
Else
Target.Value = NewValue
End If
Application.EnableEvents = True
End If
End Sub
Function CorrectPartNo(PartNo As String)
Dim StartPartNo As String
Dim EndPartNo As String
Dim EndPartNoPosition As Integer
StartPartNo = Left(PartNo, 1)
If (Mid(PartNo, 2, 1) = "-") Then
If (Len(PartNo) > 4) Then
CorrectPartNo = ""
Exit Function
Else
EndPartNoPosition = 3
End If
Else
If (Len(PartNo) > 3) Then
CorrectPartNo = ""
Exit Function
Else
EndPartNoPosition = 2
End If
End If
EndPartNo = Right("0" + Mid(PartNo, EndPartNoPosition), 2)
CorrectPartNo = StartPartNo + EndPartNo
End Function