如何在单元格中搜索和提取某些值 - VBA

时间:2012-11-23 11:37:54

标签: excel-vba vba excel

我有以下数据,可以通过以下链接看到:

Example of Input and desired Output Data

使用以下逻辑:

  

从“Sheet1”中提取所有JPM(编曲者)的总值,并将其绘制在表2中,在JPM列的每一行下。

     

例如,如果“Sheet2”中的B1等于BAML,则在工作表1中搜索BAML并从F列中提取其所有总值并插入BAML列下的“Sheet2”中。

     

请注意:例如,BAML可以单独存在于单元格中,也可以位于C列单元格中的任何其他位置。

我需要帮助和助手来开发一个宏,它可以在“Sheet2”中显示上面数据链接中所示的输出。我不确定,我将如何解决这个问题。

非常感谢任何帮助。

亲切的问候

输入数据(Sheet1)

enter image description here

输出数据(Sheet2) enter image description here

1 个答案:

答案 0 :(得分:1)

如果您只需要每个cotributor的总数,您可以使用以下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. 保存,编译
  6. 代码:

    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
    

    输出屏幕截图:

    enter image description here