私は現在、ディレクトリに行くマクロを作成しようとしています。ブックを開き(最終的に合計52の38があります)、2つの列をフィルタリングし、合計を取得します(これを4回繰り返します)。ブック。現在、現在の38のワークブックを処理するのに約7分しかかかりません。このVBAブックを開くにはどうすればよいですか?
これをスピードアップするにはどうすればよいですか?私はすでに画面更新やイベントを無効にしており、計算方法をxlCalculationManualに変更しました。私はそれが一般的な慣行かどうかはわかりませんが、開いていなくてもワークブックにアクセスする方法を尋ねてきた人々を見てきましたが、画面の更新をオフにする提案が常に行われています。
デバッグモードで実行すると、Workbooks.Open()は最大10秒かかることがあります。ファイルディレクトリは実際には会社のネットワーク上にありますが、ファイルへのアクセスは通常5秒以内でいつでもかかります。
ブック内のデータには同じポイントが含まれている可能性がありますが、ステータスは異なります。私はすべてのデータを1つのブックにまとめることは可能だとは思わない。
私は直接細胞参照を試します。いくつか結果が出たら、私は自分の投稿を更新します。一般的に
Private UNAME As String
Sub FileOpenTest()
Call UserName
Dim folderPath As String
Dim filename As String
Dim tempFile As String
Dim wb As Workbook
Dim num As Integer
Dim values(207) As Variant
Dim arryindex
Dim numStr As String
Dim v As Variant
Dim init As Integer
init = 0
num = 1
arryindex = 0
numStr = "0" & CStr(num)
'Initialize values(x) to -1
For Each v In values
values(init) = -1
init = init + 1
Next
With Excel.Application
.ScreenUpdating = False
.Calculation = Excel.xlCalculationManual
.EnableEvents = False
.DisplayAlerts = False
End With
'File path to save temp file
tempFile = "C:\Users\" & UNAME & "\Documents\TEMP.xlsm"
'Directory of weekly reports
folderPath = "path here"
'First file to open
filename = Dir(folderPath & "file here" & numStr & ".xlsm")
Do While filename <> ""
Set wb = Workbooks.Open(folderPath & filename)
'Overwrite previous "TEMP.xlsm" workbook without alert
Application.DisplayAlerts = False
'Save a temporary file with unshared attribute
wb.SaveAs filename:=tempFile, AccessMode:=xlExclusive
'operate on file
Filters values, arryindex
wb.Close False
'Reset file name
filename = Dir
'I use this loop to add the appropriate number to the end ie 01, 02, 03 etc
If num >= 9 Then
num = num + 1
If num = 33 Then
num = num + 1
End If
numStr = CStr(num)
ElseIf num < 9 Then
num = num + 1
numStr = "0" & CStr(num)
End If
filename = Dir(folderPath & "filename here" & numStr & ".xlsm")
Loop
output values
'Delete "TEMP.xlsm" file
On Error Resume Next
Kill tempFile
On Error GoTo 0
End Sub
Function Filters(ByRef values() As Variant, ByRef arryindex)
On Error Resume Next
ActiveSheet.ShowAllData
On Error GoTo 0
'filter column1
ActiveSheet.Range("B6").End(xlDown).AutoFilter Field:=2, Criteria1:=Array(_
"p1", "p2", "p3", "p4", "p5"), Operator:=xlFilterValues
'filter column2
ActiveSheet.Range("J6").End(xlDown).AutoFilter Field:=10, Criteria1:=Array(_
"s1", "d2", "s3"), Operator:=xlFilterValues
'get the total of points
values(arryindex) = TotalCount
arryindex = arryindex + 1
'filter column2 for different criteria
ActiveSheet.Range("J6").End(xlDown).AutoFilter Field:=10, Criteria1:="s"
'filter colum3 for associated form
ActiveSheet.Range("AZ6").End(xlDown).AutoFilter Field:=52, Criteria1:="<>"
'get the total of points
values(arryindex) = TotalCount
arryindex = arryindex + 1
'filter coum 3 for blank forms
ActiveSheet.Range("AZ6").End(xlDown).AutoFilter Field:=52, Criteria1:="="
'get the total of points
values(arryindex) = TotalCount
arryindex = arryindex + 1
'filter for column4 if deadline was made
ActiveSheet.Range("J6").End(xlDown).AutoFilter Field:=52
ActiveSheet.Range("J6").End(xlDown).AutoFilter Field:=10, Criteria1:=Array(_
"s1", "s2", "s3", "s4", "s5", "s6"), Operator:=xlFilterValues
ActiveSheet.Range("BC6").End(xlDown).AutoFilter Field:=55, Criteria1:=RGB(146 _
, 208, 80), Operator:=xlFilterCellColor
'get total of points
values(arryindex) = TotalCount
arryindex = arryindex + 1
End Function
Public Function TotalCount() As Integer
Dim rTable As Range, r As Range, Kount As Long
Set rTable = ActiveSheet.AutoFilter.Range
TotalCount = -1
For Each r In Intersect(Range("A:A"), rTable)
If r.EntireRow.Hidden = False Then
TotalCount = TotalCount + 1
End If
Next
End Function
Function UserName() As String
UNAME = Environ("USERNAME")
End Function
Function output(ByRef values() As Variant)
Dim index1 As Integer
Dim index2 As Integer
Dim t As Range
Dim cw As Integer
'Calendar week declariations
Dim cwstart As Integer
Dim cstart As Integer
Dim cstop As Integer
Dim data As Integer
data = 0
start = 0
cw = 37
cstart = 0
cstop = 3
ThisWorkbook.Sheets("Sheet1").Range("B6").Activate
For index1 = start To cw
For index2 = cstart To cstop
Set t = ActiveCell.Offset(rowOffset:=index1, columnOffset:=index2)
t.value = values(data)
data = data + 1
Next
Next
End Function
他のワークブックを読んでいるだけの場合、セルをファイルパスとして参照することができます: '' C:\ mypath \ [myfile.xlsx] Sheet1 '!$ A1'。 2つの列をメインのブックにコピーし、そこでフィルタを実行します。 – Jack
私はさまざまな時にフィルタリングする必要がある合計約5列ですが、これは私が考えていた方向にsetpです。これは、このような関数のためにマクロが非常に遅いのは普通ですか? – user2843579
*マクロの機能が遅いのは普通ですか?< - それ以上の情報なしでは答えにくいです。もちろん、ブックを開くのはその内容を読むよりも遅いです。コードを見ることなく、これを最適化するためにできることを特定することはできません。 VBAの初心者であるため、パフォーマンスを向上させる方法がいくつかあると思われます。コードを投稿すると、より良い回答/アドバイスが得られます。 –