使用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 月份文件的 B2
和 A1
之和。
如果我现在创建一个 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
,那么它将找到替换所有实例。此外,如果您将 within
从 sheet
更改为 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中的另一个单元格值自动填充两个不同列中的数据