Page 1 of 2

การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Wed Oct 12, 2011 6:18 pm
by bank9597
:D ยอมรับว่ายังไม่รู้เรื่องโค๊ดอะไรมากมาย ทำไปเรื่อยๆ เดาบ้างไรบ้าง สุดท้ายก็ได้ผลที่ไม่ค่อยน่าประทับใจเท่าที่ควร จึงต้องรบกวนอาจารย์อีก :mrgreen:
ผมได้ลองศึกษาตามเว็บดังกล่าว ทดลองทำเองตามตัวอย่างไม่มีปัญหาอะไร เลยนำมาปรับใช้กับงานตัวเอง แต่ปรากฏว่าไม่เป็นไปตามที่คาดหวัง พยายามหาวิธีแก้แล้วก็ยังไม่ได้อยู่ดี ประกอบกับความรู้พื้นฐานเรื่องโค๊ดก็อ่อนมากด้วย รบกวนอาจารย์ด้วยครับ

ในชีท Update ผมได้สร้างฟอร์มเพื่อดึงข้อมูลจากชีท Database มาแสดง พร้อมทั้งกำหนดให้สามารถแก้ไขข้อมูลและลบข้อมูลได้ แต่ปัญหาคือ เมื่อดึงข้อมูลมาแล้วยังมีส่วนที่ผิดพลาดอยู่ เช่นคอลัมน์ไม่ตรงกับที่กำหนด และมี Error รวมถึงการทำอัพเดทข้อมูลที่ยังไม่สามารถทำได้
ทั้งหมดนี้รบกวนอาจารย์ช่วยดูครับ เบื้องต้นได้เขียนโค๊ด Update มาแล้ว แต่ยังใช้การไม่ได้ ส่วนโค๊ด Delete ยังไม่ได้เขียน เพราะคิดว่าหากแก้ปัญหาแรกได้ รู้สาเหตุของปัญหา ก็น่าจะทำขั้นต่อไปได้เอง (บ้าง) :D
ทดสอบ1.xlsm

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Wed Oct 12, 2011 8:22 pm
by snasui
:D ผมปรับ Code สำหรับการค้นหามาให้แล้วตามด้านล่างครับ

Code: Select all

Option Explicit
Option Base 1
Sub ShowData()
Dim a() As Variant, lng As Long
Dim r As Range, rAll As Range
Dim rt As Range, rl As Long
Application.EnableEvents = False
Application.ScreenUpdating = False
rl = Rows.Count
With Worksheets("Database")
    Set rAll = .Range("B4", .Range("B" & rl).End(xlUp))
End With
For Each r In rAll
    If r = Worksheets("Update").Range("K3") Then
        lng = lng + 1
        ReDim Preserve a(8, lng)
        a(8, lng) = lng
        a(1, lng) = r.Offset(0, 0)
        a(2, lng) = r.Offset(0, 1)
        a(3, lng) = r.Offset(0, 2)
        a(4, lng) = r.Offset(0, 3)
        a(5, lng) = r.Offset(0, 4)
        a(6, lng) = r.Offset(0, 5)
        a(7, lng) = r.Offset(0, 6)
    End If
Next r
If lng > 0 Then
    With Worksheets("Update")
        Set rt = .Range("A4", .Range("H" & lng - 1 + 4))
        .Range("A4", .Range("H" & rl)).ClearContents
        .Range("A4:H4").Copy
        rt.PasteSpecial xlPasteFormats
        rt = Application.Transpose(a)
        .Range("B4", .Range("B" & rl).End(xlUp)).NumberFormat = "00"
        .Range(.Range("B3").End(xlDown).Offset(1, 0), .Range("H" & rl)).Clear
    End With
Else
    MsgBox "Data not found."
End If
Application.EnableEvents = True
Application.ScreenUpdating = True
End Sub

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Wed Oct 12, 2011 8:43 pm
by bank9597
ขอบคุณครับ

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Wed Oct 12, 2011 10:31 pm
by bank9597
:flw: ผมได้นำเอาโค๊ดไปปรับใช้กับตัวโมเดลแล้ว ปรากฏว่าไม่มีปัญหาแล้วครับ

ตอนนี้ติดอยู่ที่ Update ข้อมูลไม่ได้ครับ ลองแก้ไขค่าแล้วบันทึกก็ไม่เปลี่ยนแปลง คาดว่าน่าจะไม่เข้าเรื่องการปรับค่าคอลัมน์ครับ

ผมแนบไฟล์ตัวโมเดลมาให้ครับ อยู่ในชีท Edit โมดูลที่ 6 ครับ

