单元格的位置和提取数值

时间:2013-04-26 10:42:57

标签: excel excel-vba vba

我目前正在“尝试”在Excel中设置网格

  • 用户输入了引用(例如HP1HP234)和
  • 我可以自动检测输入的单元格和单元格中的数值(例如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

2 个答案:

答案 0 :(得分:4)

我发现这是一个很好的问题,所以把一些工作放到答案中。我想这会做你想要的!它甚至适用于十进制和千位分隔符。

我承认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

答案 1 :(得分: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