提高宏观效率

如何解决提高宏观效率

宏改进| 你好这是我在这个网站上的第一篇文章,我喜欢这里的社区 我是宏的菜鸟,但我已尽力创建一个可以运行的宏,我想听听专业人士的意见,我可以在哪些方面改进我的宏,主要是它的效率。我试图用这个宏执行的任务是根据我的 MainB 工作簿中的单元格打开工作簿,然后比较这两个工作簿中的 3 个字符串,如果它们匹配,则将它们复制并粘贴到原始文件中,关闭一个并继续。 我现在遇到的错误是在宏遇到不存在的文件位置后,它关闭了主工作簿并且不再继续。如果有任何机会它继续,那么它会给我一条错误消息,它不应该,因为我已经指定了“OnError”做什么。

 Sub DocopyandRepeat()

Dim MainB As Workbook
Dim copyB As Workbook
Dim wsM As Worksheet
Dim wsC As Worksheet
Dim A,B,C,D,E,F,G,H As Variant
Dim X As Integer

Set MainB = ThisWorkbook

Set wsM = MainB.Worksheets("Sheet1")

AfterError:

For X = 3 To 10 Step 1

If Cells(X,23).Value = "" Then
Workbooks.Open Filename:="C:\Users\XY\OneDrive - XX\Desktop\Macro book"

Set MainB = ThisWorkbook
Set wsM = MainB.Worksheets("Sheet1")
MainB.Activate

Workbooks.Open Filename:="C:\Users\XY\OneDrive - XX\Desktop\Folder1\Folder2\" & Worksheets("Sheet1").Cells(X,5) & "\Folder3\" & Worksheets("Sheet1").Cells(X,12) & "\" & Worksheets("Sheet1").Cells(X,14)
    On Error GoTo Reset:

    End If
    
Set copyB = ActiveWorkbook
Set wsC = copyB.ActiveSheet

wsC.Range("E4").copy
wsM.Activate
Range("AE2").PasteSpecial xlPasteValues,xlPasteSpecialOperationNone,True,False

wsC.Range("C4").copy
wsM.Activate
Range("AF2").PasteSpecial xlPasteValues,False

wsC.Range("E6").copy
wsM.Activate
Range("AG2").PasteSpecial xlPasteValues,False

wsC.Range("E5").copy
wsM.Activate
Range("AH2").PasteSpecial xlPasteValues,False
    
A = Range("AE2")
B = Cells(X,15)
ActiveSheet.Range("AE3") = StrComp(A,vbTextCompare)

C = Range("AF2")
D = Cells(X,12)
ActiveSheet.Range("AF3") = StrComp(C,vbTextCompare)

E = Range("AG2")
F = Cells(X,18)
ActiveSheet.Range("AG3") = StrComp(E,vbTextCompare)

G = Range("AH2")
H = Cells(X,15)
ActiveSheet.Range("AG3") = StrComp(E,vbTextCompare)

If Cells(3,31) = 0 And Cells(3,32) = 0 And Cells(3,33) = 0 Then
    copyB.Activate
    Range("G4:G10").copy
    MainB.Activate
    Cells(X,23).PasteSpecial xlPasteValues,Transpose:=True
    copyB.Close
    
