【问题标题】:Updating file paths in excel/vba在 excel/vba 中更新文件路径
【发布时间】:2021-08-08 01:15:26
【问题描述】:

我在一个 Excel 工作簿中有一个公式,它从另一个工作簿中提取数据作为宏的一部分。这两个工作簿位于同一个文件夹中。但是,我计划与其他人共享该文件夹,以便他们可以利用我的宏来运行报告。如果其他用户打开这些文件,VBA 代码会自动更新到新用户保存文件夹的位置吗?

如果没有,我可以编写一个脚本来自动更新文件路径吗?或者至少有一种方法可以让不了解 VBA 的用户轻松更新宏,以便它在他们的 PC 上运行?

这是我的公式:

"=IFERROR(IF(RC[-12]=""Adjustment"",VLOOKUP(R[-1]C[-11],'C:\Attendance Audits FINAL\Test Final Package\Kronos Only\[Kronos Adjustment.xlsx]Sheet1'!R2C1:R531C3,3,FALSE)-R[-1]C[-1],""""),0)"

我自己并不是真正的 VBA 专家,但我最初的想法是定义一个包含文件路径的变量,这样用户只需更改变量的名称。

dim FP as string
FP = 'C:\Attendance Audits FINAL\Test Final Package\Kronos Only\

那么我的公式就变成了:

"=IFERROR(IF(RC[-12]=""Adjustment"",VLOOKUP(R[-1]C[-11],FP[Kronos Adjustment.xlsx]Sheet1'!R2C1:R531C3,3,FALSE)-R[-1]C[-1],""""),0)"

我不确定这是否可行。任何想法将不胜感激!

【问题讨论】:

  • 你为什么不分享你的代码,单元格的地址,以及代码运行后应该在单元格中的excel公式?
  • 您可以通过将这两个文件复制到本地驱动器上的不同文件夹来轻松测试自己...请参阅:support.microsoft.com/en-us/topic/…“如果链接文件和源数据文件位于同一文件夹中, 只存储文件名”
  • @VBasic2008 我在问题中包含的代码还不够吗?这包括在代码运行后生成公式的代码
  • @TimWilliams 所以如果我理解正确,如果两个工作簿都在同一个文件夹中,我可以在公式中使用=[book.xlsx]Sheet1! 而不是fullpath[book.xlsx]Sheet1! 来引用另一个?跨度>
  • 好像是这样,是的。

标签: excel vba


【解决方案1】:

我不知道我是否完全理解您的问题,但无论用户如何,您都可以使用此行获取文件路径: ThisWorkbook.Path()

【讨论】:

  • 抱歉,不清楚。基本上,用户将打开一个工作簿(称为工作簿 1)。在此工作簿中,有一个公式可以从另一个已关闭的工作簿(称为工作簿 2)中提取数据。我想找到一种更新工作簿 2 的文件路径以包含在工作簿 1 的宏中的好方法。目前,工作簿 1 的宏使用工作簿 2 的文件路径,但它仅特定于我的 PC。有没有办法更新工作簿 1 的宏以从工作簿 2 中提取数据而不管用户是谁?
  • 是的,我认为您的宏可以使用workbook2.path() 方法。每个工作簿都有此方法可用。我认为您可能必须打开工作簿,但如果您希望它看起来好像工作簿未打开,那么您可以设置 Application.visible =False
  • 好的,假设我得到了工作簿 2 的新文件路径。然后我可以在工作簿 1 的宏中使用一个变量来存储文件路径,并在原始帖子的公式中使用这个变量而不是实际的文件路径?例如,我可以在公式中使用 dim Var as string Var = filepath 并包含 Var 而不是长文件路径吗?
  • 因此您将无法将其存储在变量中,因为当代码执行完成时,变量将被删除。您可以将变量保存到隐藏工作表的单元格中,然后公式可以像这样引用该单元格:workbook1.sheets("HiddenSheet").Range("A1").Value = workbook2.path(),然后在您的公式中:=HiddenSheet!A1。这对你有用吗?
  • 我不这么认为,因为公式需要filepath[name.xlsx]Sheet1!,我相信workbook2.path() 不会提供。