รบกวนด้วยครับ :D
Model.xlsm

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Wed Oct 12, 2011 10:59 pm
by snasui
:D อยากทราบว่าเงื่อนไขในการ Update และ Delete ให้ดูค่าใดในชีท Edit บ้างครับ

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Wed Oct 12, 2011 11:16 pm
by bank9597
:D ตอนนี้อยากให้อาจารย์ช่วยดูแค่การ Update ครับ ส่วนการ Delete ผมยังไม่ลองเขียนโค๊ดมาให้เลย

ส่วนค่าที่จะให้อาจารย์ช่วยดูคือ

Code: Select all

For Each rs In rsAll
    For i = rtAll.Count To 1 Step -1
    
        If rs = rtAll(i) And rs.Offset(0, 8) = rtAll(i).Offset(0, 8) _
        And rs.Offset(0, 4) = "Update" Then
            rs.Offset(0, 8).Resize(1, 8).Copy
            rtAll(i).Offset(0, 8).PasteSpecial xlPasteValues
        End If
ผมไม่รู้ว่าต้องวางค่าอย่างไรให้ถูกต้อง
ในความคิดผม โค๊ด

Code: Select all

If rs = rtAll(i) And rs.Offset(0, 8) = rtAll(i).Offset(0, 8) _
(0,8)คือจำนวนคอลัมน์จาก "B4" จนถึง "J4" ห่างกัน 8 คอลัมน์
ส่วน

Code: Select all

And rs.Offset(0, 4) = "Update" Then
อันนี้ผมไม่รู้ครับ

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Thu Oct 13, 2011 9:42 am
by snasui
:D ค่าที่ให้ดูหมายถึงว่าให้ดูว่าหากค่าในคอลัมน์ใดในชีท Edit ตรงกับค่าในคอลัมน์ใดของชีท DataStore แล้ว ให้นำข้อมูลไป Update ในชีท DataStore ซึ่งผมเข้าใจว่าน่าจะต้องตรงกันมากกว่าหนึ่งค่าถึงจะ Update และเมื่อระบุค่าได้แล้ว ค่อยมาปรับที่ Code ว่าต้องปรับกันอย่างไรครับ :P

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Thu Oct 13, 2011 10:17 am
by bank9597
:tt: จะพยายามอธิบายน่ะครับ ไม่รู้ว่าจะเข้าใจไหม

ในชีท Edit นั้น ค่าที่ผมต้องการแก้ไขแล้วอัพเดทไปยังชีท DataStore คือ ค่าในคอลัมน์ "B" ถึง "I" ซึ่งค่าดังกล่าวจะตรงกับคอลัมน์"B"ถึง"I" ในชีท DataStore ซึ่งมากกว่า 1 ค่า
จาก "B" ถึง "I" มีทั้งหมด 8 ค่าที่ต้องทำการอัพเดทครับ ยกตัวอย่างเช่น ต้องการแก้ไขจำนวนการสั่งซื้อสินค้า ราคาสินค้า เป็นต้น

ในชีท Edit คอลัมน์ "J" จะมีตัวเลือกระหว่าง Update,Delete เมื่อแก้ไขเส็จแล้วก็เลือกตัวเลือกดังกล่าวว่าจะ Update หรือ Delete
ส่วนในชีท DataStore คอลัมน์ "J","K","L" จะบันทึกวันที่ที่ทำการแก้ไขไว้ เช่นรหัส ตส/ปท/TUD/54/10/001 ถูกแก้ไขไปแล้ว 1 ครั้งในวันที่ 12/8/2011 วันที่นี้ก็จะถูกบันทึกในคอลัมน์ "๋J" ซึ่งบอกให้รู้ว่าแก้ไขครั้งที่ 1

พยายามอธิบายให้ชัดเจนแล้ว หากไม่เข้าใจยังไงต้องขอโทษด้วยครับ :)

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Thu Oct 13, 2011 10:31 am
by snasui
:D เข้าใจในสิ่งที่อธิบายมาครับ แต่ไม่ใช่สิ่งที่ผมต้องการทราบ เพราะทราบอยู่แล้วว่าต้องการนำข้อมูลจากที่ใดไป Update หรือ Delete ในที่ใด

สิ่งที่ต้องการทราบคือเงื่อนไขว่า จะต้องดูค่าในคอลัมน์ใดเพื่อตรวจสอบว่าข้อมูลต้นทางและปลายทางเป็นค่าเดียวกันแล้วค่อย Update หรือ Delete ค่านั้นในข้อมูลปลายทาง

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Thu Oct 13, 2011 10:54 am
by bank9597
สิ่งที่ต้องการทราบคือเงื่อนไขว่า จะต้องดูค่าในคอลัมน์ใดเพื่อตรวจสอบว่าข้อมูลต้นทางและปลายทางเป็นค่าเดียวกัน