ElseIf Cells(3,33) = 0 And Cells(3,34) = 0 Then

    copyB.Activate
    Range("G6:G10").copy
    MainB.Activate

    copyB.Activate
    Range("G5").copy
    MainB.Activate
    Cells(X,xlPasteSpecialOperationNone
    
    copyB.Activate
    Range("G4").copy
    MainB.Activate
    Cells(X,24).PasteSpecial xlPasteValues,xlPasteSpecialOperationNone
    copyB.Close
    
Else
    Cells(X,23) = "failure"

copyB.Close

End If

ActiveWorkbook.Save
Application.Wait (Now + TimeValue("0:00:05"))

Reset:

Next X
Resume AfterError

End Sub

解决方法

On Error 问题

您的 On Error GoTo 行应该您要处理的代码之前。

如果您在 VBE 中使用 F8 单步执行代码,例如,如果您要打开的工作簿不存在,则代码已在您的 On Error 处理程序之前执行,因此您在屏幕上收到错误消息。

为了避免错误出现在屏幕上并使您的代码按预期执行,请尝试这样做;

...
Set MainB = ThisWorkbook
Set wsM = MainB.Worksheets("Sheet1")
MainB.Activate

On Error GoTo Reset

Workbooks.Open Filename:="C:\Users\XY\OneDrive - XX\Desktop\Folder1\Folder2\" & Worksheets("Sheet1").Cells(X,5) & "\Folder3\" & Worksheets("Sheet1").Cells(X,12) & "\" & Worksheets("Sheet1").Cells(X,14)

End If
...

这样,如果您单步执行代码,您会看到 On Error 代码在 Workbooks.Open 行之前的行执行,因此如果抛出错误,代码现在知道 转到 Reset

举个简单的例子,下面的子程序有一个错误处理程序,并试图除以零(你不能这样做!)。

Sub foo()

Debug.Print 1 / 0
On Error GoTo Safety:

Exit Sub
Safety:
Debug.Print "Safety!"
End Sub

这个例子抛出一个错误;

运行时错误“11” 除以零

现在,如果我们将错误处理程序移到 1/0 行上方,

Sub foo()

On Error GoTo Safety:

Debug.Print 1 / 0

Exit Sub
Safety:
Debug.Print "Safety!"
End Sub

此示例将 Safety! 输出到 VBE 中的立即窗口。


至于对您的代码进行改进等的审查,这个问题更适合另一个 Stack Exchange 站点:Code Review

,

提高效率

Option Explicit

Sub DoCopyandRepeat()
     
    Dim dwb As Workbook: Set dwb = ThisWorkbook
    Dim dws As Worksheet: Set dws = dwb.Worksheets("Sheet1")
    
    Dim swb As Workbook
    Dim i As Long
    
    For i = 3 To 10
    
        ' Attempt to open the Source Workbook.
        Set swb = Nothing
        If dws.Cells(i,23).Value = "" Then ' Unclear,edit appropriately.
            Set swb = Workbooks.Open( _
                Filename:="C:\Users\XY\OneDrive - XX\Desktop\Macro book")
        Else
            On Error Resume Next
            Set swb = Workbooks.Open( _
                Filename:="C:\Users\XY\OneDrive - XX\Desktop\Folder1\Folder2\" _
                & dws.Cells(i,5).Value & "\Folder3\" _
                & dws.Cells(i,12).Value & "\" _
                & dws.Cells(i,14).Value)
            On Error GoTo 0
        End If
        
        If Not swb Is Nothing Then ' if file was opened
        
            Dim sws As Worksheet: Set sws = swb.ActiveSheet
            
            With dws
                
                .Range("AE2").Value = sws.Range("E4").Value
                .Range("AF2").Value = sws.Range("C4").Value
                .Range("AG2").Value = sws.Range("E6").Value
                .Range("AH2").Value = sws.Range("E5").Value
                    
                .Range("AE3").Value = StrComp(.Range("AE2").Value,_
                    .Cells(i,15).Value,vbTextCompare)
                .Range("AF3").Value = StrComp(.Range("AF2").Value,12).Value,vbTextCompare)
                .Range("AG3").Value = StrComp(.Range("AG2").Value,18).Value,vbTextCompare)
                .Range("AH3") = StrComp(.Range("AH2").Value,vbTextCompare) ' suspicious
             
                If .Cells(3,31).Value = 0 And .Cells(3,32).Value = 0 _
                        And .Cells(3,33).Value = 0 Then
                    swb.Range("G4:G10").Copy
                    .Cells(i,23).PasteSpecial xlPasteValues,_
                        xlPasteSpecialOperationNone,Transpose:=True
                ElseIf .Cells(3,32).Value = 0 And .Cells(3,33).Value = 0 _
                        And .Cells(3,34).Value = 0 Then
                    swb.Range("G6:G10").Copy
                    '.Cells... ' Missing Paste???
                    .Cells(i,23).Value = swb.Range("G5").Value
                    .Cells(i,24).Value = swb.Range("G4").Value
                Else
                    .Cells(i,23).Value = "failure"
                End If
                
                swb.Close SaveChanges:=False
            
            End With
            
            dwb.Save
            Application.Wait (Now + TimeValue("0:00:05")) ' ???
        
        'Else
            
            ' File was not opened: do nothing.
        
        End If
    
    Next i

End Sub
,

