2017-02-28 1 views
-1

Excel (2010)을 사용하여 이전의 숫자가 아닌 문자를 기반으로 한 셀 내에서 일련의 숫자를 더하기 위해 수식 또는 매크로를 만들려고합니다.동일한 셀 내의 데이터를 기반으로 숫자 값의 합계를 계산하려면?

예를 들어, 내가 읽고 셀이 있습니다

ABC1|HIJ2|ABC4|ABC3|DEF5|ABC2|DEF8|ABC5

을하지만 그것을 읽을 필요가 :

ABC15|DEF13|HIJ2

모든 관련 데이터 (A의 단일 셀에 온다 대부분) 임의 순서이므로 문제는 2 단계로 구성됩니다. 먼저 셀 내의 모든 데이터를 자동으로 알파벳 순으로 정렬하고 모든 "ABC", "DEF"등을 합산합니다.

다음 코드를 사용하여 데이터를 자동으로 알파벳순으로 정렬했지만 지금은 어디서 가야할지를 놓치고 있습니다. 내 인터넷 검색을 통해 이러한 종류의 작업을 수행하려면 멀티 태스킹이 필요합니다. 세포 용액.

Sub Macro() 

Dim Rng As Range 
Dim WorkRng As Range 
Dim Arr As Variant 
On Error Resume Next 
Set WorkRng = Application.Selection 
Set WorkRng = Application.InputBox("Range", xTitleId, WorkRng.Address, Type:=8) 
Set objArrayList = CreateObject("System.Collections.ArrayList") 
For Each Rng In WorkRng 
Arr = VBA.Split(Rng.Value, "|") 
For i = 0 To UBound(Arr) 
    xMin = i 
    For j = i + 1 To UBound(Arr) 
     If Arr(xMin) > Arr(j) Then 
      xMin = j 
     End If 
    Next j 
    If xMin <> i Then 
     temp = Arr(i) 
     Arr(i) = Arr(xMin) 
     Arr(xMin) = temp 
    End If 
Next i 
Rng.Value = VBA.Join(Arr, "|") 
Next 
End Sub 

마지막 결과를 단일 셀로 제한하면서이 작업을 수행 할 수있는 방법이 있습니까?

시간을내어 도움을 주셔서 감사합니다.

+1

Welcome to StackOverflow. 이 코드는 무료 코드 작성 서비스가 아닙니다. 그러나 동료 프로그래머 (및 지망자)가 자신의 코드를 작성하는 것을 돕기 위해 열심입니다. [좋은 질문을하는 방법] (http://stackoverflow.com/help/how-to-ask)의 도움말 항목을 읽으십시오. 그렇게하는 동안 [둘러보기] (http://stackoverflow.com/tour)를하고 배지를 획득 할 수도 있습니다. 그 후에, 당신이 달성하고자하는 과제를 완료하기 위해 지금까지 작성한 VBA 코드로 질문을 업데이트하십시오. (공식은 공식으로 풀 수 없기 때문에). – Ralph

+0

항상 3 글자이고 그 다음 숫자입니까? – SJR

+0

예, 항상 동일한 형식의 XYZ1 (영문자 - 영문자)을 사용합니다. – Janim

답변

0

여기에 다른 접근법이 있습니다 (세 글자 + 숫자로 가정). A1에 입력을 가정하고 G1에 결과를 저장합니다.

Sub x() 

Dim v, vOut(), i As Long, n As Long, s As String, s1 As String, oSL As Object 

v = Split(Range("A1"), "|") 
ReDim vOut(1 To UBound(v), 1 To 2) 

Set oSL = CreateObject("System.Collections.Sortedlist") 
For i = LBound(v) To UBound(v) 
    oSL.Add CStr(v(i)), Nothing 
Next i 

With CreateObject("Scripting.Dictionary") 
    For i = 0 To oSL.Count - 1 
     s1 = Left(oSL.GetKey(i), 3) 
     If Not .Exists(s1) Then 
      n = n + 1 
      vOut(n, 1) = s1 
      vOut(n, 2) = Val(Right(oSL.GetKey(i), Len(oSL.GetKey(i)) - 3)) 
      .Add s1, n 
     Else 
      vOut(.Item(s1), 2) = vOut(.Item(s1), 2) + Val(Right(oSL.GetKey(i), Len(oSL.GetKey(i)) - 3)) 
     End If 
    Next i 
End With 

For i = 1 To n 
    s = s & "|" & vOut(i, 1) & vOut(i, 2) 
Next i 

Range("G1") = Mid(s, 2) 

End Sub 
+0

이것은 ... 완벽합니다. 고맙습니다. – Janim

+0

다행이었습니다. – SJR

관련 문제