Page 1 of 1

รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Wed Dec 07, 2011 3:00 pm
by niwat2811
รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox คือต้องการให้ Sheet 2 บันทึกข้อมูลจาก Sheet1 ตามข้อมูลที่เรา CheckBox แล้วเรียงข้อมูลต่อกันลงมาเรื่อย
พร้อมทั้งเมื่อกดปุ่ม Clear Checkbox แล้วข้อมูลที่ Sheet 2 ไม่หายไปครับ รบกวนท่านอาจารย์ช่วยชี้แนะด้วยครับ

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Wed Dec 07, 2011 5:01 pm
by bank9597
:D ยังไม่มีเวลาดูให้เลย แต่เท่าที่ดูนั้น วิธีการดังกล่าวยังไม่ถูกต้องเพราะยังมีการ Count เพื่อให้ข้อมูลลงไปบันทึกต่อๆกันไปครับ

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Wed Dec 07, 2011 5:09 pm
by niwat2811
ครับที่ต้องการก็คือ ให้ CheckBox ข้อมูลที่ Sheet1 เมื่อเสร็จ 1 รายแล้วให้ไปเรียงต่อกันที่ Sheet2 ที่แถว Row2 แล้วก็กลับมาที่ Sheet1 แล้วก็ CheckBox ข้อมูลรายต่อไปโดยให้ข้อมูลไปต่อกันที่ Sheet2 แถว Row 3 ไปเรื่อย ๆ ครับ

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Wed Dec 07, 2011 6:43 pm
by snasui
:D ใน Sheet1 ไม่ใช่ CheckBox ครับ เป็น Object ประเภทรูปภาพ ไม่ได้เป็น Form Control หรือ ActiveX Control ที่จะนำไปเขียน Code ตามที่เขียนมาได้

การสร้าง CheckBox ควรเข้าไปที่เมนู Developer > Insert > ในหมวด Form Control เลือก CheckBox แล้วนำมาวาดใน Worksheet ตามตำแหน่งที่ต้องการ ลองแนบไฟล์มาใหม่ครับ

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Wed Dec 07, 2011 9:26 pm
by niwat2811
อาจารย์ครับได้ทำการแก้ไขไฟล์มาให้ใหม่แล้วครับ รบกวนช่วยชี้แนะให้ด้วยนะครับ ขอบคุณมากครับ

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Wed Dec 07, 2011 10:16 pm
by snasui
:D ลองตาม Code ด้านล่างครับ

Code: Select all

Sub SaveData()
    Dim rs As Range, rsAll As Range
    Dim rt As Range, i As Integer
    Set rsAll = Sheets("Sheet1").Range("D2:D10")
    Set rt = Sheets("Sheet2").Range("A" & Rows.Count) _
        .End(xlUp).Offset(1, 0)
    rt = Sheets("Sheet1").Range("A1")
    For Each rs In rsAll
        i = i + 1
        rt.Offset(0, i) = IIf(rs, 1, 0) 'Or rt.offset(0,i) = abs(rs)
    Next rs
End Sub

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Wed Dec 07, 2011 10:35 pm
by niwat2811
อาจารย์ครับรบกวนเรียนถามความหมายของ Code นี้หน่อยนะครับ เพื่อความเข้าใจเพิ่มขึ้น ขอบพระคุณมากครับ
For Each rs In rsAll
i = i + 1
rt.Offset(0, i) = IIf(rs, 1, 0) 'Or rt.offset(0,i) = abs(rs)
Next rs

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Wed Dec 07, 2011 10:55 pm
by snasui
เป็นการวน Loop โดยใช้ For Each Next ครับ ลองทำความเข้าใจตามด้านล่างครับ

จาก Code ที่ถามมาแปลได้ว่า ให้ดูที่ Range rsAll ไปทีละตัว โดยแต่ละตัวที่ว่านี้คือ rs ทุกครั้งที่เข้าถึง rs ก็ให้เพิ่มค่าตัวแปร i ไปทีละ 1 และกำหนดให้ ค่าที่ถัดจากตัวแปร rt ไปด้านขวาตามค่า i หมายถึงจะถัดไปเท่าใดก็ขึ้นอยู่กับค่า i ว่ามีค่าเท่าใด

