2017-03-22 5 views
1

私はアイトラッキングの研究を行っていますが、アイトラッカーが常に目を引くわけではありません。 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 Subプロシージャ。

ブックを.XLSMではなく.XLSBとして保存することで、いくつかの利点(実行速度、ファイルサイズの縮小)を得ることもできます。


は、私がI5と8Gbsとタブレットの0.6秒〜16,000空白セルと30万行に対して後者メモリベースのルーチンを実行したを¹しました。それは正解です。ゼロ点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

関連する問題