2011-03-03 462 views
0

我已经为Excel 2010编写了一个宏,它为包含任何文件和子文件夹的文件夹建立索引。这样做的目的是管理从包含数百个文件的文件夹目录中提取特定细节,其中只有一些文件是Excel文件,而其中只有一些文件与此细节相关。Excel VBA - 选择确定弹出菜单/对话框

该宏提供了一些基本的细节和文件的超链接(包括xls,doc,pdf等)。然后,vba代码将插入一个单元格公式,以从工作簿的特定位置(不打开它们)提取单个单元格值,并在其中存在Excel文件并生成#Ref!否则错误。由于单元格公式是通过FileItem.Path和文本操作创建的,因此该公式始终引用“摘要”工作表,以适合有意义的文件。

问题是剩余的Excel文件中没有包含此名称的工作表,该名称提示Excel为用户提供弹出对话框“选择表”,以供用户手动从选项中进行选择。我需要一种方法在vba代码中进行管理。我可以管理一些潜在的结果,包括选择OK来每次选择第一个选项,取消和忽略请求,跳过这些实例等,但是我不能让宏反复中断用于用户输入。

我已经尝试在代码中的各个点插入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

我认为不可能从vba代码访问关闭的工作簿,所以这可以为我工作。我只需要对Range的语法做一点澄清。目前给我一个错误'对象'_Application'失败'错误1004方法'范围' 我也尝试创建一个文本变量来保存路径并在Range()中使用,但没有成功。 有什么建议吗? – kavmeister 2011-03-03 17:30:22

+0

由于我没有明确的文件路径或名称(由于子文件夹加上不一致的命名约定),我必须动态构建位置。因此,对于您的解决方案,我不确定适当的方括号,撇号和引号需要使用此代码。我一直在尝试使用以下公式的变体: 'Application.Range(“[”&FileItem.Path&“] Summary!$ D $ 3”)。Value' ..它的计算结果如下: 'Application.Range([C:\ Documents and Settings [TEST] Summary!$ D $ 3).Value' – kavmeister 2011-03-03 17:31:21

+0

如果有人能够指导我如何使用StackOverflow来评论/回复将会有帮助。新手。 – kavmeister 2011-03-03 17:32:11

回答

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 

然后,您可以定制这个您的需求。

+0

'Application.Range(targetFileFormula).Value'产生一个错误。路径看起来很好,所以当使用Range公式时,您需要在'[]' @!中使用不同的标点符号组合/位置。 '。另外,你确定你可以像这样从vba访问封闭的工作簿吗? – kavmeister 2011-03-04 10:12:03

+0

如果工作表不存在于目标工作簿中,那么它确实会产生错误 - 所有目标工作簿都会发生这种情况吗? – 2011-03-05 12:04:00