【问题标题】:How to Copy Filtered Range To Array?如何将过滤后的范围复制到数组?
【发布时间】:2021-03-14 08:05:59
【问题描述】:

目的是从 SharePoint 打开工作簿,设置自动过滤器,将过滤后的范围复制到现有工作表中。

两个最长的部分是打开工作簿并粘贴为值。

我想将过滤后的范围存储在数组中,然后将此数组分配给现有工作表(而不是复制粘贴)。

我有另一个模块运行所有的潜艇(这是其中之一)。在该模块中,我从以下内容开始。

Public Sub TurnOffFunctionality()
    Application.Calculation = xlCalculationManual
    Application.DisplayStatusBar = False
    Application.EnableEvents = False
    Application.ScreenUpdating = False
End Sub
Sub OpenWorkbookWithPopulation()

strFilePath = *Path to the SharePoint*

period = 202009

file = period & "_FR05_GRIR_Population"

strFileName = file & ".xlsb"

Set wbkopen = Workbooks.Open(strFilePath & strFileName, ReadOnly:=True, UpdateLinks:=False)

With Workbooks(file)
    .Worksheets("ERP Extract").AutoFilterMode = False
    .Worksheets("ERP Extract").Range("A1").AutoFilter
    .Worksheets("ERP Extract").Range("A1").AutoFilter field:=17, Criteria1:="Trade"
    .Worksheets("ERP Extract").Range("A1").AutoFilter field:=18, Criteria1:=">" & 90
    .Worksheets("ERP Extract").AutoFilter.Range.Copy
    cockpit = .Worksheets("Cockpit").Range("C6:C12").Value2
End With

With Workbooks("Master_Template_Working")
    .Worksheets("Aged GRNI_Pop").Range("A1").PasteSpecial xlPasteValues
    .Worksheets("Instructions").Range("C38:C44") = cockpit
End With

Workbooks(file).Close SaveChanges:=False

End Sub

【问题讨论】:

  • .Worksheets("ERP Extract").AutoFilterMode = False.Worksheets("ERP Extract").Range("A1").AutoFilter。你的意思是:.Worksheets("ERP Extract").Autofilter.showalldata?
  • 我看不到您已关闭计算和屏幕更新。如果是这样的话,那可能会有所作为。
  • 对不起,我已经编辑了第一篇文章。
  • 我怀疑这有什么不同,但你 Set wbkopen 但你使用:With Workbooks(file)。更“常用”的方法是with wbkopen。除此之外。打开和保存文件需要时间。尤其是通过网络,当它基于云时可能更糟。我能想到的加快速度的唯一可能方法是在工作簿中打开,使用命令行或类似的东西在打开工作簿时异步下载文件。然后使用您下载的临时工作簿作为您打开的文件。这样文件可能会更快地打开和使用。为什么在没有任何更改的情况下保存文件?
  • 谢谢,我试试这个方法。嗯我在哪里保存文件?最后一个动作是 SaveChanges:=False 所以我认为没有保存更改?我只需要关闭这一行中的工作簿。

标签: arrays excel vba performance copy


【解决方案1】:

您可以尝试这样的事情(未测试):

With Workbooks(file)
    With .Worksheets("ERP Extract")
        .AutoFilterMode = False
        Dim Data As Variant
        ' If this doesn't work, use another way.
        Data = .Range("A1").CurrentRegion.Value
    End With
    cockpit = .Worksheets("Cockpit").Range("C6:C12").Value2
End With

Dim ColumnsCount As Long
ColumnsCount = UBound(Data, 2)

Dim i As Long ' Source Rows Counter
Dim j As Long ' Columns Counter
Dim k As Long ' Destination Rows Counter
k = 1 ' account for headers (i = 2 To ...)

For i = 2 To UBound(Data, 1)
    If Data(i, 17) = "Trade" And Data(i, 18) > 90 Then
        k = k + 1
        For j = 1 To ColumnsCount
            Data(k, j) = Data(i, j)
        Next j
    End If
Next i

With Workbooks("Master_Template_Working")
    With .Worksheets("Aged GRNI_Pop").Range("A1")
        .Resize(k, ColumnsCount).Value = Data
    End With
    .Worksheets("Instructions").Range("C38:C44") = cockpit
End With

【讨论】:

  • 效果很好!时间减少了 50%。现在大约需要。 50 秒与之前的 130 秒。非常感谢!您是否还有一些材料可以让我查找信息以了解您在这里所做的事情? :-)
  • 您必须了解有关数组的基础知识,因为您有自己的数组:cockpit。你了解LBoundUBound 吗?您了解按行和按列循环数组吗? Resize 怎么样。告诉我你的理解,我会尝试填补一些空白。该代码完全符合我在您帖子下方的长评论中所描述的内容。我敢肯定,只需很少的努力,您就可以确定代码的哪一部分涵盖了哪些内容。所以也许找出你不理解的代码行。
猜你喜欢
  • 1970-01-01
  • 2019-07-15
  • 2012-04-26
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
  • 1970-01-01
  • 2014-07-19
  • 1970-01-01
相关资源
最近更新 更多