我为Excel 2010编写了一个宏,它为任何包含文件和子文件夹的文件夹编制索引。这样做的目的是管理从包含数百个文件的文件夹目录中提取特定细节,其中只有一些文件是Excel文件,其中只有一些与此细节相关。
宏提供了一些基本的细节和文件的超链接(包括xls,doc,pdf等)。然后,vba代码插入一个单元格公式,从工作簿的特定位置(不打开它们)中提取单个单元格值,其中有一个Excel文件并生成一个#Ref!否则会出错。由于单元格公式是通过FileItem.Path和文本操作创建的,因此公式始终引用适用于有意义文件的“摘要”表。
问题是剩余的Excel文件没有带有此名称的工作表,提示Excel提供弹出对话框“选择工作表”,供用户手动从选项中进行选择。我需要一种在vba代码中管理它的方法。我可以管理一些潜在的结果,包括选择确定每次选择第一个选项,取消和忽略请求,跳过这些实例等但我不能让宏反复中断用户输入。
我尝试在代码中的各个点插入Application.DisplayAlerts = False,但它不会阻止该对话框。
非常感谢任何帮助/建议。
由于
修改
原来我有:
Cells(r, 5).Formula = "='" & Left(File.Path, InStr(File.Path, File.Name) - 1) & "[" & File.Name & "]Summary'!$D$3"
...生成以下单元格公式:
='C:\Documents and Settings\[TEST]Summary'!$D$3
答案 0 :(得分:1)
看起来你确实无法禁用这个“无效参考”弹出框(如果我错了,请纠正我!)但是,你能做的就是生成你的公式以供你参考“摘要“VBA中的工作表(正如您已经在做的那样),但在粘贴实际公式之前在VBA中对其进行评估,以便如果公式返回正常而没有错误,则粘贴它,否则您可以执行其他操作。
例如,您现在有:
if FileType <> "XLS" then
myCellFormula = "#Ref!"
else
myCellFormula = "[<Target File Name>]Summary!A1"
endif
但是,正如您所知,尝试引入不存在的工作表将导致excel咳嗽。您可以做的是在VBA中检查此错误,例如:
On Error Resume Next
dim dummy as variant
if FileType <> "XLS" then
myCellFormula = "#Ref!"
else
dummy = Application.Range("[<Target File Name>]Summary!A1").Value
if not isempty(dummy) then
myCellFormula = "[<Target File Name>]Summary!A1"
else
<alternative action>
endif
endif
您也可以使用错误处理程序执行此操作,它取决于您是否希望跳过这些不存在的引用(因此<alternative action>
将无效)。
编辑,您可以将代码更改为以下内容:
On Error Resume Next
dim dummy as variant
dim targetFileFormula as string
dim lastSlashPos as long
lastSlashPos = InStrRev(fileitem.Path, "\", , vbBinaryCompare)
targetFileFormula = "'" & Left(fileitem.Path, lastSlashPos) & "[" & Right(fileitem.Path, Len(fileitem.Path) - lastSlashPos) & "]Summary'!$D$3"
if FileType <> "XLS" then
myCellFormula = "#Ref!"
else
dummy = Application.Range(targetFileFormula).Value
if not isempty(dummy) then
myCellFormula = targetFileFormula
else
<alternative action>
endif
endif
然后,您可以根据自己的需要进行定制。