【问题标题】:Excel VBA: refer to an array table in a different workbook than the active workbookExcel VBA:引用与活动工作簿不同的工作簿中的数组表
【发布时间】:2017-03-11 07:47:35
【问题描述】:

我正在使用查找和替换宏(见下文),它引用存储参考数据的数组表。

在我当前正在工作的任何给定 ActiveWorkbook 中引用数组表和存储值的查找/替换宏的唯一方法是不可能的。

我需要能够使用和引用我的 Personal.xlsb 默认模板,因为它始终是打开的,以引用下面的数组表。

如何以这种方式将宏指向数组表,这样我就不必将它复制/创建到我想要运行此宏的每个新工作簿中?

这是下面宏的当前引用,也是我让它工作的唯一方法:

'Create variable to point to your table  
Set tbl = Worksheets("Table1").ListObjects("Table1")

(指的是我正在使用的 ActiveWorkbook 中的工作表。)

到目前为止,这是我尝试引用另一个文件的方法:

Set tbl = Personal.xlsb("Sheet1").ListObjects("Table1") 
                ------ 

I thought I had it With this one For sure!! 
Set tbl = Workbooks("Personal.xlsb").Sheets("Table1").ListObjects("Table1") 
                ------- 

Set tbl = Workbooks("Personal.xlsb").Sheets(1).ListObjects("Table1")
                -------

Set wb1 = Application.Workbooks("Personal.xlsb") 
Set tbl = wb1("Table1").ListObjects("Table1") 
                -------

Set wb1 = Workbooks("Personal.xlsb").Sheets("Table1") 
Set tbl = wb1("Table1").ListObjects("Table1") 
                ------- 

Set wb1 = Workbooks("Personal.xlsb").Sheets("Table1") 
Set tbl = wb1.ListObjects("Table1") 

我什至试过绝对文件路径,没有。

一旦我将其更改为尝试使用上面的字符串引用 Personal.xlsb,我得到错误 9:下标超出范围

现在每次我想使用此宏时,都必须将我的 Array Table 复制到“Table1”工作表(选项卡)上的每个 Activeworkbook 中!

Sub FindReplace_Multi_ActivesheetOnly()

Dim sht As Worksheet
Dim fndList As Integer
Dim rplcList As Integer
Dim tbl As ListObject
Dim myArray As Variant

'Create variable to point to your table
  Set tbl = Worksheets("Table1").ListObjects("Table1")

'Create an Array out of the Table's Data
  Set TempArray = tbl.DataBodyRange
  myArray = Application.Transpose(TempArray)

'Designate Columns for Find/Replace data
  fndList = 1
  rplcList = 2

'Loop through each item in Array lists
  For x = LBound(myArray, 1) To UBound(myArray, 2)
    'Loop through each worksheet in ActiveWorkbook (skip sheet with table in it)
      'For Each sht In ActiveWorkbook.Worksheets
        'If sht.name <> tbl.Parent.name Then

          ActiveSheet.Cells.Replace What:=myArray(fndList, x), Replacement:=myArray(rplcList, x), _
            LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, _
            SearchFormat:=False, ReplaceFormat:=False

        'End If
      'Next sht
  Next x

End Sub

【问题讨论】:

    标签: arrays excel vba


    【解决方案1】:

    你几乎什么都试过了!

    语法是:Workbook(Index) Index 可以是一个数字(从 1 开始表示第一个打开的工作簿)或命名的 Index 这是工作簿的名称(不是 /path/to/文件,也不是file.ext)

    因此,要将您的个人工作簿设置为工作簿对象,您可以使用。

    Dim wb as Workbook
    Set wb = Workbooks("Personal")
    

    至于引用工作表和表格(其余代码)似乎是正确的。

    如果您仍然无法找到工作簿的名称,如果您打开 VBA 编辑器,您将在左侧看到(对于新的、未保存的工作簿)它显示 VBAProject (Book1) Book1 是工作簿,或者您可以打开即时窗口(CTRL+G) 并输入?ActiveWorkBook.Name 并回车,它会输出名称。

    【讨论】:

    • 感谢您的帮助!我还是有点迷茫。大声笑这是我发现的..(添加 cmets 中没有格式很臭:) 1) VBAProject (Personal.xlsb) [这是我模板的文件名] 2) Sheet1 (PERSONAL) [Next] 3) Sheet2 (Table1) [然后是我要参考的表格] 注意:奇怪的是使用 Sheet2 (Table1) 中的 Cntl+G -- 它显示的是“Table13”
    • 所以我需要在这里使用所有三个引用吗:'创建变量以指向您的表 // Set tbl = Workbooks("Personal").Sheets("Table1").ListObjects("Table1 ") // 我也想知道 'Table13' 是在哪里引用的。
    • 我在这里得到相同的下标超出范围错误 9: Set wb = Workbooks("Personal") // 当我删除它并使用它时: Set tbl = Workbooks("Personal").Sheets( "Table1").ListObjects("Table1") 我仍然得到那个错误。
    • 这就是为什么你应该用澄清来更新你的原始帖子。你可以编辑你自己的帖子,通常的方法是创建一个###EDIT1 ###标题并提供更多信息。 =)
    【解决方案2】:

    终于!有了一些帮助和反馈,我们想通了!

    老实说,主要问题是知道 TRUE 参考名称。第二是正确的语法。我从一开始就离那里很近。

    奇怪的部分是得知表名 (ListObject) 不是我想的那样。有几种方法可以通过突出显示表格并单击出现的设计选项卡或像 Adam 提到的那样使用 (CTRL+G) 来找出答案。我发现这个表实际上被命名为 Table13,而不是 Table1,如果没有这个正确的语法,所有的语法都不重要!

    这是我需要添加/更改的正确 vba 编码语法,但我确信这不是唯一的方法。这是关键:("Table13")

    Dim wb As Workbook
    Set wb = Workbooks("Personal.xlsb")
    
    'Create variable to point to your table
      Set tbl = wb.Worksheets("Table1").ListObjects("Table13")
    

    【讨论】:

      猜你喜欢
      • 2018-03-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-09-16
      • 2018-01-04
      • 1970-01-01
      • 1970-01-01
      • 2016-11-08
      相关资源
      最近更新 更多