2015-01-27 3 views
1

대규모 워크 시트에 성능 문제가 있습니다. 특히, 행 삽입, 행 삭제 및 실행 취소와 같은 세 가지 작업이 매우 느립니다.행을 삽입 할 Excel의 경과 시간 계산

저는 최적화에 대해 읽었으며 실제로 어떤 변화가 효과가 있는지를 수량화하려고합니다. 이렇게하려면 위의 이벤트에 대한 경과 시간을 추적하는 일부 VBA를 설치하고 싶습니다. 그러나 후크를 찾을 수 없습니다.

workheet_change_start, worksheet_change_end와 같은 것을 원하지만 그와 같은 것을 찾지 못했습니다.

"훌륭한"아이디어가 하나 있는데 작동하지 않았습니다. 나는 두 줄의 인서트를 연속적으로하고, 각각의 타임 스탬프를 찍은 다음 차이를 계산할 것이라고 생각했지만 ... Excel이 나를 압도하고 어떻게 든 그들을 일괄 적으로 배치했다. 귀하의 제안

사전에

감사

참고 : 지금까지 답변을 감사합니다. 타이머 기능에 대해서는 알고 있지만 사용자가 행을 삽입하기 전후에 일부 사용자 동작을 위해 타이머를 시작하고 종료 할 수있는 이벤트를 캡처하는 방법을 찾을 수 없습니다. 당신은이 작업을 수행하는 통합 문서 걸리는 시간과 같은 시간에 아래와 같이 작은 매크로를 사용할 수

답변

0

당신은 이전에서 기본 타이머 클래스를 (사용할 수 있습니다 그래서 클래스 모듈 (CTimer)에 넣음으로써이 질문을 참조하십시오. 이 접근 방식의 이점은 재사용 가능하다는 것입니다.

Option Explicit 

Private Type LARGE_INTEGER 
    lowpart As Long 
    highpart As Long 
End Type 

Private Declare Function QueryPerformanceCounter Lib "kernel32" (lpPerformanceCount As LARGE_INTEGER) As Long 
Private Declare Function QueryPerformanceFrequency Lib "kernel32" (lpFrequency As LARGE_INTEGER) As Long 

Private m_CounterStart As LARGE_INTEGER 
Private m_CounterEnd As LARGE_INTEGER 
Private m_crFrequency As Double 

Private Const TWO_32 = 4294967296# ' = 256# * 256# * 256# * 256# 

Private Function LI2Double(LI As LARGE_INTEGER) As Double 
Dim Low As Double 
    Low = LI.lowpart 
    If Low < 0 Then 
     Low = Low + TWO_32 
    End If 
    LI2Double = LI.highpart * TWO_32 + Low 
End Function 

Private Sub Class_Initialize() 
Dim PerfFrequency As LARGE_INTEGER 
    QueryPerformanceFrequency PerfFrequency 
    m_crFrequency = LI2Double(PerfFrequency) 
End Sub 

Public Sub StartCounter() 
    QueryPerformanceCounter m_CounterStart 
End Sub 

Property Get TimeElapsed() As Double 
Dim crStart As Double 
Dim crStop As Double 
    QueryPerformanceCounter m_CounterEnd 
    crStart = LI2Double(m_CounterStart) 
    crStop = LI2Double(m_CounterEnd) 
    TimeElapsed = 1000# * (crStop - crStart)/m_crFrequency 
End Property 

그리고 일반 코드 모듈 당신은 다음과 같이 사용할 수 있습니다 :

Sub test_time() 
Dim time_this As New CTimer 
Dim ws As Worksheet 

Set ws = ThisWorkbook.Worksheets("Sheet1") 

time_this.StartCounter 

    ws.Rows("6:6").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 
    ws.Rows("8:8").Insert Shift:=xlDown, CopyOrigin:=xlFormatFromLeftOrAbove 

MsgBox time_this.TimeElapsed 

End Sub 
+0

이 주목해야하는 가져 오기 기능은 32 비트 엑셀/VBA에 대한 것을. ** PtrSafe ** 동급 (또는 컴파일러 지시어가있는 두 버전 모두)은 64 비트 Excel/VBA에 필요합니다. – Jeeped