【问题标题】:Excel VBA Check if worksheet exists before copy worksheet to workbook aExcel VBA在将工作表复制到工作簿a之前检查工作表是否存在
【发布时间】:2018-02-15 15:50:01
【问题描述】:

我正在尝试开发一个宏,如果该工作表在主工作簿中尚不存在,则该宏会从文件夹中的所有工作簿中提取所有工作表。 浏览器

Folder  
|---Summary Sheet.xlsm  
|---Sheet 1 date1.xlsx  
|---Sheet 2 date2.xlsx   
etc.

宏打开工作簿,将工作表重命名为单元格的日期,将其复制过去,然后在不保存/提示的情况下关闭它。我似乎无法正确合并名称检查。我看过了
Test or check if sheet exists
Excel VBA If WorkSheet("wsName") Exists
但缺乏正确翻译概念的经验。

这是目前为止的代码。现在运行会引发运行时错误 438
sheetToFind = ThisWorkbook.Sheets(1)

Sub ConslidateWorkbooks()
Dim FolderPath As String
Dim Filename As String
Dim Sheet As Worksheet
Dim sheetToFind As String
Dim sheetExists As Boolean

Application.ScreenUpdating = False
Application.DisplayAlerts = False

FolderPath = Environ("userprofile") & "\Folder\"
Filename = Dir(FolderPath & "*.xlsx")

 Do While Filename <> ""
 Workbooks.Open Filename:=FolderPath & Filename, ReadOnly:=True
 sheetExists = False

 For Each Sheet In ActiveWorkbook.Sheets
   Sheet.Name = Sheet.Range("C4")
   sheetToFind = ThisWorkbook.Sheets(1)
   If sheetToFind = Sheet.Name Then
     sheetExists = True
   End If

   If sheetExists = False Then
     Sheet.Copy After:=ThisWorkbook.Sheets(1)
     Workbooks(Filename).Close False
     Filename = Dir()
   End If
  Next Sheet
Loop
Application.ScreenUpdating = True
End Sub

【问题讨论】:

  • ThisWorkbook.Sheets(1) 是一个对象,需要Set。 => Set sheetToFind = ThisWorkbook.Sheets(1)... 但sheetToFind = Sheet.Name 也会失败,因为sheetToFind 是一个无法像那样比较的对象... sheetToFind.Name = Sheet.Name 应该在那里解决问题;)
  • 对不起,我不完全理解。如果我去Do.. sheetToFind.Name = Sheet.Name For Each Sheet.... 我得到一个无效的限定符错误。我是否遗漏了某些东西或把它放在了错误的地方?我可以搜索所有工作表名称来比较重命名的工作表吗?
  • 只需尝试将sheetToFind = ThisWorkbook.Sheets(1) 更改为sheetToFind = ThisWorkbook.Sheets(1).Name 并检查它是否正在执行您想要的操作

标签: vba excel


【解决方案1】:

我在上面的答案中遇到的问题是他们没有每次都检查每张纸。我从
Excel VBA If WorkSheet("wsName") Exists 找到了另一个函数

使用它,我能够使一切正常进行。

Function sheetExists(sheetToFind As String) As Boolean
    sheetExists = False
    For Each Sheet In ThisWorkbook.Worksheets
        If sheetToFind = Sheet.Name Then
            sheetExists = True
            Exit Function
        End If
    Next Sheet
End Function

Sub ConslidateWorkbooks()
Dim FolderPath As String
Dim Filename As String
Dim Sheet As Worksheet
Application.ScreenUpdating = False
Application.DisplayAlerts = False
FolderPath = Environ("userprofile") & "\Folder\"
Filename = Dir(FolderPath & "*.xlsx")

Do While Filename <> ""
  Workbooks.Open Filename:=FolderPath & Filename, ReadOnly:=True
  For Each Sheet In ActiveWorkbook.Sheets
    Sheet.Name = Sheet.Range("C4")
    result = sheetExists(Sheet.Name)
    Debug.Print result
    If result = True Then
      Workbooks(Filename).Close False
      Filename = Dir()
    End If
    If result = False Then
      Sheet.Copy After:=ThisWorkbook.Sheets(1)
      Workbooks(Filename).Close False
      Filename = Dir()
    End If
  Next Sheet
Loop
Application.ScreenUpdating = True
End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-01-10
    相关资源
    最近更新 更多