【发布时间】:2020-09-17 16:40:32
【问题描述】:
在一张表中,我有一个姓名列表,在另一列中有一个与之相关的金额。我需要在另一张纸的一列中写下这些名称而不重复。当名称重复时,我还需要汇总金额。 例如:
XXXX 20
YYYY 30
XXXX 10
我的结果应该是
XXXX 30
YYYY 30
我正在执行一个 for 循环来遍历名称,如果我没有在结果列中写下该名称,我会写下它。如果我已经写了,我将不得不留在同一行并计算金额的总和。 问题是我尝试使用 Range.Find,但即使名称已经写好,它也总是返回 Nothing。
代码如下:
Sub CommandButton1_Click()
Dim rif_reg As Integer
Dim rif_col As Integer
Dim riga_vuota As Integer
Dim rif_foglio As Integer
Dim rowNum As Range
For Each area In Worksheets("XXX").Range("C15:C26,C30:C41,C44:C55,C58:C69").Areas 'more than 1 selected area
For Each cell In area 'loop through each cell in the selected range
If IsEmpty(cell) = False Then
If IsNumeric(cell) = False Then
If Range("A61:A74").Find(What:=cell.Value2, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True) is Nothing Then 'search if the name has not being inserted yet
Cells(rif_rig + 61, rif_col + 1) = cell 'Nominativo
Cells(rif_rig + 61, rif_col + 7) = Worksheets("XXX").Cells(area.Cells(1).Row, rif_col + 1).Value2 'Ruolo
Cells(rif_rig + 61, rif_col + 11) = (Worksheets("XXX").Cells(cell.Row, rif_col + 5).Value2 * Worksheets("YYY").Cells(rif_foglio + 32, rif_col + 2)) 'Quota Lordo
rif_rig = rif_rig + 1
Else
Set rowNum = Range("A61:A74").Find(What:=cell.Value2, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True)
Cells(rowNum.Row, rif_col + 11) = (Cells(rowNum.Row, rif_col + 11) + Worksheets("XXX").Cells(cell.Row, rif_col + 5).Value2 * Worksheets("YYY").Cells(rif_foglio + 32, rif_col + 2)) 'Quota Lordo
If Cells(rowNum.Row, rif_col + 7) <> Worksheets("XXX").Cells(area.Cells(1).Row, rif_col + 1).Value2 Then
Cells(rowNum.Row, rif_col + 7) = Cells(rowNum.Row, rif_col + 8) & "," & Worksheets("XXX").Cells(area.Cells(1).Row, rif_col + 1).Value2 'Ruolo
Else
Cells(rowNum.Row, rif_col + 7) = Worksheets("XXX").Cells(area.Cells(1).Row, rif_col + 1).Value2 'Ruolo
End If
End If
Else
End If
Else
End If
Next
areaCount = areaCount + 1
Next
由于这不起作用,我尝试使用 Application.Match 但这并没有给我正确的行号
Sub CommandButton1_Click()
Dim rif_reg As Integer
Dim rif_col As Integer
Dim riga_vuota As Integer
Dim rif_foglio As Integer
Dim rowNum As Long
For Each area In Worksheets("XXX").Range("C15:C26,C30:C41,C44:C55,C58:C69").Areas 'more than 1 selected area
For Each cell In area 'loop through each cell in the selected range
If IsEmpty(cell) = False Then
If IsNumeric(cell) = False Then
If IsError(Application.Match(cell.Value2, Range("A61:A74"), 0)) Then 'search if the name has not being inserted yet
Cells(rif_rig + 61, rif_col + 1) = cell 'Nominativo
Cells(rif_rig + 61, rif_col + 7) = Worksheets("XXX").Cells(area.Cells(1).Row, rif_col + 1).Value2 'Ruolo
Cells(rif_rig + 61, rif_col + 11) = (Worksheets("XXX").Cells(cell.Row, rif_col + 5).Value2 * Worksheets("YYY").Cells(rif_foglio + 32, rif_col + 2)) 'Quota Lordo
rif_rig = rif_rig + 1
Else
rowNum = Application.WorksheetFunction.Match(cell.Value2, Range("A61:A74"), 0)
Cells(rowNum, rif_col + 11) = (Cells(rowNum, rif_col + 11) + Worksheets("XXX").Cells(cell.Row, rif_col + 5).Value2 * Worksheets("YYY").Cells(rif_foglio + 32, rif_col + 2)) 'Quota Lordo
If Cells(rowNum, rif_col + 7) <> Worksheets("XXX").Cells(area.Cells(1).Row, rif_col + 1).Value2 Then
Cells(rowNum, rif_col + 7) = Cells(rowNum, rif_col + 8) & "," & Worksheets("XXX").Cells(area.Cells(1).Row, rif_col + 1).Value2 'Ruolo
Else
Cells(rowNum, rif_col + 7) = Worksheets("XXX").Cells(area.Cells(1).Row, rif_col + 1).Value2 'Ruolo
End If
End If
Else
End If
Else
End If
Next
areaCount = areaCount + 1
Next
谢谢, 卡洛塔。
附:我是 VBA 新手,所以我的代码可能非常混乱
【问题讨论】:
-
为什么不直接使用数据透视表?
-
无论何时使用
Range()或Cells(),您都需要使用特定的工作表对象对其进行限定,否则您的代码可能 工作与否,具体取决于发生的工作表活跃起来。 -
...似乎还有一堆缺失的代码,并且您使用的一些变量不是您声明的变量 - 例如
rif_regvsrif_rig -
@BigBen - 你是对的,因为我选择了错误的代码行。我要在第一个宏中选择 Find 代码。
rowNum = Range("A61:A74").Find(What:=cell.Value2, LookIn:=xlValues, LookAt:=xlWhole, MatchCase:=True).Row -
@GMalc - 除了最好先测试查找是否成功,而不是最后链接
.Row。
标签: excel vba find range match