【问题标题】:Switch between workbooks在工作簿之间切换
【发布时间】:2016-12-15 18:55:00
【问题描述】:

我有一个代码在另一个工作簿中搜索特定信息,但该工作簿更改了名称和格式。我目前正在使用 workbook.open 打开它,当我指定文件位置时,它具有动态部分(您将了解示例代码)。问题是在代码中间我需要回到第一个工作簿(运行代码的那个),做一些事情,然后再回到它搜索信息的工作簿。我尝试使用 dim secondfile 作为字符串/工作簿将其设置为变量(两者都尝试过),然后尝试在它“活动”时将其设置为活动工作簿,这样我可以稍后在需要时使用“secondfile.activate”回去吧,但没有运气。代码如下:

dim originalworkbook as workbook
set originalworkbook as this workbook
dim wb as workbook
set wb as Workbooks.Open("C:\Users\abc\Documents\bla bla bla " + Range("D6").Offset(iLoop).Value)
'code here...
originalworkbook.activate
'code here...
'[insert code here to go back to the wb workbook]

我不能让它再次打开 wb 工作簿,因为它没有意义。现在我有 1k+ 数据的列表,这些数据在另外 30 多个文件中搜索。文件的名称在第一个工作簿上,至少是其中的一部分,正如您在代码中看到的那样。我使用 "Range("D6").offset" 部分来获取它。问题是,如果我每次都关闭并打开第二个工作簿,运行代码将花费太长时间,所以我想做的是搜索特定文件中的所有内容,并在搜索完所有内容后,保存并关闭它。这就是为什么我需要回到这个文件......

PS:并非所有文件的格式都相同,这就是为什么我没有使用“workbooks.activate”或类似的东西,然后使用相同的“Range(“D6”).offset”来设置文件激活,因为有些在 .xls 中,有些在 xlsx...

【问题讨论】:

  • 假设您将 wb1 调暗为工作簿,将 wb2 调暗为工作簿。您是否使用以下语法? wb1.sheets("Sheet1").Range("A1") = "aaa" 或 wb2.Sheets("Sheet3").Range("B12") = MyString。我的意思是您不必激活它来更改单元格或从中读取。
  • 感谢@TimWilliams,但我认为没有其他方法可以使用活动工作表或类似的东西......你之前已经在这个宏中帮助过我,工作表和工作簿名称每次都会更改,请参阅stackoverflow.com/questions/32127050/vba-find-not-working
  • @DavidG 也许我明白了。您是说我不需要回到第一个工作簿来更改其上的单元格,对吗?我现在试一试,然后返回给你
  • @DavidG 尝试更改我的字符串,但没有用。我尝试定义两个变量,一个用于工作簿 (wb),一个用于工作表 (ws),并尝试将它们定义为 thisworkbook/activeworkbook 和 activesheet/sheet(“名称”),然后尝试使用 wb.ws.range.offset。 value = "xxxx",也试过 wb.床单(ws),然后是其余的,没有运气。得到这个字符串的类型不匹配

标签: vba excel


【解决方案1】:
Public w as workbook    
For Each w In Workbooks
        If w.Name = originalworkbook Then
            Workbooks(w.Name).Activate
            'Do Stuff
        Exit For
        End If
Next w

上面的美妙之处在于,您可以使用它来同时打开无数个 excel 文件。只需将If w.Name = original workbook then 更改为if w.Name like "*charcters from a file name*" then

通配符可让您高效搜索

希望这会有所帮助!

【讨论】:

    【解决方案2】:

    由于您的代码确实不是很具有描述性,因此我将给您一段我的代码,并尝试解释发生了什么。我正在用这段代码写在另一个工作簿中,从第一个开始放置信息。这是一个很长的子,我会删除不必要的部分。

    我试图涵盖你会遇到的所有情况。

    sub TemplateFiller(AHNSnumber as String)
        Dim wbk As Workbook
        Dim wbpath As String
        Dim lastline as long
        Dim wbName as string
    
        wbpath = "O:\08_Lean_Eng\10_On_going\David\Soldier's Pond\MDR\Templates\TemplateCustom.xls"
    
        'This is to check if it's open first. Only open it if it is closed!
        'IsWorkBookOpen is one of my own functions, not included here
        If IsWorkBookOpen(wbpath) = False Then
            Set wbk = Workbooks.Open(wbpath) 'Notice: set wbk =, not Set wbk as
        ElseIf IsWorkBookOpen(wbpath) = True Then
            wbName = "somethingworkbook.xlsb"
            Set wbk = Workbooks(wbName)
        End If
    
        'Finding the last line in the other wbk (I'm using info from the other wbk for variables here)
        lastline = wbk.Sheets("DL001").Range("BG65000").End(xlUp).row + 1
    
        wbk.Sheets("Dl001").Range("F" & lastline) = AHNSnumber 'Using a passed variable
        wbk.Sheets("Dl001").Range("G" & lastline) = "OK" 'Writing some stuff
        wbk.Sheets("Dl001").Range("H" & lastline) = ThisWorkbook.Sheets("a").Range("A1") 'Value from one to the other and vice versa
        Thisworkbook.sheets("b").Range("A2") = wbk.Sheets("Dl001").Range("A" & lastline)
    
    
        'Changing a variable in this workbook
        ThisWorkbook.Sheets("Data").Range("Revision") = ThisWorkbook.Sheets("Data").Range("Revision") + 1
    
    End sub
    
    'I am not the original writer of this function.
    Function IsWorkBookOpen(filename As String) As Boolean
        Dim ff As Long, ErrNo As Long
    
        On Error Resume Next
        ff = FreeFile()
        Open filename For Input Lock Read As #ff
        Close ff
        ErrNo = Err
        On Error GoTo 0
    
        Select Case ErrNo
        Case 0:    IsWorkBookOpen = False
        Case 70:   IsWorkBookOpen = True
        Case Else: Error ErrNo
        End Select
    End Function
    

    【讨论】:

    • 如您所见,我什至没有使用 ActiveWorkbook 或 Workbook activate。
    • 这几乎与我正在做的事情相同,如果您可以发送 isworkbookopen 部分,我将不胜感激。我只是不明白一件事:wbname 是一个变量吗?你把它定义为什么?另外,我的代码的不同之处在于您使用字符串来更改最后一行的范围,我使用的是一个值,它实际上是“是”。尝试删除它末尾的 .value 部分,但仍然使下标超出范围...
    • wbpath 应该是 wbname。我会修好它。此外,此代码有效,因此如果您有错误,它们不是因为您的工作簿引用。我可以在您的代码中看到 [将 wb 设置为 Workbooks.Open],所以您确定您正在做同样的事情吗?我将添加更多变体,以便您也能有所了解。
    • 对不起。设置工作簿时,它在同一个应用程序中打开,它只能是名称(而不是路径)。我把它加进去了。在删除一些东西时,我把自己弄糊涂了,把它过分简化了!
    • David,尝试再次运行代码。还是有问题。问题是:在我的例子中,“wbpath”变量在一个循环内变化,我可以知道文件的名称是什么,但我不知道它的扩展名是什么,我有 XLS 和 XLSX。我可以通过使用列表或其他东西来解决这个问题,很简单,但我在代码的另一部分仍然遇到问题。字符串“this workbook.sheets("sheet name").range ("k6") .offset (loop) = "no"" 返回下标超出范围,错误9。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多