首页 > 解决方案 > 在工作簿中找不到电子表格,即使该电子表格存在

问题描述

我有一小段代码:

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

标签: excelvba

解决方案


使用工作表代号

Option Explicit

Sub testCodeName()

    Const wsCodeName As String = "Sheet1"
    
    ' Choose file (workbook, spreadsheet).
    Dim NombreLibro As Variant
    NombreLibro = Application.GetOpenFilename()
    
    ' Validate workbook.
    If NombreLibro = False Then
        MsgBox "You canceled.", vbExclamation, "Canceled"
        Exit Sub
    End If
    
    ' Open and create a reference to the workbook.
    Dim Libro As Workbook: Set Libro = Workbooks.Open(NombreLibro, , False)
    
    ' Attempt to find the worksheet.
    Dim ws As Worksheet
    Dim wasFound As Boolean
    For Each ws In Libro.Worksheets
        If ws.CodeName = wsCodeName Then
            wasFound = True
            Exit For ' The worksheet is found, no need to loop anymore.
        End If
    Next ws

    ' Validate worksheet.
    If Not wasFound Then
        MsgBox "Worksheet not found.", vbExclamation, "Not Found"
        Exit Sub
    End With
    
    ' Continue with the code
    With ws
        ' e.g. see if it's true.
        MsgBox "Worksheet found:" & vbLf _
            & "Name: " & .Name _
            & vbLf & "CodeName: " & .CodeName, vbInformation, "Success"
    End With

End Sub

推荐阅读