Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba Excel-如果值=corect工作表上的值筛选和复制-加速_Vba_Excel - Fatal编程技术网

Vba Excel-如果值=corect工作表上的值筛选和复制-加速

Vba Excel-如果值=corect工作表上的值筛选和复制-加速,vba,excel,Vba,Excel,我需要一些建议。 我的代码检查工作表“总计”中的单元格“E”和工作表“列表”中的单元格“B”,如果值相等,它将读取工作表“列表”中的单元格“A”(其中包含我所有工作表的名称),并将匹配线复制到正确的工作表中 我的脚本可以工作,但速度很慢。你对如何加快这个过程有什么建议吗 目前脚本逐行读取和复制,我想通过应用自动过滤器来加快进程,但不知道从哪里开始。。。 提前谢谢 这是我的真实脚本: Sub copystatus() Dim LR As Long Dim LC As Integer

我需要一些建议。 我的代码检查工作表“总计”中的单元格“E”和工作表“列表”中的单元格“B”,如果值相等,它将读取工作表“列表”中的单元格“A”(其中包含我所有工作表的名称),并将匹配线复制到正确的工作表中

我的脚本可以工作,但速度很慢。你对如何加快这个过程有什么建议吗

目前脚本逐行读取和复制,我想通过应用自动过滤器来加快进程,但不知道从哪里开始。。。 提前谢谢

这是我的真实脚本:

Sub copystatus()

  Dim LR As Long
  Dim LC As Integer
  Dim LB As Long
  Dim ws As Worksheet
  Dim ws2 As Worksheet
  Dim ws3 As Worksheet
  Dim cLista As String

  Set ws = ThisWorkbook.sheets("totale")
  Set ws2 = ThisWorkbook.sheets("liste")

  LR = ws.Cells(Rows.Count, 5).End(xlUp).Row
  LC = ws2.Cells(Rows.Count, 2).End(xlUp).Row

  With ws
     For x = 2 To LR
     For i = 2 To LC

     If .Cells(x, 5).value = ws2.Cells(i, 2).value Then
     cLista = ws2.Cells(i, 1).value
     Set ws3 = ThisWorkbook.sheets(cLista)
     On Error GoTo ErrorHandler
     LB = ws3.Cells(Rows.Count, 1).End(xlUp).Row
     ws3.Rows(LB + 1).value = .Rows(x).value
     ws3.Rows(1).value = .Rows(1).value
     End If

     Next i
     Next x

  End With 

ErrorHandler:

  End Sub

检查此项-增加应可见:

Sub copystatus()

    Dim LR As Long
    Dim LC As Integer
    Dim LB As Long
    Dim ws As Worksheet
    Dim ws2 As Worksheet
    Dim ws3 As Worksheet
    Dim cLista As String

    Application.ScreenUpdating = False
    Application.EnableEvents = False


    Set ws = ThisWorkbook.sheets("totale")
    Set ws2 = ThisWorkbook.sheets("liste")

    LR = ws.Cells(Rows.Count, 5).End(xlUp).Row
    LC = ws2.Cells(Rows.Count, 2).End(xlUp).Row

    With ws
    For x = 2 To LR
        For i = 2 To LC

        If .Cells(x, 5).value = ws2.Cells(i, 2).value Then
            cLista = ws2.Cells(i, 1).value
            Set ws3 = ThisWorkbook.sheets(cLista)
            On Error GoTo ErrorHandler
            LB = ws3.Cells(Rows.Count, 1).End(xlUp).Row
            ws3.Rows(LB + 1).value = .Rows(x).value
            ws3.Rows(1).value = .Rows(1).value
        End If

        Next i
    Next x

    End With 

    Application.ScreenUpdating = True
    Application.EnableEvents = True

ErrorHandler:

End Sub
最后,将ws、ws2、ws3设置为如下所示: 设置ws=nothing
设置ws2=nothing

检查此项-增加值应可见:

