0

以下のリンクを使用して表示できる次のデータがあります。

入力データと目的の出力データの例

次のロジックを使用します。

「シート 1」からすべての JPM (アレンジャー) の合計値を抽出し、それらをシート 2 の JPM と書かれた列の下の各行にプロットします。

たとえば、「シート 2」の B1 が BAML と等しい場合、シート 1 で BAML を検索し、列 F からすべての合計値を抽出して、「シート 2」の BAML 列の下に挿入します。

注: たとえば、BAML は単独でセルに配置することも、列 C のセル内の他の位置に配置することもできます。

上記のデータ リンクの「Sheet2」に示されている出力を表示できるマクロを開発するには、ヘルプとアシスタントが必要です。どうすればこの問題を解決できるかわかりません。

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

敬具

入力データ(Sheet1)

ここに画像の説明を入力

出力データ(Sheet2) ここに画像の説明を入力

4

1 に答える 1

1

各寄稿者の合計のみが必要な場合は、次のExcel式を使用して行うことができます。JPM、CITG、BAMLなどの寄稿者名に基づいて基準を変更します。

方式:

=SUMIF($C$2:$C$13,"*JPM*",$B$2:$C$13)

出力

JPM      CITG    BAML    BCG     CIBC       DB
2432.74  500     500     500     1812.84    1812.84

これで十分ですか?それ以外の場合は、分散ピボットビューで各貢献者の価格を表示しますか?

OPの要求は、各寄稿者の行ごとに価格を並べ替えることであるため、VBAスニペットがコーディングされます。視覚的に理解しやすくするために、ソリューションピボットがソースデータの横に表示されます。

以下は、解決と出力の手順です。

  1. シートにボタンを追加します。
  2. ボタンをダブルクリックして追加しますCall splitSortPivot()
  3. Excelプロジェクトにモジュールを追加します
  4. モジュールをダブルクリックして、次のコードをコピーします
  5. 保存、コンパイル

コード:

Option Explicit

Public Sub splitSortPivot()
Dim ws As Worksheet
Dim sourceRange As Range
Dim rng As Range
Dim i, j, k As Integer    
Dim sourceArray As Variant
Dim arrangersArray As Variant
Dim ary As Variant

Set ws = Worksheets("Sheet1")
Set sourceRange = ws.Range("B2:C13")

'Based on the number of records +2 you have in source sheet (Sheet1)
'you may set the first dimension's upper bound of the array
'+1 for header and +1 for total --> in current case 12  + 1 + 1 = 14
'even setting this number can be done programmatically using used rows in C column.
ReDim arrangersArray(0 To 13, 5)

'This code can be optimized to add names programmatically
arrangersArray(0, 0) = "JPM"
arrangersArray(0, 1) = "CITG"
arrangersArray(0, 2) = "BAML"
arrangersArray(0, 3) = "BCG"
arrangersArray(0, 4) = "CIBC"
arrangersArray(0, 5) = "DB"

sourceArray = sourceRange.Value

    For j = LBound(sourceArray, 1) To UBound(sourceArray, 1)
        If InStr(1, sourceArray(j, 2), ",") > 0 Then
            ary = Split(sourceArray(j, 2), ",")
            For k = LBound(ary) To UBound(ary)
                For i = LBound(arrangersArray, 2) To UBound(arrangersArray, 2)
                    If arrangersArray(0, i) = Trim(ary(k)) Then 
                       arrangersArray(j, i) = sourceArray(j, 1)
                       arrangersArray(13, i) = arrangersArray(13, i) + arrangersArray(j, i)
                    End If
                Next i
            Next k
        Else
            For k = LBound(arrangersArray, 2) To UBound(arrangersArray, 2)
                If arrangersArray(0, k) = sourceArray(j, 2) Then
                    arrangersArray(j, k) = sourceArray(j, 1)
                    arrangersArray(13, k) = arrangersArray(13, k) + arrangersArray(j, k)
                End If
            Next k
        End If
    Next j

'Output the processed array into the Sheet. 
Range("G1").Resize(UBound(arrangersArray) + 1, _ 
UBound(Application.Transpose(arrangersArray))) = arrangersArray

End Sub

出力スクリーンショット:

ここに画像の説明を入力してください

于 2012-11-23T13:29:37.643 に答える