:D snasui.com ยินดีต้อนรับ :D
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย :thup: สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ :arrow: ระบุ Version ของ Excel
:!: โปรดทราบ :!:
  1. กรุณาอ่านกฎการใช้บอร์ด (Forum rules) ในตำแหน่งด้านบนของแต่ละบอร์ด
  2. การสมัครสมาชิก การ Login การกู้คืนรหัสผ่าน
    1. สมัครสมาชิกดูขั้นตอนได้ที่ :arrow: สมัครสมาชิก
    2. Login เข้าระบบโดยคลิกปุ่ม Login ตรงมุมขวาบนของหน้านี้ :roll:
    3. การ Login ผ่าน Facebook ดูวิธีที่ :arrow: Login ผ่าน Facebook
    4. ลืมรหัสผ่านสามารถรับรหัสใหม่ได้ที่ :arrow: Reset รหัสผ่าน
  3. มีปัญหาการใช้งาน แจ้งผู้ดูแลระบบได้ที่ :arrow: ติดต่อผู้ดูแลระบบ
  4. กำหนดการตั้งค่าส่วนตัว เช่นตั้งค่าภาษาเป็นไทยหรืออังกฤษดูได้ที่ :arrow: ตั้งค่าส่วนตัว
  5. การตั้งและตอบกระทู้ดูได้ที่ :arrow: วิธีการตั้งและตอบกระทู้
  6. การจัดรูปแบบตัวอักษรด้วย bbcode ในช่องแสดงความคิดเห็นดูได้ที่ :arrow: จัดรูปแบบตัวอักษร
  7. กำหนดขนาดตัวอักษรใน Browser ดูได้ที่ :arrow: กำหนดขนาดตัวอักษรใน Browser
🪷 คำแสดงเจตนา
ขอผลแห่งการให้ความรู้นี้ จงกลับไปยังผู้ที่เป็นเจ้าของเดิม แม้ข้าพเจ้าจะไม่รู้จักท่านก็ตาม ขอให้แสงแห่งปัญญาที่ท่านเคยจุดไว้ ได้กลับไปเติมเต็มชีวิตของท่านอีกครั้ง และขอให้เจตนาของข้าพเจ้าเป็นการคืนความดีอย่างสงบ

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

ฟอรัมถาม-ตอบปัญหาการใช้งาน Macro และ VBA
Forum rules
  1. ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
  2. ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
  3. กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
  4. กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
  5. กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
  6. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
User avatar
DhitiBank
Gold
Gold
Posts: 1676
Joined: Mon Oct 15, 2012 12:07 am

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

#1

Post by DhitiBank »

สวัสดีอาจารย์และเพื่อนๆครับ

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

ขอบคุณครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 31191
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

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

#2

Post by snasui »

:D ข้อควรระมัดระวังอย่างหนึ่งของการใช้ Macro ลบข้อมูลครับ การ Undo สามารถทำได้แต่ไม่ง่ายเหมือนใน Worksheet ลองอ่านที่ John Walkenbach เขียนไว้ที่นี่เป็นตัวอย่างครับ http://www.j-walk.com/ss/excel/tips/tip23.htm
User avatar
DhitiBank
Gold
Gold
Posts: 1676
Joined: Mon Oct 15, 2012 12:07 am

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

#3

Post by DhitiBank »

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

ขอบคุณอีกครั้งครับ
User avatar
DhitiBank
Gold
Gold
Posts: 1676
Joined: Mon Oct 15, 2012 12:07 am

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

#4

Post 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 ใช้ทำอะไรครับ
ขอบคุณครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 31191
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

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

#5

Post 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 กลับคืนมา
User avatar
DhitiBank
Gold
Gold
Posts: 1676
Joined: Mon Oct 15, 2012 12:07 am

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

#6

Post by DhitiBank »

ขอบคุณมากครับ จะลองศึกษาดูครับ
Post Reply