Excel VBA跨表引用

时间:2014-08-15 15:41:39

标签: excel vba

这是我第一次尝试在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

3 个答案:

答案 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中:

enter image description here

<强> Sheet 2中:

enter image description here

enter image description here

希望这有帮助。

答案 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;这会产生TRUEFALSE值的数组。当该数组乘以Hours范围(也是命名范围)时,TRUE值将转换为1,FALSE值为0。然后SUMPRODUCT()添加结果。