2017-03-22 2 views
1

눈 추적 연구를하고 있지만 눈 추적기가 항상 눈을 .지는 않았습니다. 하나의 Excel 파일은 ~ 30k-40k 행을 가지고 있으며 누락 된 값을 이전에 사용 가능한 데이터 포인트와 다음으로 사용 가능한 데이터 포인트의 평균으로 채우고 싶습니다. 그러나 그것을 수동으로하는 것은 영원히 걸릴 것입니다.자동 계산 및 채우기는 이전 및 다음으로 사용 가능한 데이터를 기반으로 누락 된 값을 비교합니다.

표의 예를 첨부했습니다. 따라서 X 열의 누락 된 값은 359.5 또는 360으로 반올림해야합니다. Y 열 누락 값은 134 여야합니다.

또한 가능한 경우 누락 된 값만 채울 수있는 제어 메커니즘을 추가하는 것이 좋습니다 행의 최대 N 개 값. 뒤에있는 아이디어는 눈 추적기가 짧은 시간 동안 눈을 잡지 않으면 평균을 계산할 수 있지만 오랜 기간 동안 정확하지 않을 것이라는 것입니다. 열 X와 Y의 빈 셀의 위치를 ​​넘어

Excel table example

답변

1

, 이것은 단순한 수학이다.

Option Explicit 

Sub missingGazePoints() 
    Dim blnk As Range 

    With Worksheets("Sheet3") 
     For Each blnk In .Columns("X:Y").SpecialCells(xlCellTypeBlanks) 
      blnk = blnk.End(xlUp).Value2 + _ 
        (blnk.End(xlDown).Value2 - blnk.End(xlUp).Value2)/_ 
        (blnk.End(xlDown).Row - blnk.End(xlUp).Row) 
     Next blnk 
    End With 
End Sub 

모든 누락 점을 선형 방식으로 채 웠습니다. 누락 된 모든 지점에 대해 정적 평균을 사용하지 않았습니다. enter image description here

부록 : 반복적 인 워크 시트 조회에 행을 반복

일을 느리게 할 것입니다 배열 작업; 가능성이 크래쉬의 시점으로. 모든 값 (공백 포함)을 2 차원 변형 배열에 채우고 워크 시트에 값을 반환하기 전에 메모리 내에서 모든 처리를 수행하면 작업 속도가 빨라집니다 .¹.

Sub qwuirwqwq() 
    Dim rsz As Long, x As Long, y As Long 
    Dim vals As Variant, bd As Double, ed As Double 

    On Error GoTo bm_Safe_Exit 'uncomment this line when you have finished debugging 
    appTGGL bTGGL:=False  'uncomment this line when you have finished debugging 

    With Worksheets("Sheet3") 
     With .Cells(2, "X").Resize(Application.Min(.Cells(.Rows.Count, "X").End(xlUp).Row - 1, _ 
                .Cells(.Rows.Count, "Y").End(xlUp).Row - 1), 2) 
      vals = .Cells.Value2 

      For x = LBound(vals, 1) + 1 To UBound(vals, 1) 
       If vals(x, 1) = vbNullString Then 
        y = x + 1 
        Do While vals(y, 1) = vbNullString 
         y = y + 1 
        Loop 
        vals(x, 1) = vals(x - 1, 1) + _ 
           (vals(y, 1) - vals(x - 1, 1))/(y - x + 1) 
       End If 
       If vals(x, 2) = vbNullString Then 
        y = x + 1 
        Do While vals(y, 2) = vbNullString 
         y = y + 1 
        Loop 
        vals(x, 2) = vals(x - 1, 2) + _ 
           (vals(y, 2) - vals(x - 1, 2))/(y - x + 1) 
       End If 
      Next x 

      .Cells = vals 
      ReDim vals(0) 
     End With 
    End With 

bm_Safe_Exit: 
    appTGGL 

End Sub 

Public Sub appTGGL(Optional bTGGL As Boolean = True) 
    Application.ScreenUpdating = bTGGL 
    Application.EnableEvents = bTGGL 
    Application.DisplayAlerts = bTGGL 
    Application.Calculation = IIf(bTGGL, xlCalculationAutomatic, xlCalculationManual) 
    Debug.Print Timer 
End Sub 

참고 '도우미'일시적으로 세금 처리가 처리가 완료 될 때까지 다양한 환경 설정을 일시 중단 appTGGL 하위 프로 시저.

통합 문서를 .XLSM 대신 .XLSB로 저장하면 몇 가지 이점 (실행 속도, 파일 크기 축소)을 얻을 수도 있습니다.


는 I는 I5와 8Gbs와 태블릿 0.6 초 ~ 30 만 개 행을 16,000 블랭크 셀 후자 메모리 기반의 루틴을 실행 를 ¹. 네 ... 맞습니다. 제로 포인트 - 6 초.

+0

감사합니다. 그것은 트릭을 수행하지만, 30000 개 이상의 행이있는 경우에는 속도가 느립니다. 계산 시간이 끝난 후 마침내 추락했습니다. :) 또한, 선형 계산 주셔서 감사합니다, 실제로는 더 좋습니다. 이제 20 개 이상의 공백을 제외 할 수 있는지 알아보기 위해 노력 중입니다. – Algeron

+0

모든 처리가 메모리에 있도록 2 차원 변형 배열에서이 작업을 수행 할 생각입니다. 이는 몇 천 개가 넘는 모든 반복 처리를위한 최상의 솔루션입니다. – Jeeped

+0

잠시 동안 [VBA 모범 사례 - 매크로 실행 중 속성 끄기] (http://stackoverflow.com/documentation/excel-vba/1107/vba-best-practices/5925/switch-off-properties-during)를 참조하십시오. -macro-execution). – Jeeped