2016-03-26 24 views
2

Bazı arka plan:hızlı yolu

Ben 17 Alt Rutinler yürütür bir Excel Add-In ve

en kolay, en verimli ve hızlı yolu olacağını merak ediyorum
  1. Tutanak özgü makro
  2. Display tarafından yapılan değişiklikler (yeni bir elektronik tabloda) tüm değişikliklerin bir listesi ve neden değiştirdiğini (veya bayraklı/vurgulanan) her bir hücre
  3. her err hücre adresini sağlayın ya da ben şimdiye kadar topladık Ne (aynı çalışma kitabındaki) Başka bir çalışma sayfasındaki belirli bir hücreye kullanıcı alacak tıklanabilir bağlantıda

olarak:

Ben üzerinde okudum Bunu başarmak için birkaç yöntem, özellikle here, here, here ve en önemlisi here. Bu önceki tüm subs tamamladıktan sonra, ikinci bir diziye UsedRange damping sonra, tüm subs çalışan bir diziye UsedRange boşaltılması gibi

  • olarak yöntemler önerir. İki diziyi karşılaştırın ve bu şekilde farklılıkları bulun.
  • Değişiklikleri günlüğe kaydetmek için worksheet_change olayından yararlanın.
  • Marktastic site için son bağlantı, önceki iki yöntemi birleştirerek en ikna edici yöntem sağlar. Bununla birlikte, worksheet_change olay yangınları her seferinde diziyi kontrol etme yöntemiyle bile .06 saniye sürüyor, ki bu da çok fazla yük ekleyecektir. Ben yüz

Birkaç belirli sorunlar şunlardır:

  • büyük dosyalar ile başa çıkmak benim denizaltılar bazıları olması gerekmez değişiklik yapmak
  • (15000 + satır, 150 sütun) Bazı hücrelerde yalnızca yeniden düzenleme değerleri gibi, aksi halde değiştirilmediğine dikkat edin.
  • Makronum hızlı çalışacak şekilde oluşturuldu (< 1 dakika) ve büyük dosyaları taramasını tamamladıktan sonra, bununkullanarak ortadan kaldırılacağını tahmin ediyorumolay ve aynı zamanda her hata uygun şekilde ele alındıktan sonra hemen ayrı çalışma sayfasına yazıyor. Mark'ın işaret ettiği gibi her iki yöntemi de kullanmak, çok fazla gecikmeye neden olacak gibi görünüyor. İki dizi karşılaştırılması
  • ben çalışıyorum gibi 15000 (satır) yineleme anlamına gelecektir olarak da, büyük olarak dosyalar için oldukça yavaş olacağını görünür ben "m yapma yana 150 (sütunlar) = 2250000 hücrelerini
  • x worksheet_change olay macro yoluyla tüm değişiklikleri patlamaz.

Yani, temelde ben karşılaşanlar tüm seçenekleri ortadan kaldırır. I düşünebilirsiniz diğer tek seçenek sadece bir dizi kullanımı var Bu kod, hücrenin/konumun ve hatanın yürütüldüğü konumdaki hatayı kaydetmek ve daha sonra alt dizinin tamamlanmasından sonra dizinin tamamını yeni kağıda dökmek için kullanılır. Bu gerçekten benim en iyi seçeneğim olur mu?

Yani, benim soru için, Şimdi

yukarıdaki gerçeklerin tüm ve araştırmaları verilen:

  • değişiklikleri kaydetmek ve göstermek için durum en etkili yolu ne olurdu ne gerekiyorsa (-to-not) benim makro tamamlandıktan sonra dosyaya değişiklikler yapıldı? Onu listeledim ya da almasaydım, bu duruma en uygun olacağını düşündüğünüz bir yöntemi paylaşmaktan çekinmeyin.
  • Önerilen yöntemin nasıl uygulanacağına dair basit bir örnek kod sağlayabilir misiniz?
+0

, sorunuzu daraltmak için örnek kod içerir ve sorunlu bir parçasını vurgulamak ediniz. Saygılarımla, –

+3

Bunun nasıl daha daraltılacağını göremiyorum. Çok detaylı bir açıklama yaptım. Bağlantılarda bulunan kodlardan başka örnek kodum yok, ancak eğer sizi mutlu ederse doğrudan onları yazıya ekleyeceğim. Ben sadece durumun nasıl ele alınacağı konusunda tavsiyede bulunuyorum, benim için kod yazacak birine ihtiyacım yok. Bunun bir "* kod yazma hizmeti" olmadığını biliyorum. Kuralların farkındayım. – CaffeinatedCoder

+0

Yayınınız, bazı tartışma forumları için daha uygundur, SO değil. Saygılarımızla, –

cevap

0

İşte gitmeye karar verdiğim şey. Bu yöntemi kullanarak, her defasında bir değişiklik kaydetmek ve kaydedilmem gereken gerekli değişkenleri iletmek için bir alt arama yapıyorum. Bu durumda, Cell, Reason, Status. Sonra çağrılan alt bir halka Array, bu durumda ChangeLog sonunda depolar. Ihtiyacım olan tüm değişiklikleri kaydetmeyi bitirdikten sonra PrintLog altını değiştirip yeni bir sayfaya değişiklik listesini çağırıyorum, Kayıt Günlüğü'u yeniden adlandırıyorum. Eklediğim düzgün bir ek, dizinin içindeki değerleri saklarken önceden üretilmiş HYPERLINK formülünü oluşturuyordu. Dizi çalışma sayfasına yapıştırıldıktan sonra hücre referansları, kullanıcıyı diğer çalışma sayfasındaki adrese getiren tıklanabilir bağlantılardır.

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 

Değişiklik Günlüğü Sac Önizleme:
Change Log