【解决方案2】:

如果您可以确定这两个工作簿在同一个文件夹中,您可以使用以下代码替换您的 FP 字符串。

编辑

感谢 VBasic2008 提供更清晰的代码:

FP = ThisWorkbook.Path & "\"

此外,您的代码将在公式中输入字母“FP”,而不是 FP 字符串的值。您需要像这样连接:

"=IFERROR(IF(RC[-12]=""Adjustment"",VLOOKUP(R[-1]C[-11]," & FP & "[Kronos Adjustment.xlsx]Sheet1'!R2C1:R531C3,3,FALSE)-R[-1]C[-1],""""),0)"

【讨论】:

  • FP = ThisWorkbook.Path & "\" 会更容易一些。此外,缺少第一个单引号 '
  • ...C[-11],'" &...
【解决方案3】:

复制公式

  • 在 Excel 中,例如对于单元格M2,您可以这样做:
=IFERROR(IF(A2="Adjustment",VLOOKUP(B1,'[Kronos Adjustment.xlsx]Sheet1'!$A$2:$C$531,3,FALSE)-L1,""),0)

对于上方和左侧的单元格,您会得到错误(意外)的结果。

  • 在 VBA 中,您可以使用:
"=IFERROR(IF(RC[-12]=""Adjustment"",VLOOKUP(R[-1]C[-11],'[Kronos Adjustment.xlsx]Sheet1'!R2C1:R531C3,3,FALSE)-R[-1]C[-1],""""),0)"

不要忘记第一个单引号'

一个 VBA 实践示例

Sub WriteFormula()
    
    ' Source
    Const swbName As String = "Kronos Adjustment.xlsx"
    Const sName As String = "Sheet1"
    Const sfRow As Long = 2
    Const slRow As Long = 531
    Const sfCol As Long = 1
    Const slCol As Long = 3
    Const sCritCol As Long = 3
    ' Destination
    Const dName As String = "Sheet1" ' unknown
    Const dAddress As String = "M2:M21" ' unknown, possibly calculated
    Const drMin As Long = 2
    Const dcMin As Long = 13
    ' Both
    Const Criteria As String = "Adjustment"
    
    Dim dwb As Workbook: Set dwb = ThisWorkbook
    Dim dws As Worksheet: Set dws = dwb.Worksheets(dName)
    Dim drg As Range: Set drg = dws.Range(dAddress)
    ' Validate because there maybe unexpected results.
    With drg ' or With drg.Cells(1)
        If .Row < drMin Then Exit Sub
        If .Column < dcMin Then Exit Sub
    End With
    
    Dim FolderPath As String: FolderPath = dwb.Path
    
    ' Since the files are in the same folder, you could
    ' replace 'FolderPath & "\' with '"' in the formula
    ' and remove the previous line.
    ' But this could become useful e.g.
    ' in the case of 'FolderPath = dwb.Path & "\" & SubFolderName'.
    
    Dim dFormula As String
    dFormula = "=IFERROR(IF(RC[" & 1 - dcMin & "]=""" & Criteria _
        & """," & "VLOOKUP(R[" & 1 - drMin & "]C[" & 2 - dcMin _
        & "]," & "'" & FolderPath & "\[" & swbName & "]" & sName _
        & "'!" & "R" & sfRow & "C" & sfCol & ":R" & slRow & "C" & slCol _
        & "," & sCritCol & ",FALSE)-R[" & 1 - drMin _
        & "]C[" & 12 - dcMin & "],""""),0)"
    'Debug.Print dFormula
    
    drg.Formula = dFormula

End Sub

【讨论】:

    猜你喜欢
    • 2019-01-06
    • 2017-04-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多