โดยค่าที่ถัดไปทีว่านั้นให้ค่ามีค่าเท่ากับผลลัพธ์ทีได้จากสูตร Iff(rs,1,0) โดยสูตรนี้หมายความถึง หาก rs มีค่าเป็น True ก็ให้มีค่าเป็น 1 ถ้าเป็น False ก็มีค่าเป็น 0

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Wed Dec 14, 2011 10:17 am
by niwat2811
รู้สึกเหมือนว่า Web มัน RollBack กลับไปครับอาจารย์ อาจารย์ครับจากที่ได้ทดลองนำ Code ไปประยุกต์ใช้ดูแล้ว ผู้ใช้หลายคนบอกว่าทำงานได้เร็วขึ้นมาก แต่ติดปัญหาอีกนิดนึงตรงที่เราไม่สามารถแก้ไขรายชื่อที่คีย์ผิดพลาดไปแล้วได้ เช่น ที่ Sheet2 แถว A2 ลูกค้าชื่อนาย A (ซึ่งจริง ๆ แล้วลูกค้าชื่อนาย K) ถ้าเราต้องการแก้ไขข้อมูลเราก็ไปค้นหาจาก Sheet1 ที่เซลล์ H1 พอค้นหาชื่อนาย A ขึ้นมาแล้วทำการแก้ไขให้เป็นนาย K เสร็จแล้วทำการ Save ปรากฎว่าระบบไม่ยอมไป Save ทับแทนที่นาย A กลับไป Save เพิ่มเป็นชื่อนาย K ในแถวที่ 7 ของ Sheet2 ครับ คือจริง ๆ แล้วอยากให้ไปเซพแทนที่ นาย A ซึ่งเป็นแถวที่ 2 ครับ รบกวนท่านอาจารย์ช่วยชี้แนะปรับ Code ให้ด้วยครับ ขอบพระคุณเป็นอย่างสูงครับ

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Wed Dec 14, 2011 3:42 pm
by snasui
:D ผมตอบเป็นหลักการให้แล้วกันนะครับ

การทำเช่นนั้นจะต้องหาว่าค่าที่ Search ได้มานั้นอยู่ในลำดับที่เท่าไรของฐานข้อมูล แล้วเก็บค่านั้นไว้เพื่อที่เวลา Edit จะได้กลับไปแก้ที่บรรทัดเดิม ลองปรับปรุง Code มาดูก่อนครับ ผมดูในไฟล์แล้วยังเป็น Code เดิม

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Thu Dec 15, 2011 8:55 pm
by niwat2811
อาจารย์ครับ ลองเพิ่ม Code แล้ว ปรากฏว่าไปแก้ไขชื่อที่ Sheet2 ทุกแถวเลยครับ รบกวนท่านอาจารย์ช่วยดูให้หน่อยนะครับ

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Thu Dec 15, 2011 9:10 pm
by snasui
:D ลองปรับ Code เป็นตามด้านล่าง โดยประกาศตัวแปร lng ไว้บนสุดเพื่อใช้กับ Procedure FindData และ Procedure EditData ตามด้านล่างครับ

Code: Select all

Dim lng As Long

Sub SaveData()
    Dim rs As Range, rsAll As Range
    Dim rt As Range, i As Integer
    Dim j As Integer
    Set rsAll = Sheets("Sheet1").Range("D2:D10")
    Set rt = Sheets("Sheet2").Range("A" & Rows.Count) _
        .End(xlUp).Offset(1, 0)
    If Application.CountIf(Sheets("Sheet2").Range("A:A"), Sheets("Sheet1").Range("A1")) > 0 Then
        j = MsgBox("คุณกำลังบันทึกข้อมูลซ้ำ คุณต้องการแก้ไขข้อมูลใช่หรือไม่?", vbYesNo)
        If j = vbYes Then
            Call EditData
            Exit Sub
        Else
            Exit Sub
        End If
    End If
    rt = Sheets("Sheet1").Range("A1")
    For Each rs In rsAll
        i = i + 1
        rt.Offset(0, i) = IIf(rs, 1, 0)
    Next rs
    MsgBox "บันทึกข้อมูลเรียบร้อยแล้ว"
End Sub

Sub ClearCheckbox()
    Range("A1,D:D,H1").ClearContents
End Sub

