使用VB自动更新Excel中的单元格值

Posted

技术标签:

【中文标题】使用VB自动更新Excel中的单元格值【英文标题】:Auto Updating Cell Values in Excel using VB 【发布时间】:2013-11-18 04:10:05 【问题描述】:

我有 2 个 Excel 文件,分别命名为九月和十月。九月文件包含十月文件引用/链接到的值,使用公式:

=+B2+'C:\\[September.xlsx]Sheet1'!A1 

因此 10 月份的单元格 B2 包含一个值,该值是来自 9 月份文件的 B2A1 之和。

如果我现在创建一个 11 月文件,我只需对 10 月文件执行另存为并将文件另存为 November.xlsx。但是,这意味着 11 月文件仍然引用值 September.xlsx。有没有办法在创建或打开 11 月文件时自动更新 November.xlsx 中的单元格以引用 10 月?

即所以 11 月的公式会自动更新为 =+B2+'C:\[October.xlsx]Sheet1'!A1

或者在打开文件时弹出一个窗口表单,询问它希望链接到的月份,然后用户输入一个月,然后范围内的所有单元格都会更新。

有人能指出我正确的方向吗?

【问题讨论】:

尝试在excel的open事件方法中写更新代码。 【参考方案1】:

简单的查找和替换将适用于这种链接。

您必须跳过使用名称作为您不想更改的标签的单元格。您也可以通过仅查看公式在 vba 中执行此操作。这是一个post,关于如何做到这一点。

【讨论】:

我已经尝试过查找和替换方法,但没有您在上面设置的那么具体。当前完成的方式是,在保存到较新的月份(在这种情况下为 11 月)之后,所做的只是从顶部单元格更改单元格公式,例如=+B2+'C:\[September.xlsx]Sheet1'!A1 到 =+B2+'C:\[October.xlsx]Sheet1'!A1 然后简单地向下拖动到下面的所有单元格(B3、B4、B5等)将其公式更改/更新为 October.xlsx。这两个选项都很好,我只是想学习新方法并制作它,这样您就不必修改新创建的电子表格中的任何内容。 +1 最简单的方法 :) @bertrix: 但是为什么要拖公式呢?如果您执行Replace All,那么它将找到替换所有实例。此外,如果您将 withinsheet 更改为 workbook,那么它也会在所有工作表中更改。 @bertrix:还要确保您不会错误地替换一些其他文本搜索\\[September.xlsx]并替换为\\[October.xlsx]【参考方案2】:

您可以使用Workbook.ChangeLink 方法。

expression.ChangeLink(Name, NewName, Type)

其中Name 是现有文件名,NewName 是新文件名

要查看它的实际效果,请尝试在手动更改链接源的同时录制宏,然后检查生成的代码。从Data/Connections/Edit Links 菜单访问它

可能最简单的实现是编写一个宏来一次性完成 SaveAs 和 ChangeLink。或利用BeforeSave 事件。

【讨论】:

【参考方案3】:

尝试在将十月工作簿另存为十一月.xlsx 时录制宏,然后编辑新工作簿中的链接以链接到十月.xlsx。

原始代码会很混乱,但您应该可以对其进行编辑以适应其他月份。

【讨论】:

如果您在修改记录的代码时遇到困难,那么至少您会发布一些内容来展示创建 VBA 解决方案的尝试。 谢谢,马克。我将尝试从 Save As 事件开始制作宏,然后从那里开始。【参考方案4】:

这个纯粹基于公式的解决方案对我有用。它分布在几个细胞中。我想您可以将所有公式组合成一个非常长的一个单元格中的一个,但在我看来,最好不要这样做。我只是将中间单元格(在我的示例中为单元格 F12-F17)塞到不碍事的某个地方。

公式:

Cell   Formula
----   ---------------------------------------------------------
F12    =CELL("filename",A1)

F13    =MID(F12,FIND("[",F12)+1,FIND("]",F12)-FIND("[",F12)-1)

F14    =LEFT(F13,FIND(CHAR(1),SUBSTITUTE(F13,".",
            CHAR(1),LEN(F13)-LEN(SUBSTITUTE(F13,".",""))))-1)

F15    =TEXT(DATE(2000,MONTH(DATEVALUE("1 " & F14))-1,1),"mmmm")

F16    =F15 & MID(F13,FIND(CHAR(1),SUBSTITUTE(F13,".",
            CHAR(1),LEN(F13)-LEN(SUBSTITUTE(F13,".","")))),LEN(F13))

F17    =SUBSTITUTE(F12,F13,F16)

F18    =INDIRECT(ADDRESS(1,1,,,F17))

结果,假设当前工作表保存为December.xlsx

Cell:  Value:
-----  ---------------------------------------------------------
F12    C:\Users\user.name\Documents\[December.xlsx]Sheet1
F13    December.xlsx
F14    December
F15    November
F16    November.xlsx
F17    C:\Users\user.name\Documents\[November.xlsx]Sheet1
F18    value from cell A1 in November.xlsx!

注意事项:

F12 获取当前工作簿的完整路径。可能需要手动更新计算(按 F9)才能刷新此单元格 F13 从 '[' 和 ']' 字符之间提取文件名 F14 删除扩展名(最后一个 '.' 之后的所有内容)以获取文件的 基本名称(即本月的名称) F15 获取上个月的名称 F16 附加之前删除的扩展名,以获取文件名 上个月的工作表。 F17 将此文件名替换为当前工作簿的路径。在这里,我们 假设本月的工作簿保存在同一个文件夹中 作为上个月的工作簿。 F18 获取上个月工作表中第 1 行第 1 列(单元格 A1)的值

【讨论】:

以上是关于使用VB自动更新Excel中的单元格值的主要内容,如果未能解决你的问题,请参考以下文章

如何根据excel中的另一个单元格值自动填充两个不同列中的数据

用另一个 Excel 工作表单元格值动态更新一个 Excel 工作表的单元格值

如何根据单元格值自动填充excel用户表单中的选项按钮?

基于公式的单元格值触发的 VBA 电子邮件代码

Excel在单元格值中转义引号或撇号

如何在列中搜索多个字符串并更新单元格值?