Page 1 of 2
การดึงข้อมูล,อัพเดท Record และ Delete
Posted: Wed Oct 12, 2011 6:18 pm
by bank9597

ยอมรับว่ายังไม่รู้เรื่องโค๊ดอะไรมากมาย ทำไปเรื่อยๆ เดาบ้างไรบ้าง สุดท้ายก็ได้ผลที่ไม่ค่อยน่าประทับใจเท่าที่ควร จึงต้องรบกวนอาจารย์อีก
ผมได้ลองศึกษาตามเว็บดังกล่าว ทดลองทำเองตามตัวอย่างไม่มีปัญหาอะไร เลยนำมาปรับใช้กับงานตัวเอง แต่ปรากฏว่าไม่เป็นไปตามที่คาดหวัง พยายามหาวิธีแก้แล้วก็ยังไม่ได้อยู่ดี ประกอบกับความรู้พื้นฐานเรื่องโค๊ดก็อ่อนมากด้วย รบกวนอาจารย์ด้วยครับ
ในชีท Update ผมได้สร้างฟอร์มเพื่อดึงข้อมูลจากชีท Database มาแสดง พร้อมทั้งกำหนดให้สามารถแก้ไขข้อมูลและลบข้อมูลได้ แต่ปัญหาคือ เมื่อดึงข้อมูลมาแล้วยังมีส่วนที่ผิดพลาดอยู่ เช่นคอลัมน์ไม่ตรงกับที่กำหนด และมี Error รวมถึงการทำอัพเดทข้อมูลที่ยังไม่สามารถทำได้
ทั้งหมดนี้รบกวนอาจารย์ช่วยดูครับ เบื้องต้นได้เขียนโค๊ด Update มาแล้ว แต่ยังใช้การไม่ได้ ส่วนโค๊ด Delete ยังไม่ได้เขียน เพราะคิดว่าหากแก้ปัญหาแรกได้ รู้สาเหตุของปัญหา ก็น่าจะทำขั้นต่อไปได้เอง (บ้าง)
ทดสอบ1.xlsm
Re: การดึงข้อมูล,อัพเดท Record และ Delete
Posted: Wed Oct 12, 2011 8:22 pm
by snasui

ผมปรับ 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

ผมได้นำเอาโค๊ดไปปรับใช้กับตัวโมเดลแล้ว ปรากฏว่าไม่มีปัญหาแล้วครับ
ตอนนี้ติดอยู่ที่ Update ข้อมูลไม่ได้ครับ ลองแก้ไขค่าแล้วบันทึกก็ไม่เปลี่ยนแปลง คาดว่าน่าจะไม่เข้าเรื่องการปรับค่าคอลัมน์ครับ
ผมแนบไฟล์ตัวโมเดลมาให้ครับ อยู่ในชีท Edit โมดูลที่ 6 ครับ
รบกวนด้วยครับ
Model.xlsm
Re: การดึงข้อมูล,อัพเดท Record และ Delete
Posted: Wed Oct 12, 2011 10:59 pm
by snasui

อยากทราบว่าเงื่อนไขในการ Update และ Delete ให้ดูค่าใดในชีท Edit บ้างครับ
Re: การดึงข้อมูล,อัพเดท Record และ Delete
Posted: Wed Oct 12, 2011 11:16 pm
by bank9597

ตอนนี้อยากให้อาจารย์ช่วยดูแค่การ 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

ค่าที่ให้ดูหมายถึงว่าให้ดูว่าหากค่าในคอลัมน์ใดในชีท Edit ตรงกับค่าในคอลัมน์ใดของชีท DataStore แล้ว ให้นำข้อมูลไป Update ในชีท DataStore ซึ่งผมเข้าใจว่าน่าจะต้องตรงกันมากกว่าหนึ่งค่าถึงจะ Update และเมื่อระบุค่าได้แล้ว ค่อยมาปรับที่ Code ว่าต้องปรับกันอย่างไรครับ

Re: การดึงข้อมูล,อัพเดท Record และ Delete
Posted: Thu Oct 13, 2011 10:17 am
by bank9597

จะพยายามอธิบายน่ะครับ ไม่รู้ว่าจะเข้าใจไหม
ในชีท 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

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

ผมชักจะสับสนตัวเองแล้วครับ ไม่รู้ว่าโง่ หรือว่าขาดความรู้พื้นฐานหรือเปล่า อิอิ จากเงื่อนไขที่อาจารย์ถามถึง ความเข้าใจของผมน่าจะเป็นค่าที่อยู่ใน "D2" ซึ่งเป็นรหัส PO ที่ใช้เป็นค่าเปรียบเทียบในชีท DataStore คอลัมน์ "B" แล้วดึงข้อมูลมาแสดง ฉนั้นเงื่อนไขที่อาจารย์คือ รหัส Po ที่อยู่ในคอลัมน์ "B" ชีทEdit ครับ
ไม่รู้จะใช่หรือไม่ แต่พยายามเต็มที่แล้วครับ
Re: การดึงข้อมูล,อัพเดท Record และ Delete
Posted: Thu Oct 13, 2011 11:32 am
by snasui

ถ้าเช่นนั้นสรุปได้ว่า เงื่อนไขคือให้ดูที่ PO เดียวกัน และหากมีคำว่า Update ก็ให้นำค่าไปวางทับที่เดิม หากมีคำว่า Delete ก็ให้ลบบรรทัดนั้นทิ้ง ถูกต้องไหมครับ
Re: การดึงข้อมูล,อัพเดท Record และ Delete
Posted: Thu Oct 13, 2011 12:05 pm
by bank9597

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

Re: การดึงข้อมูล,อัพเดท Record และ Delete
Posted: Thu Oct 13, 2011 1:42 pm
by snasui

ที่บอกว่าให้ดูเฉพาะ 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

หากค่าไม่ซ้ำกันก็ไม่น่าจะมีปัญหาใดครับ ว่าแต่เลขลำดับที่ว่านี้มีอยู่ในชีทต้นทางและชีทปลายทางหรือไม่ครับ เพราะเท่าที่ตรวจสอบพบว่าไม่มีอยู่ในชีท DataStore ครับ

Re: การดึงข้อมูล,อัพเดท Record และ Delete
Posted: Thu Oct 13, 2011 3:16 pm
by bank9597

ผมคิดว่าสามารถใช้สูตรดึงตัวเลขลำดับไปยังชีท 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

ลองปรับ 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

ขอบคุณครับ ไม่ได้เข้ามดูหลายวันเลย
เดี๋ยวผมจะเขียนโค๊ด Delete ต่อเลยครับ