Excel 如何在单元格中搜索和提取特定值-VBA
我有以下数据,可通过以下链接查看: 使用以下逻辑: 从“Sheet1”中提取所有JPM(安排行)总值,并将其绘制在第2页的JPM列下的每一行上 例如,如果“Sheet2”中的B1等于BAML,则在第1页中搜索BAML,并从F列中提取其所有总值,然后插入BAML列下的“Sheet2” 请注意:例如,BAML可以单独位于单元格中,也可以位于C列单元格中的任何其他位置 我需要帮助和助手来开发一个宏,该宏可以显示输出,如上面的数据链接“Sheet2”中所示。我不确定,我将如何着手解决这个问题 任何帮助都将不胜感激 问候 输入数据(表1) 输出数据(表2)Excel 如何在单元格中搜索和提取特定值-VBA,excel,vba,Excel,Vba,我有以下数据,可通过以下链接查看: 使用以下逻辑: 从“Sheet1”中提取所有JPM(安排行)总值,并将其绘制在第2页的JPM列下的每一行上 例如,如果“Sheet2”中的B1等于BAML,则在第1页中搜索BAML,并从F列中提取其所有总值,然后插入BAML列下的“Sheet2” 请注意:例如,BAML可以单独位于单元格中,也可以位于C列单元格中的任何其他位置 我需要帮助和助手来开发一个宏,该宏可以显示输出,如上面的数据链接“Sheet2”中所示。我不确定,我将如何着手解决这个问题 任何帮助
如果您只需要每个合作者的总数,可以使用以下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()
为什么不在此处附上源数据表的屏幕截图?您的链接需要登录凭据。。。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