Excel VBA交叉表参考

这是我第一次在Excel中使用VB的尝试,所以忍受着我。

我有一列名称,其中有多个重复的每个,然后在另一列是每个人花费在一个特定的项目的小时。 我的函数做的是在名称列表中,每次find与$ name相匹配的名称时,都会添加相应的小时数,然后返回总数。

现在这个工作时,我得到的input表是在同一张表,因为我使用的function,但是我想在表中的单独工作表上的结果。 我相信它是如何引用第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 

正如David所指出的那样,通过另一个表格的范围并操纵那里的数据。 请参阅以下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 

在行动:

工作表Sheet1:

在这里输入图像说明

Sheet2中:

在这里输入图像说明

在这里输入图像说明

希望这可以帮助。

你可以通过名字索引来访问任何表格,我总是喜欢用名字。

 Sheets("my_output_sheet_name").cells(row#, col#).value = total_hours 

当你做“Cells(i,NameColumn)”时,它假定当前/活动工作表。 按照上面所述,您可以访问任何表格,而不pipe哪个表格处于活动状态。

所以假设你也想在结果表中列出名字,紧跟在for循环之后,你可以这样做:

 Sheets("results").Cells(resultRow, NameColumn).value = name Sheets("results").Cells(resultRow, HourColumn).value = Hours 

显然你有一个名为“结果”的工作表,你将在每个名字后面增加“resultsRow”。

我意识到这并不能回答你的VBA问题,但是在没有VBA的情况下,在Excel中有这样一个更简单的方法。 尝试:

=SUMPRODUCT((NameColumn="Name")*Hours)

NameColumn通过在NameColumn (一个命名的范围 – 你可以用你的数据的地址replace它)中的Name来testing每个名字的NameColumn ,这个名字导致了一个TRUEFALSE值的数组。 当该数组乘以Hours范围(也是一个命名的范围)时, TRUE值被转换为1s,而FALSE值为0s。 然后SUMPRODUCT()添加结果。