谢谢大家的输入 我能够将代码从 160 行减少到 90 行并实现更高的功能,同时还需要更少的变量。这是我的最终结果。还实现了 dir 函数,因此它在文件夹中搜索特定文件。我仍然相信它可以做得更好,但它足以完成当前的任务。

Sub CopyPaste()

Dim MainB As Workbook
Dim CopyB As Workbook
Dim wsM As Worksheet
Dim wsC As Worksheet
Dim X As Integer
Dim Folder As String
Dim XFile As String
Dim temp As Variant
Set MainB = ThisWorkbook
Set wsM = MainB.Worksheets("DATA")

AfterError:

For X = 3 To 204 Step 1

 If wsM.Cells(X,16).Value = "" Then
    Folder = "C:\Users\USERXY\FolderLevel1\FolderLevel2\FolderLevel3\XX" & Worksheets("DATA").Cells(X,1)
    XFile = Dir(Folder & "*short*")
    Workbooks.Open (Folder & XFile)
    On Error GoTo Reset:
    ElseIf Cells(X,16).Value <> "" Then GoTo ErrorContinue:
    
End If
        
Set CopyB = ActiveWorkbook
Set wsC = CopyB.ActiveSheet
    
    wsC.Range("G4:G10").Copy
    wsM.Cells(X,16).PasteSpecial xlPasteValues,xlPasteSpecialOperationNone,Transpose:=True
                        
        wsM.Range("AE3").Value = StrComp(wsC.Range("E4").Value,_
           wsM.Cells(X,9).Value,vbTextCompare)
        wsM.Range("AF3").Value = StrComp(wsC.Range("C4").Value,8).Value,vbTextCompare)
        wsM.Range("AG3").Value = StrComp(wsC.Range("E6").Value,11).Value,vbTextCompare)
        wsM.Range("AH3") = StrComp(wsC.Range("E5").Value,vbTextCompare)       
        wsM.Range("AI3") = StrComp(wsC.Range("E5").Value,10).Value,vbTextCompare)
        wsM.Range("AJ3") = StrComp(wsC.Range("E4").Value,vbTextCompare)
           
           
    If wsM.Range("AE3").Value <> 0 And wsM.Range("AH3") = 0 Then
        
        wsM.Cells(X,16) = wsC.Range("G5")
        wsM.Cells(X,17) = wsC.Range("G4")
        wsM.Range("AE3").Value = StrComp(wsC.Range("E5").Value,_
        wsM.Cells(X,vbTextCompare) 'Recheck Switch
    End If
    
    If wsM.Range("AF3").Value <> 0 Then
        wsM.Cells(X,28) = "Type 0 Miss match"
    Else: wsM.Cells(X,28) = "Fit"
    End If
    
    If wsM.Range("AE3").Value <> 0 Then
        wsM.Cells(X,29) = "Type 1 Miss match"
    Else: wsM.Cells(X,29) = "Fit"
    End If
    
    If wsM.Range("AG3").Value <> 0 Then
        wsM.Cells(X,30) = " Type 2 Miss match"
    Else: wsM.Cells(X,30) = "Fit"
    End If
 
    If wsM.Range("AI3").Value = 0 Or wsM.Range("AJ3").Value = 0 Then
        wsM.Cells(X,27) = "Fit"
    Else: wsM.Cells(X,27) = " Mismatch or Missing"
    End If
    
CopyB.Close

Application.Wait (Now + TimeValue("0:00:05"))
ErrorContinue:
Next X
Exit Sub
Reset:
Cells(X,16) = "File Location Unavailable"
Resume ErrorContinue:
End Sub

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?
Java在半透明框架/面板/组件上重新绘画。
Java“ Class.forName()”和“ Class.forName()。newInstance()”之间有什么区别?
在此环境中不提供编译器。也许是在JRE而不是JDK上运行?
Java用相同的方法在一个类中实现两个接口。哪种接口方法被覆盖?
Java 什么是Runtime.getRuntime()。totalMemory()和freeMemory()?
java.library.path中的java.lang.UnsatisfiedLinkError否*****。dll
JavaFX“位置是必需的。” 即使在同一包装中
Java 导入两个具有相同名称的类。怎么处理?
Java 是否应该在HttpServletResponse.getOutputStream()/。getWriter()上调用.close()?
Java RegEx元字符(。)和普通点?