这是我第一次尝试在excel中使用VB,所以请耐心等待。
我有一列名称,其中每个名称都有多个副本,然后在另一列中是每个人在特定项目上花费的小时数。我的函数所做的是在名称列表中,每次找到与$ name匹配时,它会添加相应的小时数,然后返回总数。
现在,当我获取输入的表与我正在使用函数的同一张表上时,这是有效的,但我希望将结果放在表中的单独表格上。我认为它是如何引用第10行中的单元格的问题,但我不知道如何解决这个问题。
Function Hours(start as Range, finish As Range, name As String) As Double
Hours = 0#
RowStart = start.Row
RowFinish = finish.Row
NameColumn = start.Column
HourColumn = finish.Column
For i = RowStart To RowFinish
If Cells(i, NameColumn) = name Then Hours = Hours + Cells(i, HourColumn).Value
Next i
End Function
答案 0 :(得分:2)
正如大卫指出的那样,传递另一张纸的范围并操纵那里的数据。请参阅以下UDF。
Function GetTotalHours(EmpNameR As Range, EmpName As String) As Double
Dim CellR As Range, HoursTotal As Double
HoursTotal = 0
For Each CellR In EmpNameR
If CellR.Value = EmpName Then
HoursTotal = HoursTotal + CellR.Offset(0, 1).Value
End If
Next
GetTotalHours = HoursTotal
End Function
行动中:
<强> Sheet 1中:强>
<强> Sheet 2中:强>
希望这有帮助。
答案 1 :(得分:0)
您可以按名称索引访问任何工作表,我总是更喜欢按名称。
Sheets("my_output_sheet_name").cells(row#, col#).value = total_hours
当您执行“Cells(i,NameColumn)”时,它假设当前/活动工作表。按照上面的说法,您可以访问任何工作表,无论哪个工作表处于活动状态。
因此,假设您还想在结果表中列出名称,就在for循环之后,您可以这样做:
Sheets("results").Cells(resultRow, NameColumn).value = name
Sheets("results").Cells(resultRow, HourColumn).value = Hours
显然你有一张名为“results”的表格,你会在每个名字后面增加“resultsRow”。
答案 2 :(得分:0)
我意识到这不能回答你的VBA问题,但是在没有VBA的Excel中有一种更容易的方法。试试:
=SUMPRODUCT((NameColumn="Name")*Hours)
论坛通过测试NameColumn
中的每个名称(一个命名的范围 - 您可以用数据的地址替换它)和&#34;名称&#34;这会产生TRUE
和FALSE
值的数组。当该数组乘以Hours
范围(也是命名范围)时,TRUE
值将转换为1,FALSE
值为0。然后SUMPRODUCT()
添加结果。