Excel 如何在单元格中搜索和提取特定值-VBA

Excel 如何在单元格中搜索和提取特定值-VBA,excel,vba,Excel,Vba,我有以下数据,可通过以下链接查看: 使用以下逻辑: 从“Sheet1”中提取所有JPM(安排行)总值,并将其绘制在第2页的JPM列下的每一行上 例如,如果“Sheet2”中的B1等于BAML,则在第1页中搜索BAML,并从F列中提取其所有总值,然后插入BAML列下的“Sheet2” 请注意:例如,BAML可以单独位于单元格中,也可以位于C列单元格中的任何其他位置 我需要帮助和助手来开发一个宏,该宏可以显示输出,如上面的数据链接“Sheet2”中所示。我不确定,我将如何着手解决这个问题 任何帮助

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

使用以下逻辑:

从“Sheet1”中提取所有JPM(安排行)总值,并将其绘制在第2页的JPM列下的每一行上

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

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

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

任何帮助都将不胜感激

问候

输入数据(表1)

输出数据(表2)

如果您只需要每个合作者的总数,可以使用以下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代码段进行编码。为便于直观理解,解决方案轴心显示在源数据旁边

以下是解决方案和输出的步骤

  • 在工作表中添加一个按钮
  • 双击按钮并添加
    调用splitSortPivot()
  • 将模块添加到Excel项目中
  • 双击模块并复制以下代码
  • 保存、编译
  • 代码:

    输出屏幕截图:


    为什么不在此处附上源数据表的屏幕截图?您的链接需要登录凭据。。。dear@bonCodigo,感谢您的回复,由于我的个人资料中的信誉度较低,我没有执行显示屏幕截图任务的权限。对于给您带来的不便,我深表歉意,不过我已经更新了一个新的链接以供进一步参考。感谢您的时间和帮助。根据表1来源,例如第6行。你的价格是500英镑。有三个安排人。那么,这是否意味着总数应该是500*3,而每个安排人的贡献价是500?不清楚如何定义多个安排行记录中每个安排行的分摊价格。你能解释一下吗?谢谢你的回复@bonCodigo。在第6行中,每个安排行,如“CITG”、“BAML”和“BCG”,将各自贡献500英镑的价格,因此这一点显示在输出中。因此,第1页第6行中的每个安排行将有500个,第7-13行也是如此(这些行中所有三个安排行的1812价格)。安排人的地位从来都不一样。谢谢你的时间和帮助。非常感谢你的帮助。我真的很感谢你抽出时间。是否有可能看到每个安排行的价格以及总数。感谢您帮助解决此问题。在这种情况下,最有效的方法是编写一个小的vba代码段。感谢您的回答,但是宏是否能够在单元格中的任何位置读取排列程序的名称?谢谢你的时间和帮助。嗨,很抱歉回复晚了。是的,VBA宏可以处理它。请看一下更新。VBA代码将对每个贡献者的每一行价格进行排序,最后给出总数。您可能不再需要使用我前面提供的Excel公式。请注意,代码不是100%动态的,因为您仍然需要指定工作表名称、数据输入、输出范围、使用的行数等。如果您感兴趣,这将是一个很好的练习,让您了解这段代码实际上在做什么。帮助您将来修改代码。:)
    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