【问题标题】:Close workbook in excel with name changing weekly在 excel 中关闭工作簿,每周更改名称
【发布时间】:2015-01-24 03:23:16
【问题描述】:

我有一个包含以下宏的文件。基本上我需要它来关闭所有打开的工作簿,但是我的一个文件名每周都会更改,例如,本周它被称为特殊服务 1503,下周它将是特殊服务 1504 等。关于如何编辑的任何想法下面的代码,以便我可以关闭此文件而无需手动编辑 vba 中的数字?

Workbooks("2014 Actuals").Close SaveChanges = True
Workbooks("Special Services Budget 2015").Close SaveChanges = True

上面的工作是因为没有编辑,下面的工作但我必须每周手动将周数从 1504 更改为 1505 等。

Workbooks("Special Services 1504").Close SaveChanges = True

有什么想法吗?

【问题讨论】:

  • 1504 是否与当前周有任何关系(你能根据日期函数算出吗?)
  • 怎么样:FileName = Dir$("Special Services Budget*.xls*")?对了,不知道名字是怎么打开的?
  • 嘿,本周与前一周有关,而不是与当前周有关,而是与您看到的前一周有关。该文件总是在当前周的前一周生成。
  • 关于我是如何打开它的,我有另一个宏可以打开并复制原始问题中未包含的文件中的数据。

标签: vba excel


【解决方案1】:

如果我理解逻辑,你只需要构建一个动态索引:

firstWeek2015 = 1500 '<-- starting seed
yearFactor = Year(Now()) - 2015 '<-- we take the current year and we subtract 2015: this year it will be 0, next year 1 etc.
weekFactor = WorksheetFunction.WeekNum(Now()) '<--we just take the current week
newIndex = firstWeek2015 + yearFactor*52 + weekFactor

并将其替换为您的工作簿名称:

Workbooks("Special Services " & newIndex).Close SaveChanges = True

即使我愿意:

1) Use the same logic that you used to open the file;
2) Use a RegEx-based solution (if "Special Services ????" is the only file of that kind).

【讨论】:

  • 我意识到我之前的“newIndex”生成中有一个错误,现在应该没问题(参见编辑的代码)。
  • 有没有办法不用本周领取,而是使用相同的代码领取上周的日期?例如,这是 1 月的第 5 周,但文件现在将被称为“特殊服务 1504”
  • @Nwaaaa 我不这么认为,因为对于您描述问题的方式,日期不在代码中,而只是工作簿的名称。如果我很好地解决了您的问题,我只是建议您使用下面的解决方案(这是一种定义名称的算法,但如果您不确定,我宁愿选择“Like *”解决方案。
【解决方案2】:

我将此作为单独的答案添加,因为它是一种与前一个完全不同的方法:

当且仅当您确定只有该工作簿的名称类似于 Special Services 1054,那么您可以像这样使用 Like 运算符: p>

For Each objWb In Workbooks
    If objWb.Name Like "Special Services *"
        objWb.Close SaveChanges = True
    End If
Next objWb

如我之前的回答中所述,这种方法比另一种方法更可靠但前提是您 100% 确定可能不会打开另一个具有相似名称的工作簿

【讨论】:

  • Matteo NNZ - 对于您的第二个答案:我猜我将不得不在 52 周内写下代码。例如“特殊服务 1504”等
  • @Nwaaaa 不,您不必在 52 周内写下代码,它总是会找到当前打开的工作簿,其名称看起来像“特殊服务”,它会关闭它下来。您所需要的只是代码 sn-p。
  • 太棒了!我现在就试试,非常感谢!非常有帮助,非常感谢!
  • 我一直收到一个错误,说语法错误,你能解释一下“*”代表什么吗?我需要进一步修改代码吗?我只是复制并粘贴到我已经拥有的 vba 代码中。
  • @Nwaaaa “*”表示查找以“特殊服务”开头的任何 wb 名称,无论以何种方式结束。上面的代码中没有语法错误,您可能复制粘贴了错误的内容。也许您可能想在此处添加代码,以便我查看。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-09-13
  • 1970-01-01
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
相关资源
最近更新 更多