2

ユーザー入力がセルにコミットされるに発生するCell_Changeイベントに相当するものはありますVBAか? 新しい値がセルに入力される直前に、いくつかのチェックを追加する必要があります。VSTO

イベントが発生するまでWorkSheet_Changeに、Excel は既にユーザー入力を変更し、別の値に変換しています。ユーザーが入力した元の入力を取得する必要があります。

編集

より具体的には、私3E9の場合、たまたま有効な (非数値/非科学的) 入力である のような値を、Excel が科学的表記法に変換しないようにしたいと考えています。

これらの値は、ユーザーがワークシート全体の任意のセルに入力できるため、テキスト形式を事前に適用することはできません。有効な数値データに対して Excel が通常の機能を実行できなくなるためです。

だから私は計画しています:

  • 入力がセルに入って変換される直前に、どういうわけか入力を取得します。
  • 次に、それが私が見ている正確なパターンに適合するかどうかを確認し、その特定のセルにオンザフライでテキスト形式を適用します。
4

3 に答える 3

3

代わりに適用されている科学的表記法をトラップし、それをテキスト文字列に逆にすることができます

解析を処理するために RegExp で更新

  • 有効な値を初期テキストに再フォーマットします (つまり120E3、 または99E13)
  • マングルされた値をメッセージに置き換えてレンタルします (セルは既にテキストとしてフォーマットされているため、次回12E14はテキストのままになります)12E14

シート イベント コード

Private Sub Worksheet_Change(ByVal Target As Range)
Dim rng1 As Range
Dim strTmp As String
Dim objRegex As Object
Set objRegex = CreateObject("vbscript.regexp")
With objRegex
    .Pattern = "([1-9]+)(0+)"
    Application.EnableEvents = False
    For Each rng1 In Target.Cells
        If rng1.NumberFormat = "0.00E+00" Then
        rng1.NumberFormat = "@"
        strTmp = Len(.Replace(rng1.Value, "$2"))
            If .Test(rng1.Value) Then
            rng1.Value = "'" & .Replace(rng1.Value, "$1E") & strTmp
                Else
            rng1.Value = "Pls re-enter as text"
            End If
        End If
    Next
End With
Application.EnableEvents = True
End Sub
于 2013-04-09T12:47:46.167 に答える
1

元に戻す機能はどうですか?

Private Sub Worksheet_Change(ByVal Target As Range) 
    Dim OldValue As String, NewValue as string
    If Intersect(Target, Range("B:B")) Is Nothing Then Exit Sub 
    With Application 

        .EnableEvents = False 

        .Undo 
        'this is before
        OldValue = Target.Cells(1).Value 
        .Redo 
        'this is after 
        Newvalue = Target.Cells(1).value

        'do some check to see if you need to reverse the change 
        If oldvalue > newvalue then 
            .undo
            Msgbox "Not valid"
        end if

        .EnableEvents = True 

    End With

End Sub
于 2013-04-09T11:17:46.653 に答える