2017-02-28 2 views
-1

(Excel 2010を使用して)前の数値以外の文字に基づいて、1つのセル内の一連の数値を合計する数式またはマクロを作成しようとしています。マクロは同じセル内のデータに基づいて数値を合計しますか?

例えば、私が読み、セルがあります。

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

をしかし、私はそれを読んでする必要があります:

ABC15|DEF13|HIJ2

すべての関連データ(単一のセルに来ますほとんどの場合、ランダムな順序であるため、問題は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つのセルに限定しながらこれを行う方法はありますか?

お時間を割いてお手伝いいただき、ありがとうございます。

+1

ようこそStackOverflow。これは無料のコード作成サービスではありませんのでご注意ください。しかし、私たちは、仲間のプログラマー(そして志望者)が自分のコードを書くのを助けることを熱望しています。 [良い質問をするにはどうすればよいですか](http://stackoverflow.com/help/how-to-ask)のヘルプトピックをお読みください。また、ツアー中に(http://stackoverflow.com/tour)、バッジを獲得することもできます。その後、達成したい課題を完了するために、これまでに書いたVBAコードで質問を更新してください(上記の式では解決できないため)。 – Ralph

+0

それは常に3文字と数字のどちらですか? – SJR

+0

はい、それは常に同じ形式のXYZ1(アルファ - アルファ - アルファ - 数字)に従います – Janim

答えて

0

ここでは、3つの文字と数字を前提とした別のアプローチがあります。 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

関連する問題