【问题标题】:Why does this show errors when it was working为什么它在工作时会显示错误
【发布时间】:2020-07-16 19:58:50
【问题描述】:

底部的代码

嗨,我刚刚修复了这个宏。人们告诉我它以前有效。 这个宏应该只复制可见的过滤数据(主要是动态表),并创建一个新的 Excel 文件,其中包含所有相同的工作表,但只复制和粘贴可见数据(工作表),没有动态表。这是为了减轻文件的重量,但不是为了制作精确的副本。

您应该使用要传输数据的文件打开此文件,然后在要复制的文件中运行宏。

首先,'Sheets(Pages).Select' 出现方法错误(我从.Activate 切换)并且它起作用了。

在那之后'NewBook.Sheets(1).Range("A1:BZ500").Select' 是范围的方法错误,所以我把它分成两行:

'NewBook.Sheets(1).activate'
'Range("A1:BZ500").Select'

这解决了这个错误。

之后,该行出现名称归属错误(如名称已被使用):

NewBook.Sheets(1).Name = OldBook.Sheets(Page).Name ( i tried a spy but ieverything was ok) so I decided to write it like NewBook.Sheets(1).Name = OldBook.Sheets(Page).Name + Cstr(Page) 

它解决了错误,但宏仍然没有做它应该做的事情:


    Set OldBook = ActiveWorkbook
    Set NewBook = Workbooks.Add
    
    NewBook.Worksheets(1).Name = "Vide"
    
    OldBook.Activate
    
    For Page = 1 To Sheets.Count - 1
    
    OldBook.Activate
    
    Sheets(Page).Activate
    Sheets(Page).Copy Before:=NewBook.Sheets(1)
    
    NewBook.Activate
    
    NewBook.Sheets(1).Name = OldBook.Sheets(Page).Name
    NewBook.Sheets(1).Range("A1:BZ500").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        
    Next


End Sub 

以下是我的更正:

Sub Fichier_Plat()
    Code_optimizer (True)
    Set OldBook = ActiveWorkbook
    Set NewBook = Workbooks.Add
    
    NewBook.Worksheets(1).Name = "Vide"
    
    OldBook.Activate
    
    For Page = 1 To Sheets.Count - 1
    
    OldBook.Activate
    
    Sheets(Page).Activate
    Sheets(Page).Copy Before:=NewBook.Sheets(1)
    
    NewBook.Activate
    
    NewBook.Sheets(1).Name = OldBook.Sheets(Page).Name + CStr(Page)
    NewBook.Sheets(1).Activate
    Range("A1:BZ500").Select
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValuesAndNumberFormats, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    
    Next

    Code_optimizer (False)
End Sub

【问题讨论】:

    标签: excel vba error-handling


    【解决方案1】:

    我首先要给原始编码器一个严厉的耳光,因为它没有定义变量/在模块顶部没有“选项显式”,使用SelectActivate 以及对范围进行硬编码这是要复制的。

    也许这段代码会更好?

    Public Sub Fichier_Plat()
        
        Dim OldBook As Workbook 'Declare your variables!
        Set OldBook = ActiveWorkbook
        
        Dim NewBook As Workbook
        Set NewBook = Workbooks.Add(xlWBATWorksheet) 'Create new workbook with a single sheet.
    
        NewBook.Worksheets(1).Name = "Vide"
        
        Dim wrkSht As Worksheet
        Dim newwrksht As Worksheet
        For Each wrkSht In OldBook.Worksheets 'Look at each sheet in turn.
            Set newwrksht = NewBook.Worksheets.Add
            With newwrksht
                .Name = wrkSht.Name  'Will cause error if one of them is called "Vide". Can use wrksht.Index to get number of sheet.
                wrkSht.Range(wrkSht.Cells(1, 1), LastCell(wrkSht)).Copy
                .Range("A1").PasteSpecial xlPasteValues
                .Range("A1").PasteSpecial xlPasteFormats
            End With
        Next wrkSht
    
    End Sub
    
    Public Function LastCell(wrkSht As Worksheet) As Range
    
        Dim LastCol As Long, LastRow As Long
        
        On Error Resume Next
        With wrkSht
            LastCol = .Cells.Find("*", , , , xlByColumns, xlPrevious).Column
            LastRow = .Cells.Find("*", , , , xlByRows, xlPrevious).Row
        End With
        
        If LastCol = 0 Then LastCol = 1
        If LastRow = 0 Then LastRow = 1
    
        Set LastCell = wrkSht.Cells(LastRow, LastCol)
    
    End Function
    

    【讨论】:

    • 哇...与之前编码的代码相比,白天和黑夜。它创造了一个与众不同的世界,并且以这种方式更加通用。实际上我工作的公司是靠实习生来编程的
    • 它不会复制工作表中可能存在的任何代码,也不会认为它会复制条件格式或附加到范围的名称。
    猜你喜欢
    • 2020-01-31
    • 2022-07-12
    • 1970-01-01
    • 1970-01-01
    • 2010-10-08
    • 2018-11-01
    • 2021-12-15
    • 2019-01-05
    • 2020-11-29
    相关资源
    最近更新 更多