:D ผมชักจะสับสนตัวเองแล้วครับ ไม่รู้ว่าโง่ หรือว่าขาดความรู้พื้นฐานหรือเปล่า อิอิ จากเงื่อนไขที่อาจารย์ถามถึง ความเข้าใจของผมน่าจะเป็นค่าที่อยู่ใน "D2" ซึ่งเป็นรหัส PO ที่ใช้เป็นค่าเปรียบเทียบในชีท DataStore คอลัมน์ "B" แล้วดึงข้อมูลมาแสดง ฉนั้นเงื่อนไขที่อาจารย์คือ รหัส Po ที่อยู่ในคอลัมน์ "B" ชีทEdit ครับ

ไม่รู้จะใช่หรือไม่ แต่พยายามเต็มที่แล้วครับ

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Thu Oct 13, 2011 11:32 am
by snasui
:D ถ้าเช่นนั้นสรุปได้ว่า เงื่อนไขคือให้ดูที่ PO เดียวกัน และหากมีคำว่า Update ก็ให้นำค่าไปวางทับที่เดิม หากมีคำว่า Delete ก็ให้ลบบรรทัดนั้นทิ้ง ถูกต้องไหมครับ

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Thu Oct 13, 2011 12:05 pm
by bank9597
:mrgreen: ถูกต้องครับอาจารย์ ให้ยึดที่ใบPo เป็นหลักครับ อิอิ


เสริมอีกนิดครับ พอดีว่าในชีทEdit คอลัมน์ "C","E","G","F" ผมจะตั้งค่า Validation - Definition คือจะเป็น DropDown ให้เลือกรายการเวลาแก้ไข
แต่ทีนี้ เวลาเราดึงข้อมูลมาแสดง ค่าValidation จะหายไป จะมีก็แต่บรรทัดบนสุดครับ ถ้าเป็นแบบนี้ก็จะทำให้แก้ไขยากมาก เช่น ต้องการแก้ไขรายการสินค้า ก็ต้องพิมพ์ชื่อสินค้าให้ตรงกับในฐานข้อมูลรายการสินค้า หากไม่ตรงกันก็ไม่สามารถจะคำนวนค่าอะไรได้ เนื่องจากชื่อไม่ตรงกับรหัสใด อีกทั้งรายการสินค้านั้นก็เยอะมากๆ
ตรงนี้เราจะแก้อย่างไรได้บ้างครับ

แต่ก่อนจะใช้โค๊ดนี้ในการดึงข้อมูลครับ :ard:

Code: Select all

Sub Button2_Click()
Dim rFind As Range, rDataAll As Range
Dim r As Range, rTarget As Range
Set rFind = Sheets("Edit").Range("D2")
If Sheets("Edit").Range("D2") = "" Then Exit Sub
With Sheets("DataStore")
    Set rDataAll = .Range("B2", .Range("B" & Rows.Count).End(xlUp))
    If .Columns("b:b").Find(rFind, LookIn:=xlValues) Is Nothing Then
        MsgBox "äÁèÁÕàÅ¢·Õè¹Õé!"
        Exit Sub
    End If
End With
For Each r In rDataAll
    If r = rFind Then
        Set rTarget = Sheets("Edit").Range("C" & Rows.Count).End(xlUp) _
            .Offset(1, 0)
        r.Resize(1, 8).Copy
        rTarget.PasteSpecial xlPasteValues
        rTarget.Offset(0, -1) = Date
    End If
Next r
Application.CutCopyMode = False
MsgBox "Get data has finished."
End Sub
ไม่มีปัญหาอะไร ค่า Validation ไม่ได้ถูกลบเวลาดึงข้อมูลมา เพียงแต่ข้อมูลจะถูกดึงมาต่อกันกันเรื่อยๆ ซึ่งต่างกับวิธีที่ใช้อยู่ ซึ่งจะดึงข้อมูลใหม่มาแทนข้อมูลเก่าทันทีครับ

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Thu Oct 13, 2011 1:32 pm
by bank9597
เสริมอีกนิดครับ พอดีว่าในชีทEdit คอลัมน์ "C","E","G","F" ผมจะตั้งค่า Validation - Definition คือจะเป็น DropDown ให้เลือกรายการเวลาแก้ไข
ตรงนี้แก้ได้แล้วครับ :D

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Thu Oct 13, 2011 1:42 pm
by snasui
:D ที่บอกว่าให้ดูเฉพาะ PO นั้นดูเหมือนว่าจะไม่พอ เนื่องจากมี PO ซ้ำกันตามภาพด้านล่าง หากเป็นการ Update ทั้งสองบรรทัดที่ซ้ำกันนั้นจะถูก Update ด้วยค่าเดียวกันซึ่งอาจจะไม่ตรงกับที่ต้องการ

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Thu Oct 13, 2011 2:31 pm
by bank9597
:? อาจารย์ครับ ใบPO 1 ใบ มีรายการสั่งซื้อได้สูงสุด 60 รายการ สมมุติใบ Po101 มี 10 รายการ าเวลาดึงข้อมูลมาแล้ว จะต้องมีรหัสPO ซ้ำอย่างแน่นอน

