VBA:如何在将工作表作为parameter passing给函数时解决正确的工作簿?

我有一个关于VBA工作簿的正确地址的问题,这是我相当新的。

这是我迄今为止所做的:
我已经写了一个子,其中包括CodeName“table10”创build一个工作表。

然后我定义了一个函数来处理这个表单的内容:这个函数

Text_To_Numbers(worksheet as worksheet) 

期望一个工作表参数。 我使用下面这行来调用另一个子函数:

 Call Text_To_Numbers(table10) 

现在,这是我的问题:
上面的作品完美无暇,当唯一打开的工作簿是我想操纵我的function。 但是,当我有多个打开工作簿时,该函数将尝试操作不同的工作簿,导致错误。

我相当肯定,必须有一种方法来指定要使用的工作簿,但我无法find它。 这就是说,还有另一个复杂性:我想操作的工作簿的名称是机器生成的,所以它总是有不同的名称。 这意味着一次又一次使用对相同文件名的显式引用不是一个选项。

有谁能帮我解决这个问题吗?

您需要完全限定 VBA中的对象,以避免这样的情况,在这种情况下,父类是什么模糊的。

在您的情况下,您希望工作表连接到其父工作簿,因此请确保您指定它来自给定的工作簿!

您不能直接引用其他工作簿中工作表的CodeName ,只能对ThisWorkbook对象(包含VBA代码的工作簿)执行此操作。 查看问题按代号完全引用工作表,获取有关如何从其他工作簿获取工作表的代码名的详细信息。 我已经在答案中包含了这个函数,以及如何在这个上下文中使用它。

您在以下table10一项中创build了工作表table10

  • ActiveWorkbook
  • 的ThisWorkbook
  • WB(一些工作簿对象)

所以你可以使用该工作簿对象访问它,而不需要名称!


使用ThisWorkbook.table10应该给出与table10相同的行为,但是这里有两个更简洁的例子来调用函数。

 ' A neater way to call the function: Text_To_Numbers worksheet:=ThisWorkbook.table10 ' You could also call it simply using Text_To_Numbers ThisWorkbook.table10 

如果您的工作表不在ThisWorkbook

 ' Get sheet (from the workbook object you are using, WB) and pass to your Text_To_Numbers Text_To_Numbers GetSheetWithCodename("table10", WB) Function GetSheetWithCodename(ByVal worksheetCodename As String, Optional wb As Workbook) As Worksheet Dim iSheet As Long If wb Is Nothing Then Set wb = ThisWorkbook ' mimics the default behaviour For iSheet = 1 To wb.Worksheets.Count If wb.Worksheets(iSheet).CodeName = worksheetCodename Then Set GetSheetWithCodename = wb.Worksheets(iSheet) Exit Function End If Next iSheet End Function 

尝试将工作簿和工作表分配给variables,然后在需要在其中执行某些工作时以此方式调用它:

 Dim WB As Workbook Dim WS As Worksheet 'If you want to open the workbook before doing work Set WB = Workbooks.Open("/Workbook path name goes here”) Set WS = WB.Worksheets("Table‌​10") 

那么你只需要在你的函数中传递一个WSvariables的调用来执行指定表单中的操作。

编辑:

道歉,没有意识到你在尝试引用项目编辑器中的索引名称时,我第一次看到你的问题。 代码名称可以从外部工作簿中引用,下面的示例演示如何select工作簿和工作表代码名称以执行从一个工作簿到另一个工作簿的复制/粘贴:

 Sub UseCodeNameFromOutsideProject() Dim WS As Worksheet With Workbooks("MyWorkbook.xlsb") Set WS = _ .Worksheets(CStr(.VBProject.VBComponents("Sheet1").Properties(7))) WS.Range("A1").Copy Selection.Copy WS.Range("B1").PasteSpecial End With End Sub 

感谢恩德兰的想法。