Sub FindData()
    Dim lCount As Long
    Dim rsSearch As Range, r As Range
    Dim rt As Range, rs As Range
    With Sheets("Sheet1")
        Set rsSearch = .Range("H1")
        Set rs = .Range("D2:D10")
    End With
    lCount = Application.CountIf( _
        Sheets("Sheet2").Range("A:A"), rsSearch)
    If lCount > 0 Then
        With Sheets("Sheet2")
        lng = Application.Match(rsSearch, _
            Sheets("Sheet2").Range("A:A"), 0)
        End With
    Else
        MsgBox "Can't find your data."
        Exit Sub
    End If
    Set rt = Sheets("Sheet2").Range("B" & lng).Resize(1, 9)
    rt.Copy
    Sheets("Sheet1").Range("D2").PasteSpecial xlPasteValues, _
        Transpose:=True
    Sheets("Sheet1").Range("A1") = rt.End(xlToLeft)
    For Each r In rs
        r = IIf(r = 1, True, False)
    Next r
    Application.CutCopyMode = False
End Sub
Sub EditData()
    Dim rs As Range, rsAll As Range
    Dim rt As Range, i As Integer
    Set rsAll = Sheets("Sheet1").Range("D2:D10")
    Set rt = Sheets("Sheet2").Range("A" & lng)
    rt = Sheets("Sheet1").Range("A1")
    For Each rs In rsAll
        i = i + 1
        rt.Offset(0, i) = IIf(rs, 1, 0)
    Next rs
    Range("A1,H1").ClearContents
    MsgBox "แก้ไขข้อมูลเรียบร้อยแล้ว"
End Sub

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Thu Dec 15, 2011 9:26 pm
by niwat2811
อาจารย์ครับลองนำ Code ด้านบนไปวางทับ Code ทั้งหมดแล้วครับ ผลปรากฎว่าไปบันทึกเพิ่มที่ Sheet 2 แถวสุดท้าย ซึ่งจริง ๆ แล้วต้องการให้บันทึกแทนแถวที่เราค้นหาครับ

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Thu Dec 15, 2011 9:33 pm
by snasui
:? มีวิธีการทำงานอย่างไรถึงบันทึกแถวสุดท้ายครับ ปกติการจะแก้ไขต้อง Search ขึ้นมาก่อนหรือไม่ครับ

สำหรับ Code ที่ปรับให้ไป จะมีการ Search ขึ้นมาก่อน โปรแกรมจะเก็บค่าบรรทัดของข้อมูลไว้ และเมื่อคลิก Edit ก็จะเก็บลงไปยังบรรทัดเดิม

ช่วยเขียนอธิบายลำดับขั้นตอนของการการทำงาน และระบุว่าเกิดปัญหาในขั้นตอนใดด้วยทุกครั้งเพื่อจะได้ปรับปรุงหรือแนะนำได้ถูกต้องครับ

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Thu Dec 15, 2011 9:42 pm
by niwat2811
ครับ ผมต้องขอโทษท่านอาจารย์ด้วยครับที่ไม่ได้ทดสอบให้เรียบร้อยก่อน ขั้นตอนเมื่อก่อนหน้านี้ผมทำการแก้ไขแล้วไปกดปุ่ม Save แทนที่จะกดปุ่ม Edit ต้องขอโทษท่านอาจารย์และขอบพระคุณเป็นอย่างสูงที่ช่วยชี้แนะครับ ขอบคุณมากครับ

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Fri Dec 16, 2011 12:26 pm
by niwat2811
ได้ลองนำ Code มาประยุกต์ใช้ในงานแล้วยังพบปัญหาคือ ถ้าเรียกข้อมูลขึ้นมาแก้ไขแล้วต้องการให้บันทึกกลับไปที่เดิมเกิด Error ขึ้นมาครับ รบกวนท่านอาจารย์ช่วยดูให้หน่อยนะครับ

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Fri Dec 16, 2011 12:58 pm
by snasui
:D ตรง Sub FindData() ให้ลบ Dim lng as Long ออกไปครับ เนื่องจากประกาศไว้บนสุดแล้ว จากนั้นลอง Run Code ใหม่ดูอีกรอบ สังเกต Code ที่ผมเขียนไปให้ในความเห็นก่อนนี้จะเห็นว่าผมลบออกให้แล้ว

Re: รบกวนเรื่องการบันทึกข้อมูลและการ Clear Checkbox

Posted: Sat Dec 17, 2011 12:24 pm
by niwat2811
ครับ ทำตามคำแนะนำแล้วปรากฎว่า สำเร็จได้ด้วยดีทุกขั้นตอน ขอบคุณสำหรับคำแนะนำต่าง ๆ ที่กรุณาตอบให้ ขอบพระคุณเป็นอย่างสูงเลยครับ