2016-03-26 43 views
2

いくつかの背景:最も簡単な方法

私は17のサブルーチンを実行Excelアドインを持っており、

に最も簡単で効率的、かつ最速の方法だろうかと思いました。
  1. レコード特定のマクロ
  2. ディスプレイによって行われた変更(新しいスプレッドシート内の)すべての変更のリストとそれが変更された理由(またはフラグ付き/強調表示された)各セル
  3. は、各々が誤るのセルアドレスを提供しますまたは、私がこれまでに収集した何を(同じワークブックに)別のワークシートの特定のセルにユーザーがかかりますクリック可能なリンク

として:

私は上に読みましたこれを達成する方法はほとんどありません。特に、hereherehere、そして最も重要なのはhereです。これらは、従来のすべての潜水艦が完了した後、二番目の配列にUsedRangeをダンプ次いで、すべてのサブルーチンを介して実行するアレイにUsedRangeをダンプよう

  • ような方法を示唆しています。 2つの配列を比較し、違いを見つけてください。
  • worksheet_changeイベントを使用して変更を記録します。
  • Marktastic siteの最後のリンクは、前の2つの方法を組み合わせた最も説得力のある方法です。しかし、worksheet_changeイベントが発生するたびに配列をチェックする彼の方法でも、それはオーバーヘッドが大きくなるように見える.06秒かかる。私が直面している

いくつかの特定の問題が含まれます:

  • は、大きなファイルを扱う私の潜水艦の一部をする必要はありません変更を加える
  • (15000+行、150列)特定のセルの値を並べ替えるだけで、それ以外の場合は値を並べ替えるなどしないように注意してください。
  • マクロは高速で動作するように設計されています(< 1分)ので、大型ファイルのスキャンを完了すると、各エラーがそれに応じて処理された後、別のワークシートに即座に書き込むこともできます。 1つの方法で両方の方法を使用しても、マークが示唆するように、あまりにも多くの遅延時間を引き起こすようです。
  • 2つの配列を比較すると、15000(行)×150(列)= 2,250,000のセルを繰り返すことを意味するので、私が作業しているファイルではかなり遅くなるようです。
  • 私は "マクロを介したすべての変更worksheet_changeイベントは発生しません。

だから、基本的に私が遭遇してきたすべてのオプションを排除していること。私は考えることができる唯一の他の選択肢はただ一つのアレイ、使用していていますコードが実行されているときにセル/位置とその場所のエラーを記録し、その後、サブシートが完成した後に新しいシートに配列全体をダンプします。だから、

、私の質問のために、今すぐ

上記の事実と研究のすべてを与えられた:変更を記録し、どのような(必要に応じて表示する私の状況の中で最も効率的な方法だろう何

  • - 注)私のマクロが完了した後にファイルに変更が加えられましたか?私がそれを列挙したかどうかにかかわらず、この状況に最も適していると思われる方法を自由に共有してください。
  • 提案された方法を実装する方法の簡単なサンプルコードを提供できますか?
+0

、あなたの質問を絞り込むあなたのサンプルコードが含まれており、問題のある部分を強調してください。よろしくお願いします。 –

+3

これがどのように細く絞られるのか分かりません。私は非常に詳細な説明をしました。私はリンクに含まれているコード以外のサンプルコードを持っていませんが、それがあなたを幸せにするなら、それらを直接ポストに含めるでしょう。私は状況をどのように処理するかについてのアドバイスを探していますが、誰かが私のためにコードを書く必要はありません。私はこれが "*コード作成サービス*"ではないことを知っています。私は規則を知っている。 – CaffeinatedCoder

+0

あなたの投稿は、いくつかのディスカッションフォーラムに適しています。よろしくお願いします。 –

答えて

0

ここで私は一緒に行くことに決めました。このメソッドを使用して、変更を書き留めて、必要な変数を渡すたびにサブを呼び出します。この場合、Cell,Reason,Status。次に呼び出されたサブは、公開Arrayの最後に格納されます。この場合はChangeLogです。すべての変更を記録し終えたら、PrintLogサブフォルダに変更のリストを吐出して、新しいシートに書き換えます。変更ログ。私が加えたすっきりした追加は、あらかじめ作られた式で、配列の中に値を保存しながら生成したものです。配列がワークシートに貼り付けられると、セル参照は既にクリック可能なリンクになっているので、他のワークシート上のアドレスに移動させることができます。

Public ChangeLog() As String 

Sub Test() 
    Log ActiveSheet.Range("A2"), "Test1", "Changed" 
    Log ActiveSheet.Range("B2"), "Test2", "Needs Attention" 
    Log ActiveSheet.Range("C2"), "Test3", "Changed" 
    PrintLog 
End Sub 

Sub Log(Cell As Range, Reason As String, Optional Status As String) 
    On Error Resume Next 
    If (Not Not ChangeLog) = 0 Then 
     ReDim ChangeLog(0 To 2, 0 To 1) 
     ChangeLog(0, 0) = "Cells": ChangeLog(1, 0) = "Changes Made": ChangeLog(2, 0) = "Status" 
     ChangeLog(0, 1) = "=Hyperlink(" & """#'" & ActiveSheet.Name & "'!" & Cell.Address(False, False) & """,""" & Cell.Address(False, False) & """)" 
     ChangeLog(1, 1) = Reason 
     ChangeLog(2, 1) = Status 
    Else 
     ReDim Preserve ChangeLog(0 To 2, 0 To UBound(ChangeLog, 2) + 1) 
     ChangeLog(0, UBound(ChangeLog, 2)) = "=Hyperlink(" & """#'" & ActiveSheet.Name & "'!" & Cell.Address(False, False) & """,""" & Cell.Address(False, False) & """)" 
     ChangeLog(1, UBound(ChangeLog, 2)) = Reason 
     ChangeLog(2, UBound(ChangeLog, 2)) = Status 
    End If 
    On Error GoTo 0 
End Sub 

Sub PrintLog() 
    Dim currentSheet As Integer: currentSheet = ActiveSheet.Index 
    For s = 1 To ActiveWorkbook.Worksheets.Count 
     If Worksheets(s).Name = "Change Log" Then 
      Application.DisplayAlerts = False 
      Worksheets(s).Delete 
      Application.DisplayAlerts = True 
      Exit For 
     End If 
    Next 
    Dim WS As Worksheet: Set WS = Sheets.Add(After:=Worksheets(ActiveSheet.Index)) 
    WS.Name = "Change Log" 
    WS.Tab.Color = vbYellow 
    WS.Range("A1").Resize(UBound(ChangeLog, 2) + 1, 3) = WorksheetFunction.Transpose(ChangeLog) 
    Erase ChangeLog 
    Worksheets(currentSheet).Activate 
End Sub 

変更ログシートプレビュー:
Change Log

関連する問題