3

現在、Excel でグリッドを設定しようとしています。

  • ユーザーが参照 (HP1または などHP234) を入力し、
  • 入力されたセルとセル内の数値を自動的に検出できます (例: HP1= 1、HP234= 234)。

以下のコードで遊び始めました。セクションmsgbox("work")では、コードをテストするためだけに使用しています。ここでは、セル内の数値とセルの位置を返し、レポートに表示できるようにします。

どんな助けでも大歓迎です。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim rng As Range
Dim rngTarget As Range

Set rngTarget = Range("a1:a100")    
If Not Intersect(Target, Range("A1:A100")) Is Nothing Then        
    For Each rng In rngTarget   
        If InStr(1, prNg, "H") > 0 And InStr(1, rngEachValue, "P") = 0 Then
               MsgBox ("works")            
        End If    
    Next    
End If    

End Sub
4

2 に答える 2

4

これはいい質問だと思ったので、答えに少し力を入れてください。私はこれがあなたが望むことだけをすると思います!10 進数や 1000 単位の区切り記号でも機能します。

関数は別の方法でも作成できることは認めNumericalValueます (最初と最後の数字を見つけてmid、文字列のその部分を取得します。

Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim rng As Range
    Dim rngTarget As Range
    Dim varValue As Variant

    Set rngTarget = Range("a1:a100")

    If Not Intersect(Target, rngTarget) Is Nothing Then
        For Each rng In rngTarget
            'only check cells that contain an H and a P
            If InStr(1, rng, "H") > 0 And InStr(1, rng, "P") > 0 Then
                'find the numerical value if any (Empty if not found)
                varValue = NumericalValue(rng.Value2)
                If Not IsEmpty(varValue) Then
                    MsgBox "hurray the value of cell " & rng.AddressLocal & " is " & varValue
                End If
            End If
        Next
    End If

End Sub

'return the first numerical value found in the cell
Private Function NumericalValue(ByVal strValue As String) As Variant
    Dim intChar As Integer
    Dim booNumberFound As Boolean
    Dim intDecimal As Integer

    booNumberFound = False

    NumericalValue = Val(strValue)

    For intChar = 1 To Len(strValue) Step 1
        'if a number found then grow the total numerical value with it
        If IsNumeric(Mid(strValue, intChar, 1)) Then
            NumericalValue = NumericalValue * IIf(intDecimal = 0, 10, 1) + _
                    Val(Mid(strValue, intChar, 1)) * 10 ^ -intDecimal
            If intDecimal > 0 Then
                intDecimal = intDecimal + 1
            End If
            booNumberFound = True
        'if the decimal separator is found then set the decimal switch
        ElseIf intDecimal = 0 And booNumberFound = True And Mid(strValue, intChar, 1) = Application.DecimalSeparator Then
            intDecimal = 1
        'skip the thousand separator to find more numbers
        ElseIf booNumberFound = True And Mid(strValue, intChar, 1) = Application.ThousandsSeparator Then
        ElseIf booNumberFound = True Then
            Exit For
        End If
    Next intChar

End Function
于 2013-04-26T11:27:39.363 に答える
1

ほとんどの場合、以下を試してください。

Private Sub Worksheet_Change(ByVal Target As Range)

Dim rng As Range
Dim rngTarget As Range
Dim sText As String

Set rngTarget = Range("a1:a100")

If Not Intersect(Target, Range("A1:A100")) Is Nothing Then    
    For Each rng In rngTarget        
        If InStr(1, rng.Text, "H") > 0 And InStr(1, rng.Text, "P") > 0 Then    
            sText = rng.Text
            sText = Replace(sText, "H", "")
            sText = Replace(sText, "P", "")
            Debug.Print rng.Address & " = " & Val(sText)   
        End If    
    Next    
End If

End Sub
于 2013-04-26T11:34:37.997 に答える