【发布时间】:2021-08-07 03:43:06
【问题描述】:
我有这么一小段代码:
NombreLibro = Application.GetOpenFilename()
Set Libro = Workbooks.Open(NombreLibro, , False)
If Val(Application.Version) > 15 Then 'I tried this but it doesn't solve the problem
Libro.AutoSaveOn = False
End If
With Libro
For i = 1 To .Worksheets.Count
If .Worksheets(i).CodeName = "Sheet1" Then 'HERE I HAVE THE PROBLEM
(doing something)
End If
Next i
End With
即使工作簿实际上具有“Sheet1”,有时“if”也是错误的。 但是,如果我再次运行它,在代码中添加一个停止以检查发生了什么,那么这段代码将按预期工作。
我正在从公司网站下载工作簿并立即运行代码。 我的电脑中有 OneDrive。所以我想知道 OneDrive 是否正忙于上传文件,然后 Excel 无法正确访问它?
你有什么建议我可以试试?
编辑:
按照 VBasic2008 的建议(请参阅他/她的回答),我稍微更改了代码,但一直失败。然后我添加了一个调试 MsgBox:
For Each ws In Libro.Worksheets
MsgBox "CodeName: " & ws.CodeName & vbLf _
& "Name: " & ws.Name & vbLf & "Libro: " & Libro.Name 'I added this
If ws.CodeName = wsCodeName Then
wasFound = True
Exit For ' The worksheet is found, no need to loop anymore.
End If
Next ws
结果(显示在 MsgBox 中):
代号:'空白!!!
名称:SheetName '正确
Libro: LibroName '正确
Excel 中是否存在与 CodeNames 相关的错误?
EDIT2:(解决方法)
我从公司网站下载文件,网站上的数据在表格上,然后转换器将其下载为 Excel 格式。
我认为下载的文件不是Excel格式,CodeName没有填写。当 Excel 打开它并打开 VBA 编辑器时,Excel 会使用标准名称填写 CodeName。
在我的情况下,由于新下载的文件只有一张,我可以使用此解决方法:
For Each ws In Libro.Worksheets
If ws.CodeName = wsCodeName Or ws.CodeName = "" Then
wasFound = True
Exit For
End If
Next ws
这将在第一次处理文件ws.CodeName = "" 和下一次处理ws.CodeName = wsCodename 时起作用
【问题讨论】:
-
codename是工作表的一个属性,需要设置。如果您正在寻找名为“sheet1”的工作表,那么您需要遍历工作表,直到从范围中获得匹配项。 -
@spikey_richie 那部分是对的,代号是Sheet1,名字不一样。如果是这种情况,几分钟后代码将无法运行,而无需更改任何内容。