如何在 VBA 中调暗和设置变量工作簿名称?

Posted

技术标签:

【中文标题】如何在 VBA 中调暗和设置变量工作簿名称?【英文标题】:How to Dim and Set a variable workbook name in VBA? 【发布时间】:2019-03-26 12:20:54 【问题描述】:

我有一个每周创建的具有变量名称结构的工作簿。名称结构如下:Week of Year & Invoice & date。所以一个示例文件可能被称为1_Invoice_01052018.xlsm

我必须每周更新报告。我想将变量工作簿名称声明为 VBA 中的变量。我有另一个工作簿,其中包含通过 VBA 创建的报告的输出。在这另一个工作簿中,我希望能够调用Invoice 电子表格,但由于它有一个变量名,我在查找它时遇到了问题。所以我把下面的VBA放在一起。

Sub Test()

Dim wb As Workbook
Dim ws As Worksheet

Set wb = "*Invoice*" & ".xlsm"
Set ws = Sheets("Sheet1")

wb.Activate
ws.Select

End Sub

但是,这会导致“类型不匹配”错误。

我还尝试了以下方法:

Sub Test2()

Windows("*Invoice*" & ".xlsm").Activate

End Sub

这也导致了错误。

关于如何在 VBA 中将变量工作簿名称设置为变量的任何想法?我一次只会打开其中一个工作簿,所以我不会遇到任何问题

【问题讨论】:

循环遍历你打开的Workbook对象直到Workbook.Name Like "Invoice*.xlsm",然后使用那个对象? 【参考方案1】:

您必须正确设置工作簿:

Sub Test()

  Dim wb As Workbook
  Dim ws As Worksheet
 
  Dim FilePath As String
  FilePath = "C:\" & AnotherVariable & ".xlsx"

  Set wb = Workbooks(FilePath)
  Set ws = Sheets("Sheet1")

  wb.Activate
  ws.Select

End Sub

【讨论】:

感谢您的回复,但我不知道File Path,因为该文件有一个变量名。我有两个工作簿ABA 包含一个使用B 创建附加报告的宏。我需要能够将工作簿B 作为工作簿A 中的变量引用,但由于B 具有变量名称,我不确定如何将其设置为变量。这两个文件将同时打开,所以我认为我应该能够访问该工作簿。【参考方案2】:

要创建一个新工作簿,您可以使用Workbooks.Add。要打开现有的,您可以使用 Workbooks.Open,然后引用该工作簿中的工作表。 要更改文件的名称,您可以使用 SaveAs 方法将其保存为新名称。

Sub Test()

    Dim wb As Workbook
    Dim ws As Worksheet
    Dim FileName As String

    Set wb = Workbooks.Add 'Creates a new workbook with default name.
    'Set wb = Workbooks.Open("<path to folder>\" & FileName & ".xlsm") 'Open an existing file.

    Set ws = wb.Worksheets("Sheet1")

    wb.SaveAs "<path to folder>\" & FileName & ".xlsm" 'Save and rename here.

    With ws
        .Range("A1") = "Adding some text to this cell"
    End With

End Sub  

作为另一个示例,下面的代码将在将工作表从第一个工作簿复制到第二个工作簿的末尾之前创建两个工作簿。

Sub Test1()

    Dim wb As Workbook, wb1 As Workbook
    Dim ws As Worksheet

    'Create first workbook so it contains only 1 sheet (xlWBATWorksheet)
    ', reference Sheet1 and add some data to it.
    Set wb = Workbooks.Add(xlWBATWorksheet)
    Set ws = wb.Worksheets("Sheet1")
    ws.Range("A1") = "This cell populated in first workbook."

    'Create second workbook with default number of sheets
    'and copy Sheet1 from first book to the end of this one.
    Set wb1 = Workbooks.Add
    ws.Copy After:=wb1.Sheets(wb1.Sheets.Count)

End Sub  

再次编辑:

要根据WeekNumber_Invoice_Date 找出工作簿名称,您可以使用:

Sub Test2()

    Dim wb As Workbook
    Dim sPath As String
    Dim dDate As Date

    dDate = Date 'Todays date
    sPath = "C:\MyFolder\"
    sPath = sPath & _
        WorksheetFunction.WeekNum(dDate, 2) & "_Invoice_" & Format(dDate, "ddmmyyyy") & ".xlsm"

    'Open if already exists.
    'Set wb = Workbooks.Open(sPath)

    'Create and SaveAs new name.
    Set wb = Workbooks.Add
    wb.SaveAs sPath

End Sub

这将根据今天2018 年10 月22 日 的日期给出C:\MyFolder\43_Invoice_22102018.xlsm 的文件路径。

注意:WEEKNUM 函数将包含 1 月 1 日的那一周视为一年中的第一周。

【讨论】:

【参考方案3】:

我可以通过以下链接获得所需的内容:excel-vba-extract-text-between-2-characters

我查看了上面的链接并将下面的 VBA 放在一起。

Sub test2()

Dim str As String
Dim openPos As Integer
Dim closePos As Integer
Dim midBit As String

str = Range("b1").Value
openPos = InStr(str, "[")
closePos = InStr(str, "]")
midBit = Mid(str, openPos + 1, closePos - openPos - 1)

'MsgBox (midBit)
Windows(midBit).Activate

End Sub

我最终在单元格B1 中创建了一个动态文件路径,其中包含一个连接的文件路径字符串,其中包含基于Current Date 拉入Week of YearDate 的查找。由于这条路径是动态的,它总是指向正确的路径,因为我在正确的一周打开了Invoice。我从路径中提取文件名并根据动态文件名打开。

【讨论】:

啊,对....你从单元格B1中的路径中提取文件名。你错过了你的问题。我不会使用Windows(midBit).Activate。从那里你将使用ActiveWorkbook 或类似的东西 - 所以如果在代码完成之前更改了活动工作簿,你会得到错误的结果。请改用Set wb = Workbooks(midBit)。然后,您可以使用 WB.SaveWB.Worksheets(1).Range("A1") = "Some Value" 之类的代码,代码不会关心哪个工作簿处于活动状态 - 它始终会引用正确的工作簿。

以上是关于如何在 VBA 中调暗和设置变量工作簿名称?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Excel VBA 中声明全局变量在工作簿中可见

vba 打开固定地址下,指定名称的工作簿

在按钮的背景中调暗所有视图

excel如何用vba批量提取指定工作表?

VBA 打开另一个带有变量的工作簿和工作表

vba excel怎么获取指定工作表的行数、列数