【问题标题】:Referencing a Dynamic Workbook Name - VBA引用动态工作簿名称 - VBA
【发布时间】:2020-10-02 19:29:56
【问题描述】:

我为工作学院创建了一个工作簿(“Control Panel.xlsm”),用作我们在日常任务中使用的所有宏的存储位置。她不懂VBA。 其中一个宏(参见下面的代码)组织另一个工作簿,以便在表格末尾添加一个描述性列。

    Dim lr As Long
    lr = Cells.Find("*", Cells(1, 1), xlFormulas, xlPart, xlByRows, xlPrevious, False).Row
    Dim tbl As ListObject
    Dim wbNames As Variant, wb As Workbook, w As Workbook, El As Variant, boolFound As Boolean
    wbNames = Split("January,February,March,April,May,June,July, August, September, October,November,December")
    For Each w In Workbooks
        For Each El In wbNames
            If w.Name = "Docs_Tracker_" & El & " 2020.xlsm" Then
                Set wb = w: boolFound = True: Exit For
            End If
        Next
      Next
    
    '1. Column AB - Descriptive Field - Client Name - Manager Name - Research Deliverable
If wb Is Nothing Then Stop
    Set tbl = wb.Worksheets(1).ListObjects("Table_owssvr")
    With tbl
            .ListColumns.Add.Name = "Client Name - Manager Name - Research Deliverable"
    End With
        wb.Activate
        Range("AB2:AB" & lr).FormulaR1C1 = "=CONCATENATE(RC[-22],"" - "",RC[-26],"" - "",RC[-15])"

我想做的是参考工作簿 ("Docs_Tracker_April 2020.xlsm") 以便即使工作簿参考名称发生更改(Docs_Tracker_May 2020、Docs_Tracker_June 2020 等),代码仍然可以工作

我已经尝试过 ActiveWorkbook,工作簿索引方法,但是它们可能会出现错误问题,并且对于不像我的工作学院那样熟悉 VBA 的人来说,它并不那么万无一失。

如果有人可以教我这个,我会将它应用到我所有的宏中,他们都有类似的问题。谢谢。

【问题讨论】:

  • 是工作簿命名规则吗?您是否希望该过程适用于包含“January”、“February”等而不是“April”的任何工作簿名称?如果同时打开两个这样的工作簿呢?
  • 所以不,只有两个工作簿会打开(“control panel.xlsm”和“Docs tracker取决于月份” - 我将在下面给出你给我的代码并返回你
  • 不确定,问题是什么?您想将宏存储在一个工作簿中(并每月更改其名称)还是根据月份名称存储在多个工作簿中?你想更新链接还是什么?
  • 我认为代码应该运行良好。如果您需要我将它集成到您​​的子中,这不会有问题,但我认为自己很容易做到这一点......您只需用我提供的代码替换Set wb = Workbooks("Docs_Tracker_April 2020.xlsm"),但请正确声明必要的变量。
  • 我的错误。我没有适当地修改拆分函数并在函数末尾添加(,,,)。谢谢

标签: excel vba


【解决方案1】:

请尝试下一个方法。如果同时打开多个这样的工作簿,它将选择数组的第一个:

Sub takeTheMonthsNamedWB()
  Dim wbNames As Variant, wb As Workbook, w As Workbook, El As Variant, boolFound As Boolean
  wbNames = Split("January,February,March,April,May,June,July", ",") 'and so on...
  For Each w In Workbooks
    For Each El In wbNames
        If w.Name = "Docs_Tracker_" & El & " 2020.xlsm" Then
            Set wb = w: boolFound = True: Exit For
        End If
    Next
    If boolFound Then Exit For 'in order to stop iteration if a lot of workbooks are open
  Next
End Sub

已编辑:

请尝试下一个测试代码。它是否返回正确的工作簿名称?

Sub testTheMonthsNamedWB()
  Dim wbNames As Variant, w As Workbook, El As Variant, boolFound As Boolean
  wbNames = Split("January,February,March,April,May,June,July", ",") 'and so on...
    For Each El In wbNames
        Debug.Print "Docs_Tracker_" & El & " 2020.xlsm"
    Next
End Sub

【讨论】:

  • @CleanRider:请使用我的测试代码(编辑后)。它会根据需要返回工作簿名称吗?
【解决方案2】:

只会打开两个工作簿(“control panel.xlsm”和“Docs 跟踪器取决于月份”

如果您想引用名称取决于当前月份的工作簿,您可以使用以下内容:

Dim sWbkName As String, wbk As Workbook
sWbkName = "Docs_Tracker_" & Format(Date, "MMMM yyyy") & ".xlsm"
On Error Resume Next
Set wbk = Application.Workbooks(sWbkName)
If wbk Is Nothing Then
    MsgBox "Can't find '" & sWbkName & "'!!!" & vbCr & vbCr & _
        "Please, open it.", vbExclamation, "Error."
    Exit Sub
End If

【讨论】:

  • 当前月份是什么并不重要,重要的是我们正在使用的工作簿。例如,我目前正在处理 4 月的文件,但现在是 10 月。 (根据收入确认月份添加延迟条目)
  • 好的。那么,FaneDuru 的代码有什么问题呢?它符合你的标准吗?如果不是,请解释原因...
  • 他的代码在正确的路径上,但是我遇到了错误问题。我已经修改了上面的代码以反映他建议的更改。行 Set tbl = wb.Worksheets(1).ListObjects("Table_owssvr") 需要调试
猜你喜欢
  • 2014-04-25
  • 1970-01-01
  • 2018-03-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-22
  • 2016-11-08
  • 2021-02-25
相关资源
最近更新 更多