Page 1 of 1

VBA ย้อนกระบวนการเพื่อกู้คืนข้อมูลที่บด้วยมาโคร

Posted: Sun Apr 05, 2015 2:10 pm
by DhitiBank
สวัสดีอาจารย์และเพื่อนๆครับ

ขอสอบถามว่า หากข้อมูลในชีทถูกลบด้วยมาโคร นอกจากการปิดไฟล์โดยไม่เซฟแล้วจะมีวิธีอื่นเพื่อเอาข้อมูลคืนมาไหมครับ ลองกด undo ก็เงียบกริบ :cry: เผลอไปกดเซฟเสียแล้วหลังรันมาโคร

ขอบคุณครับ

Re: VBA ย้อนกระบวนการเพื่อกู้คืนข้อมูลที่บด้วยมาโคร

Posted: Sun Apr 05, 2015 2:39 pm
by snasui
:D ข้อควรระมัดระวังอย่างหนึ่งของการใช้ Macro ลบข้อมูลครับ การ Undo สามารถทำได้แต่ไม่ง่ายเหมือนใน Worksheet ลองอ่านที่ John Walkenbach เขียนไว้ที่นี่เป็นตัวอย่างครับ http://www.j-walk.com/ss/excel/tips/tip23.htm

Re: VBA ย้อนกระบวนการเพื่อกู้คืนข้อมูลที่บด้วยมาโคร

Posted: Sun Apr 05, 2015 2:48 pm
by DhitiBank
snasui wrote::D ข้อควรระมัดระวังอย่างหนึ่งของการใช้ Macro ลบข้อมูลครับ การ Undo สามารถทำได้แต่ไม่ง่ายเหมือนใน Worksheet ลองอ่านที่ John Walkenbach เขียนไว้ที่นี่เป็นตัวอย่างครับ http://www.j-walk.com/ss/excel/tips/tip23.htm
แค่พอมีวิธีก็โล่งขึ้นมากแล้วครับ เดี๋ยวลองอ่านดูครับ

ขอบคุณอีกครั้งครับ

Re: VBA ย้อนกระบวนการเพื่อกู้คืนข้อมูลที่บด้วยมาโคร

Posted: Sun Apr 05, 2015 3:16 pm
by DhitiBank
เท่าที่พยายามทำความเข้าใจ คือต้องเขียนคำสั่งเพื่อเก็บค่าในเซลล์และที่อยู่ของแต่ละค่าเอาไว้ก่อนใช่ไหมครับ หากไม่ทำเช่นนี้ก็หมดสิทธิ์ ถ้าอย่างนั้นก็... พิมพ์ใหม่ครับ :lol: :cry:

Code: Select all

'Custom data type for undoing
    Type SaveRange
        Val As Variant
        Addr As String
    End Type
    
'   Stores info about current selection
    Public OldWorkbook As Workbook
    Public OldSheet As Worksheet
    Public OldSelection() As SaveRange


Sub ZeroRange()
'   Inserts zero into all selected cells

'   Abort if a range isn't selected
    If TypeName(Selection) <> "Range" Then Exit Sub
    
'   The next block of statements
'   Save the current values for undoing
    ReDim OldSelection(Selection.Count)
    Set OldWorkbook = ActiveWorkbook
    Set OldSheet = ActiveSheet
    i = 0
    For Each cell In Selection
        i = i + 1
        OldSelection(i).Addr = cell.Address
        OldSelection(i).Val = cell.Formula
    Next cell
            
'   Insert 0 into current selection
    Application.ScreenUpdating = False
    Selection.Value = 0
    
'   Specify the Undo Sub
    Application.OnUndo "Undo the ZeroRange macro", "UndoZero"
End Sub


Sub UndoZero()
'   Undoes the effect of the ZeroRange sub
    
'   Tell user if a problem occurs
    On Error GoTo Problem

    Application.ScreenUpdating = False
    
'   Make sure the correct workbook and sheet are active
    OldWorkbook.Activate
    OldSheet.Activate
    
'   Restore the saved information
    For i = 1 To UBound(OldSelection)
        Range(OldSelection(i).Addr).Formula = OldSelection(i).Val
    Next i
    Exit Sub

'   Error handler
Problem:
    MsgBox "Can't undo"
End Sub
จากคำสั่งด้านบนมีไม่เข้าใจหลายแห่ง ขอสอบถามแค่ 3 คำสั่งก่อนครับ
1. Type ... ต่างกับ Dim หรือ Public ยังไงครับ
2. ReDim (เหมือนเคยถามแล้ว แต่ลืมแล้ว ขอถามอีกรอบครับ)
3. Application.OnUndo ใน ZeroRange ใช้ทำอะไรครับ
ขอบคุณครับ

Re: VBA ย้อนกระบวนการเพื่อกู้คืนข้อมูลที่บด้วยมาโคร

Posted: Sun Apr 05, 2015 3:39 pm
by snasui
:D Type เป็นการสร้าง Data Type ขึ้นมาเองเพื่อความสะดวกในการใช้งานของผู้เขียนเอง Data Type เราสามารถสร้างขึ้นมาเองได้ครับ ทบทวน Data Type ได้ที่ Link นี้ครับ https://msdn.microsoft.com/en-us/librar ... 51528.aspx

Redim คือ Redimension ของ Array เป็นการปรับขอบเขตของ Array ที่เป็นแบบ Dynamic ให้เพิ่มหรือลดตามที่ต้องการใช้งาน

Application.OnUndo... จะเป็นตัวกำหนดว่าให้ใช้ Undo กับ Sub Procedure ใด การจะ Undo ได้มันจะมีลำดับของการเก็บค่าเดิมเอาไว้ก่อนดังที่เข้าใจ แล้ว ซึ่งจะเก็บไว้ในตัวแปรที่เป็น Public (ตัวแปรที่สามารถเรียกจาก Module อื่น ๆ ได้) เพื่อสามารถนำมาใช้ในภายหลัง

จาก Code นั้นสามารถทดสอบการ Run ตามลำดับนี้
  1. คลุมพื้นที่ใด ๆ ซึ่งควรจะมีข้อมูลทดสอบเอาไว้ด้วย
  2. ZeroRange เพื่อเก็บค่าเดิมเอาไว้ในตัวแปร OldSelection ซึ่งเป็นตัวแปรระดับ Public และเติม 0 เข้าไปแทนค่าในข้อ 1
  3. UndoZero นำค่าในข้อ 1 กลับคืนมา

Re: VBA ย้อนกระบวนการเพื่อกู้คืนข้อมูลที่บด้วยมาโคร

Posted: Sun Apr 05, 2015 4:05 pm
by DhitiBank
ขอบคุณมากครับ จะลองศึกษาดูครับ