산업용 플랜트에서 I/O 신호 밀도 맵을 생성하는 통합 문서를 가지고 있습니다. 전체 통합 문서는 사용자가 신호 유형을 입력하는 리드 시트와 그 위치를 표시합니다. 밀도 맵을 생성하는 워크 시트에서 사용자는 밀도 맵에서 원하는 셀을 클릭 할 수 있습니다. 사용자가 셀을 클릭하면 on_selectionChange 매크로가 플랜트에서의 위치 계산을 실행합니다. 이 위치는 납 시트 자동 필터에 공급되는 것보다 실제로 플랜트의 해당 지점에있는 신호를 사용자에게 보여줍니다. 내 문제는 위치 정보가 즉시 계산되지만 자동 필터에 필터 기준을 적용하려면 필터를 적용하고 밀도지도 시트에서 리드 데이터베이스 시트로 코드를 변경하는 데 12 초가 걸립니다. 그렇다면 누구나 자동 필터로 코드를 빠르게 처리 할 수 있습니다. 매크로를 실행할 때 화면 업데이트 및 응용 프로그램 계산을 해제합니다. 이것은 통합 문서에 다른 시트를 추가하기 전까지는 느린 적이 없습니다. 아래에서 위치를 계산하는 방법에 대한 내 코드를 볼 수 있습니다. 누군가 나를 도와 줄 수 있습니까Excel 자동 필터 속도 향상
Private Sub Worksheet_SelectionChange(ByVal Target As Excel.Range)
' Filter the I/O data to those associated with the clicked cell
' Turn off screen updating, this speeds up Calc
Application.ScreenUpdating = False
' Turn off automatic calculations
Application.Calculation = xlCalculationManual
' Setup benchmarking
Dim Time1 As Date
Time1 = Timer
Dim Time2 As Date
Dim rngOLD As Boolean
Dim rngNEW As Boolean
Const Building_rng = "C4:K6"
Const Lvl_rng = "C4:E30"
Const RL_rng = "C4:C6"
Const FB_rng = "C4:E4"
Dim NEW_Offset As Integer
Dim Extra_Off As Integer
Dim rowOff As Integer
Dim colOff As Integer
' Define Filter Criteria Variables
Dim Criteria_Building As String ' Building
Dim Criteria_lvl As String ' Building Level
Dim Criteria_FB As String ' Front/Back on Level
Dim Criteria_RL As String ' Left/Right on Level
rngOLD = InRange(Target, Worksheets("Density Map").Range("C4:K27"))
rngNEW = InRange(Target, Worksheets("Density Map").Range("N4:V30,W4:Y12"))
If (rngOLD Or rngNEW) And Not RangeIsBlank(Target) Then
If rngNEW Then
NEW_Offset = 11
Criteria_Building = FindBuildingionNEW(Target, Union(Range(Building_rng).Offset(0, NEW_Offset), Range("W4:Y6")))
' Account for the Extra module in NEW Building
If Criteria_Building = "Extra" Or Criteria_Building = "5" Or Criteria_Building = "6" Or Criteria_Building = "7" _
Or Criteria_Building = "8" Or Criteria_Building = "9" Or Criteria_Building = "10" Then
Extra_Off = 3
End If
Else
Criteria_Building = FindBuildingionOLD(Target, Range(Building_rng))
End If
Criteria_lvl = FindLvl(Target, Range(Lvl_rng).Offset(0, NEW_Offset), Criteria_Building)
' Get the offsets, Default will return zero if not found
rowOff = getBuildingionOffset(Criteria_Building) + Extra_Off
colOff = getLevelOffset(Criteria_lvl)
Criteria_RL = FindRLFB(Target, Range(RL_rng).Offset(0, NEW_Offset), 1, rowOff, colOff)
Criteria_FB = FindRLFB(Target, Range(FB_rng).Offset(0, NEW_Offset), 2, rowOff, colOff)
' Benchmark
Debug.Print "1st Half Time: " & Format(Timer - Time1, "00:00")
Time2 = Timer
' End Benchmark
' Filter sheet based on click position
If rngVA Then ' Filter OLD location data
With Worksheets("IO Data")
.AutoFilterMode = False
With .Range("A3:Z3")
.AutoFilter
.AutoFilter Field:=10, Criteria1:=Criteria_Building
.AutoFilter Field:=12, Criteria1:=Criteria_lvl, Operator:=xlOr, Criteria2:=""
.AutoFilter Field:=13, Criteria1:=Criteria_FB, Operator:=xlOr, Criteria2:=""
.AutoFilter Field:=14, Criteria1:=Criteria_RL, Operator:=xlOr, Criteria2:=""
End With
End With
Else ' Filter NEW location data
With Worksheets("IO Data")
.AutoFilterMode = False
With .Range("A3:Z3")
.AutoFilter
.AutoFilter Field:=17, Criteria1:=Criteria_Building
.AutoFilter Field:=19, Criteria1:=Criteria_lvl, Operator:=xlOr, Criteria2:=""
.AutoFilter Field:=20, Criteria1:=Criteria_FB, Operator:=xlOr, Criteria2:=""
.AutoFilter Field:=21, Criteria1:=Criteria_RL, Operator:=xlOr, Criteria2:=""
End With
End With
End If
' Turn on automatic calculations
Application.Calculation = xlCalculationAutomatic
' Turn on screen updating
Application.ScreenUpdating = True
Worksheets("IO Data").Activate
' Benchmark
Debug.Print "Autofilter Time: " & Format(Timer - Time2, "00:00")
' End Benchmark
End If
End Sub
어떻게
c.ODBCConnection.CommandText
에 액세스 할 수있는 SQL 쿼리 문자열의 WHERE 절 부분을 구축 기본적으로 귀하의 요구 사항이 적응 많은 데이터를 필터링하고 있습니까? –매크로를 실행할 때만 속도가 느립니까? 내 워크 시트의 데이터를 직접 필터링하려고하면 속도가 느려 집니까? – JMax