2017-06-20 452 views
3

我有一个关于VBA中Workbooks正确地址的问题,这是我很新的。VBA:如何在将工作表作为参数提供给函数时解决正确的工作簿?

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

然后我定义的函数来操纵所述片材中的内容:该功能

Text_To_Numbers(worksheet as worksheet) 

期望一个工作表的参数。我呼吁使用下面的行从另一个子的函数:

Call Text_To_Numbers(table10) 

现在,这里是我的问题:
上述作品完美的时候才会打开的工作簿是一个我想用我的功能来操作。但是,当我有多个打开的工作簿时,该函数将尝试操作不同的工作簿,从而导致错误。

我非常确定必须有一种方法来指定要使用的工作簿,但我无法找到它。这就是说,还有另一个复杂因素:我想操作的工作簿的名称是机器生成的,所以它总是有不同的名称。这意味着一次又一次使用对相同文件名的明确引用不是一种选择。

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

+2

使用'ThisWorkbook'作为宏运行的工作簿,如'ThisWorkbook.table10'或'ThisWorkbook.Worksheets(“Table10”)'或使用'Application.Workbooks(“WorkBookName.xlsm”)。Worksheets(“Table10 “)'为其他任何工作簿。 –

+0

或者,您可以声明一个工作簿变量“Dim wb as Workbook”,然后使用它:'Set wb = Workbooks.Open(“Somepath \ Somefile.xlsx”)'打开一个然后'wb.Worksheets(1)以引用该工作簿中的第一张工作表。 –

+0

除非您将引用设置为其他工作簿项目,否则'table10'将始终使用代码引用工作簿中的工作表,如果它是代号。 – Rory

回答

2

您需要完全限定 VBA中的对象才能避免这样的情况,因为这样会导致父类的含义模糊。

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

您不能直接通过他们的代号为参考其他工作簿中的工作表,这只能做给ThisWorkbook对象(包含VBA代码的工作簿)。查看Fully reference a worksheet by codename的问题,获取有关如何从其他工作簿获取工作表的代码名的详细信息。我在答案中包含了该函数,以及如何在这种情况下使用它。

可以在下列之一创建的表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 
0

尝试分配工作簿和工作表到一个变量,然后调用它这样当你需要做一些工作其中:

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") 

然后,您只需要在函数内传递对WS变量的调用即可在指定表单中执行操作。

编辑:

道歉,没想到你试图在项目编辑器中引用索引名称,当我第一次读到了你的问题。代号可从用下面的例子的外部工作簿其示出了如何选择工作簿和片代号从一个工作簿执行复制/粘贴到另一个被引用:

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 

由于Enderland为理念。

+1

@data_beta我几乎不建议您阅读[VBA最佳实践:避免使用SELECT或ACTIVATE](https://stackoverflow.com/documentation/excel-vba/1107/vba-best-practices/9292/avoid-using-select -or-激活)。 –

+1

嗯,我觉得你的整个答案可以被替换为评论“请参阅[这个答案](https://stackoverflow.com/a/22256782/3978545)的一个稍微黑客的方法来访问另一个工作簿代码名工作表”。但是,是的,现在这个主题的答案稍微多了一点! – Wolfie

+1

你确定'WSW中的Dim WS As Worksheet does not work?从未在'WB'之前看过这种语法。至少在MS Excel 2016中这是行不通的。 –

相关问题