从同一工作簿中的另一个工作表读取数据的用户定义函数

Posted

技术标签:

【中文标题】从同一工作簿中的另一个工作表读取数据的用户定义函数【英文标题】:User Defined Function that reads data from another woorksheet within the same workbook 【发布时间】:2019-02-16 01:57:51 【问题描述】:

这是我的工作簿的结构。

一张名为“export”的工作表包含每个酒店的所有房间密钥(它们可以重复)(2k 行)。

一张名为“delete”的工作表包含所有要删除的房间键(100 行)。

我想要的是从工作表“delete”创建一个函数,您将“roomkey”作为参数传递,它会告诉您该值在“export”工作表中的 roomkey 列中重复了多少次。

我的想法是按房间键过滤,然后计算选择中有多少行并返回该数字。我想我不能在函数中调用另一个工作表。

Public Function HowManyRatePlansPerRoom(Roomkey As String) As Integer

Dim SheetName As String
Dim ws1 As Worksheet
Dim ws2 As Worksheet
Dim LastRow As Integer
Dim Rowz As Integer

On Error GoTo errorHandler

'Application.ScreenUpdating = True

Set ws1 = Sheets("Export")
ws1.Activate
ws1.Cells(1, 1).Select

'Find the last row
LastRow = ws1.Range("A1").CurrentRegion.Rows.Count

'select the data set
ws1.Range("A1:BI" & CStr(LastRow)).Select

'filter table by roomkey
Selection.AutoFilter Field:=1, Criteria1:=Roomkey

'this counts the data in the filter and -1 means minus the header
Rowz = ws1.AutoFilter.Range.Columns(1).SpecialCells(xlCellTypeVisible).Cells.Count - 1

HowManyRatePlansPerRoom = Rowz

errorHandler:
    MsgBox "The following error occurred: " & Err.Description
    Err.Clear

End Function

这个想法的背景是如果房间钥匙在“导出”时重复了 5 次,而我在“删除”时有 5 个“房间钥匙”,我需要删除那个房间。另一方面,如果我有 5 个用于“删除”的房间钥匙,但只有两个用于“导出”,我必须离开房间。

【问题讨论】:

访问其他工作表中的数据在 UDF 中工作得很好。您只是无法对它们执行 UI 操作。见How to avoid using Select in Excel VBA。 【参考方案1】:

试试这个:

Public Function Roomkey_Count(sRoomkey As String) As Byte
Dim bOutput As Byte
Dim rg As Range, lRow As Long

    With ThisWorkbook.Sheets("Export")
        lRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set rg = .Cells(1).Resize(lRow)
    End With
    bOutput = WorksheetFunction.CountIf(rg, sRoomkey)

    Roomkey_Count = bOutput

    End Function

【讨论】:

以上是关于从同一工作簿中的另一个工作表读取数据的用户定义函数的主要内容,如果未能解决你的问题,请参考以下文章

在同一活动工作簿中从一个工作表复制和粘贴到另一个工作表时出现错误 1004

在 Google Workbooks 之间导入命名范围数据

将同一工作簿中的多个 Excel 工作表复合到一张工作表中

从一个工作簿中查找单元格并将其复制到另一个工作簿

VBA:如果工作簿中的工作表名称等于从用户窗体中选择的组合框值,则复制该工作表并将其粘贴到另一个工作簿中

如何在工作表中调用 VBA 函数?