Sub copystatus()

    Dim LR As Long
    Dim LC As Integer
    Dim LB As Long
    Dim ws As Worksheet
    Dim ws2 As Worksheet
    Dim ws3 As Worksheet
    Dim cLista As String

    Application.ScreenUpdating = False
    Application.EnableEvents = False


    Set ws = ThisWorkbook.sheets("totale")
    Set ws2 = ThisWorkbook.sheets("liste")

    LR = ws.Cells(Rows.Count, 5).End(xlUp).Row
    LC = ws2.Cells(Rows.Count, 2).End(xlUp).Row

    With ws
    For x = 2 To LR
        For i = 2 To LC

        If .Cells(x, 5).value = ws2.Cells(i, 2).value Then
            cLista = ws2.Cells(i, 1).value
            Set ws3 = ThisWorkbook.sheets(cLista)
            On Error GoTo ErrorHandler
            LB = ws3.Cells(Rows.Count, 1).End(xlUp).Row
            ws3.Rows(LB + 1).value = .Rows(x).value
            ws3.Rows(1).value = .Rows(1).value
        End If

        Next i
    Next x

    End With 

    Application.ScreenUpdating = True
    Application.EnableEvents = True

ErrorHandler:

End Sub
最后,将ws、ws2、ws3设置为如下所示: 设置ws=nothing
设置ws2=nothing

我假设这是另一个后续宏? 由于您已经检查了该条件并在那里生成了工作表(cLista),因此最好首先复制那里的行。 根据Vityta的建议,禁用屏幕更新后,应运行正常

您可以尝试简化此部分:

Set ws3=thiswoolk.sheets(cLista)
关于错误转到错误处理程序
LB=ws3.Cells(Rows.Count,1).End(xlUp).Row
ws3.Rows(LB+1).value=.Rows(x).value
ws3.Rows(1).value=.Rows(1).value

如果不使用setforws3,只需在一行中引用您的目标,而不是执行多变量赋值,可能会更好

sheets(clista).行(sheets(clista).单元格(Rows.Count,1).结束(xlUp).行+1.值=.Rows(x)值

sheets(clista).Rows(1).value=.Rows(1)value

我假设这是另一个后续宏? 由于您已经检查了该条件并在那里生成了工作表(cLista),因此最好首先复制那里的行。 根据Vityta的建议,禁用屏幕更新后,应运行正常

您可以尝试简化此部分:

Set ws3=thiswoolk.sheets(cLista)
关于错误转到错误处理程序
LB=ws3.Cells(Rows.Count,1).End(xlUp).Row
ws3.Rows(LB+1).value=.Rows(x).value
ws3.Rows(1).value=.Rows(1).value

如果不使用setforws3,只需在一行中引用您的目标,而不是执行多变量赋值,可能会更好

sheets(clista).行(sheets(clista).单元格(Rows.Count,1).结束(xlUp).行+1.值=.Rows(x)值

工作表(clista).Rows(1).value=.Rows(1)value

类似的内容,从一个2列数据集开始

将给出如下输出(C列到D列)


类似的内容,从两列数据集开始

将给出如下输出(C列到D列)


我应用了您建议的更改,但不幸的是,我没有看到执行速度有任何提高。谢谢,你抄了我的密码吗?速度绝对没有提高?@Ruif0禁用屏幕更新肯定会加快速度。每个工作表中有多少条记录(LR和LC的值)?关闭计算并使用数组而不是范围?pav LR为783行和59行LC。此脚本始终是上一个项目的一部分。
好的,pav和Vityata,我将您的所有建议应用到我的代码中,它运行得更快,非常感谢
@Nathan_Sav我使用vba的时间很少,使用数组会给我带来很多困惑。。。你能给我一个如何用数组转换代码的例子吗?非常感谢。
我应用了您建议的更改,但不幸的是,我没有看到执行速度有任何提高。谢谢,你抄了我的密码吗?速度绝对没有提高?@Ruif0禁用屏幕更新肯定会加快速度。每个工作表中有多少条记录(LR和LC的值)?关闭计算并使用数组而不是范围?pav LR为783行和59行LC。此脚本始终是上一个项目的一部分。
好的,pav和Vityata,我将您的所有建议应用到我的代码中,它运行得更快,非常感谢
@Nathan_Sav我使用vba的时间很少,使用数组会给我带来很多困惑。。。你能给我一个如何用数组转换代码的例子吗?非常感谢。
我会试试!!谢谢:DNice一号。我总是在范围内循环,这可能是我未来代码的更好选择。我会尝试!!谢谢:DNice一号。我总是循环遍历范围,这可能是我未来代码的更好选择。