ถ้าเป็นอย่างนี้คงจะอัพเดทไม่ได้อย่างที่อาจารย์บอก

แต่สังเกตเห็นว่วคอลัมน์ "A" จะมีเลขลำดับอยู่ เราใช้ตัวนี้เป็นตัวตรวจสอบได้ไหมครับอาจารย์

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Thu Oct 13, 2011 2:45 pm
by snasui
:D หากค่าไม่ซ้ำกันก็ไม่น่าจะมีปัญหาใดครับ ว่าแต่เลขลำดับที่ว่านี้มีอยู่ในชีทต้นทางและชีทปลายทางหรือไม่ครับ เพราะเท่าที่ตรวจสอบพบว่าไม่มีอยู่ในชีท DataStore ครับ :?:

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Thu Oct 13, 2011 3:16 pm
by bank9597
:D ผมคิดว่าสามารถใช้สูตรดึงตัวเลขลำดับไปยังชีท DataStore ได้ แต่ว่าข้อมูลจะเยอะขึ้นทุกวันๆ เราจะต้องเข้าไปก๊อปปี้สูตรลงมาเรื่อยๆ ผมคิดว่าไม่เหมาะครับ

คงต้องไปแก้ในขั้น Save ข้อมูลจาก Temp มาลง DataStore โดยให้มีเลขลำดับบันทึกมาด้วย จะได้กำกับได้อย่างชัดเจนเช่น Po 101 ลำดับ 1,2,3,4.....

คงต้องย้อนกลับไปแก้ครับ :(

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Fri Oct 14, 2011 5:19 pm
by bank9597
ผมแก้ไขแล้วครับอาจารย์

ทีนี้ผมจะเขียนโค๊ดอย่างให้สามารถแก้ไขข้อมูลและลบข้อมูลได้ เพราะที่ผมได้เขียนไปนั้น ยังใช้การไม่ได้เลย ไม่รู้ต้องปรับตรงไหนบ้าง

อีกนิดครับ ในชีทEdit คอลัมน์A จะเป็นวันที่ที่แก้ไข เวลาแก้ไขเสร็จแล้ว ผมอยากใ้ห้ส่งค่าไปบันทึกในชีทDataStore คอลัมน์K เป็นต้นไป

รบกวนอาจารญ์ช่วยดูโค๊ดให้นิดนึงครับ

โมดูล 7-8 ไม่ได้ใช้งาน
ส่วนอัพเดทอัพเดท อยู่ในโมดูล 6 ครับ
Model.xlsm

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Fri Oct 14, 2011 6:33 pm
by snasui
:D ลองปรับ Code เป็นตามด้านล่างครับ

Code: Select all

Sub Update()
Dim rsAll As Range, rtAll As Range
Dim rs As Range, i As Integer

Application.Calculation = xlCalculationManual
Application.ScreenUpdating = False
On Error Resume Next

With Worksheets("Edit")
    Set rsAll = .Range("B4", .Range("B" & Rows.Count).End(xlUp))
End With

With Worksheets("DataStore")
    Set rtAll = .Range("B2", .Range("B" & Rows.Count).End(xlUp))
End With

For Each rs In rsAll
    For i = rtAll.Count To 1 Step -1    
        If rs = rtAll(i) And rs.Offset(0, 8) = rtAll(i).Offset(0, 8) _
        And rs.Offset(0, 9) = "Update" Then
            rs.Offset(0, -1).Resize(1, 10).Copy
            rtAll(i).Offset(0, -1).PasteSpecial xlPasteValues
        End If
    Next i
Next rs

Application.CutCopyMode = False
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic

End Sub

Re: การดึงข้อมูล,อัพเดท Record และ Delete

Posted: Mon Oct 17, 2011 12:53 pm
by bank9597
:D ขอบคุณครับ ไม่ได้เข้ามดูหลายวันเลย

เดี๋ยวผมจะเขียนโค๊ด Delete ต่อเลยครับ