如何在 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
,因为该文件有一个变量名。我有两个工作簿A
和B
。 A
包含一个使用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 Year
和Date
的查找。由于这条路径是动态的,它总是指向正确的路径,因为我在正确的一周打开了Invoice
。我从路径中提取文件名并根据动态文件名打开。
【讨论】:
啊,对....你从单元格B1
中的路径中提取文件名。你错过了你的问题。我不会使用Windows(midBit).Activate
。从那里你将使用ActiveWorkbook
或类似的东西 - 所以如果在代码完成之前更改了活动工作簿,你会得到错误的结果。请改用Set wb = Workbooks(midBit)
。然后,您可以使用 WB.Save
或 WB.Worksheets(1).Range("A1") = "Some Value"
之类的代码,代码不会关心哪个工作簿处于活动状态 - 它始终会引用正确的工作簿。以上是关于如何在 VBA 中调暗和设置变量工作簿名称?的主要内容,如果未能解决你的问题,请参考以下文章