2013-04-26 4 views
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 
+0

을하지만, 스크립트는 문자 "H"와 "P"를 확인하고, 이러한 무엇인가는 H와 P가 전에 reaquired 있습니까 숫자 값을 확인하고 싶습니까? –

+0

무엇이'prNg'입니까? 및'rngEachValue'? 거기에'rng'을 사용 하시겠습니까? –

+0

예 이러한 경우 rng (범위)를 의미합니다. "H"& "P"와 관련하여 - 셀에 이러한 문자가 포함되어 있지 않으면 어떤 조치도 취하고 싶지 않습니다. – user1624926

답변

4

나는이 대답을 좋은 질문으로 생각하고 있습니다. 나는 이것이 당신이 원하는 것을 할 것이라고 생각합니다! 십진수와 천 단위 구분 기호로도 작동합니다.

I합니다 (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 
+0

+1 30 초 앞선 날입니다 :) –

+0

두 분 모두 도움과 지원에 감사드립니다. K_B 당신은 이것에 많은 것을 넣었습니다. - 고마워요. 필립도 훌륭한 의견을 남겼습니다. – user1624926

+0

일반용으로 만들려고 했으므로 다른 Excel에서도 사용할 수 있습니다. 행운을 빌어 요! –

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