snasui.com ยินดีต้อนรับ
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ ระบุ Version ของ Excel
คำแสดงเจตนา
ขอผลแห่งการให้ความรู้นี้ จงกลับไปยังผู้ที่เป็นเจ้าของเดิม แม้ข้าพเจ้าจะไม่รู้จักท่านก็ตาม ขอให้แสงแห่งปัญญาที่ท่านเคยจุดไว้ ได้กลับไปเติมเต็มชีวิตของท่านอีกครั้ง และขอให้เจตนาของข้าพเจ้าเป็นการคืนความดีอย่างสงบ
ฟอรัมถาม-ตอบปัญหาการใช้งาน Macro และ VBA
Forum rules
ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
femexjoker
Member
Posts: 8 Joined: Wed Apr 25, 2012 3:12 pm
#1
Post
by femexjoker » Tue Jun 17, 2014 9:50 am
สวัสดีครับ ทุกท่าน
ผมมีคำถามมาถามท่านเรื่อง Macro Replace Data ข้ามไฟล์ ที่ว่าไม่ทราบว่าผมเขียน code ผิดหรืออย่างไร
เมื่อแก้ไขข้อมูลและกดปุ่ม Save Edit แล้วข้อมูลไม่ทับกับของเดิมที่มีอยู่แล้ว แต่มันไปทับด้านบนสุดของข้อมูลแทน
สิ่งที่ต้องการคือ เมื่อกดปุ่มแล้ว ข้อมูลที่แก้ไข ต้องไปทับกับข้อมูลเดิมที่มีอยู่แล้วครับ
ปัญหาตอนนี้คือ เมื่อกดปุ่มแล้ว ข้อมูลไม่ไปทับของเดิมแต่ไปทับด้านบนสุดของข้อมูลแทน
Code: Select all
Sub edit_save()
Dim rs As Range
Dim rt As Range
Set rs = Worksheets("outsource_jobs_order_sheet").Range("N9:AE28")
Set rt = Workbooks("Data_outsource_jobs_order.xlsm").Worksheets("DATA").Range("A1").Offset( _Worksheets("Temp1").Range("AF8"), 0)
If Worksheets("outsource_jobs_order_sheet").Range("N9") = "" Then
MsgBox "Can't replace data"
Exit Sub
End If
rs.Copy: rt.PasteSpecial xlPasteValues
Application.CutCopyMode = False
MsgBox "Replace Complete"
End Sub
ได้แนบไฟล์มาด้วย รบกวนทุกท่านด้วยครับ
Attachments
Form_outsource_jobs_order.xlsm
(121.23 KiB) Downloaded 48 times
bank9597
Guru
Posts: 3868 Joined: Wed Aug 17, 2011 11:49 am
#2
Post
by bank9597 » Tue Jun 17, 2014 12:13 pm
อันนี้เป็นอัพเดทข้อมูลข้ามไฟล์ใช่ไหมครับ ถ้าใช่ลองแนบไฟล์ปลายทางมาด้วยครับ จะได้ทดสอบโค๊ดได้
Forum Rules
อย่าใช้ภาษาแชทในการตอบ-ถาม
ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
bank9597
Guru
Posts: 3868 Joined: Wed Aug 17, 2011 11:49 am
#4
Post
by bank9597 » Tue Jun 17, 2014 3:39 pm
อันนี้ไม่ทราบว่าจะทำการอัพเดทครั้งล่ะ 1 รายการ หรือ หลายๆรายการในครั้งเดียว
ระบุเงื่อนไขที่ใช้อ้างการอัพเดทข้อมูล เช่น รหัสกำกับราการต่างๆให้ชัดเจน
เบื้องต้นผมเข้าไปดูฐานข้อมูลแล้ว ยังไม่เข้าใจครับ เพราะว่าจัดเก็บยังไม่ถูกต้อง และไม่มีรหัสกำกับรายการเลย
ตรรวจอีกครั้งน่ะครับ
Forum Rules
อย่าใช้ภาษาแชทในการตอบ-ถาม
ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
femexjoker
Member
Posts: 8 Joined: Wed Apr 25, 2012 3:12 pm
#5
Post
by femexjoker » Tue Jun 17, 2014 4:01 pm
หลายๆ รายการในครั้งเดียวเลยครับ รหัสกำกับ : เลขที่ ครับ เพื่อให้ได้หลายๆ รายการในครั้งเดียว ผมได้เชื่อม เลขที่&"-"&ลำดับ ไว้แล้วครับ
สังเกตุจาก ปุ่ม Search Macro ผมเขียนให้ คัดลอกจาก FormT มาทั้งฟอร์มครับ ส่วนปุ่ม SAVE ในข้างต้นผม ทำไว้ เพื่อ นำส่งค่าทั้งหมดใน
Sheet= outsource_jobs_order_sheet Cell = N9:AE28 ข้ามไฟล์ไปยัง DATA เพื่อเก็บไว้ครับ (โดยใช้ Define Name ช่วย) แต่พอมาถึง ปุ่ม SAVE EDIT ที่ผมมาตั้งคำถามนี้ขึ้นมาครับ ตามที่คุณ Bank9597 เข้าใจเลยครับ ผมต้องการอัพเด็จทับของเดิม แต่จากที่ผมเขียนโค้ดข้างบนมันให้ผลลัพธ์ว่า ส่งค่าไป แต่ไม่ไปทับจุดเดิมที่มีอยู่แต่กับทับในส่วนที่ไม่ใช่ คือ ข้างบนสุดของ DATA เลยครับ
femexjoker
Member
Posts: 8 Joined: Wed Apr 25, 2012 3:12 pm
#6
Post
by femexjoker » Tue Jun 17, 2014 4:22 pm
ผมลองแก้ .Offset( _Worksheets("outsource_jobs_order_sheet").Range("AF8"), 0) ได้ผลไปทับข้อมูลเดิมที่มีแล้วครับ แต่ติดอีกนิดนึงค่าว่างที่ตามมาไปทับข้อมูลอื่นครับ ผมต้องปรับ code อย่างไรไม่ให้เอาค่าว่างมาด้วยครับ
snasui
Site Admin
Posts: 31191 Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:
#7
Post
by snasui » Tue Jun 17, 2014 4:27 pm
วิธีหนึ่งสำหรับการวางโดยไม่ให้นำค่าว่างไปทับข้อมูลเดิมให้วางแบบ Skip Blanks ลองบันทึก Macro แล้วดู Code แล้วปรับใช้ครับ
femexjoker
Member
Posts: 8 Joined: Wed Apr 25, 2012 3:12 pm
#8
Post
by femexjoker » Wed Jun 18, 2014 9:27 am
ลองทำตามที่แนะนำแล้วครับ โดยปรับได้ตามนี้ แต่ผลลัพธ์ยังไม่ได้ตามที่ต้องการครับ
คือข้อมูลที่ส่งมายังคงนำค่าว่างมาทับข้อมูลส่วนอื่นอยู่ครับ สงสัยว่าผมจะทำไม่ถูกต้องหรือไม่ครับ รบกวนแนะนำด้วยครับ
สิ่งที่ต้องการ ข้อมูลที่แก้ไขจะต้องไปทับข้อมูลเดิมที่มีอยู่ โดยอ้างอิงจาก รหัส และลำดับรายงาน ส่งข้อมูลมาครั้งละหลายรายการครับ
ปัญหาที่เกิดขึ้น ข้อมูลไปทับข้อมูลเดิมที่มีอยู่แล้วเบื้องต้นแต่นำค่าว่างมาด้วยทำให้ค่าว่างไปทับข้อมูลอื่นๆ ที่ไม่เกี่ยวข้องหายไปครับ
Code: Select all
Sub edit_save()
Dim rs As Range
Dim rt As Range
Set rs = Worksheets("outsource_jobs_order_sheet").Range("N9:AE28")
Set rt = Workbooks("Data_outsource_jobs_order.xlsm").Worksheets("DATA").Range("A1").Offset( _
Worksheets("outsource_jobs_order_sheet").Range("AF8"), 0)
If Worksheets("outsource_jobs_order_sheet").Range("N9") = "" Then
MsgBox "Can't replace data"
Exit Sub
End If
rs.Copy: rt.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=True, Transpose:=False
Application.CutCopyMode = False
MsgBox "Replace Complete"
End Sub
logic
Gold
Posts: 1511 Joined: Thu Mar 18, 2010 1:57 pm
Excel Ver: 365
#9
Post
by logic » Wed Jun 18, 2014 10:40 am
การวางแบบที่อาจารย์แนะนำตัวแปร rs ของคุณต้องไม่ใช่ค่าว่างที่ได้จากสูตร แต่หมายถึงเซลล์ที่ไม่ได้คีย์ค่าใดลงไป
ค่าว่างที่ได้จากสูตรไม่นับเป็นค่าว่างตามวิธีการวางแบบ Skip blanks ครับ
ผมทดสอบก็ไม่ได้พบว่าไปวางแบบทับค่าเดิมเพื่อให้เปลี่ยนค่าเดิมเป็นค่าใหม่ แต่เหมือนไปต่อท้ายข้อมูลเดิม
อยากเห็นตัวอย่างชัด ๆ ว่าค่าเดิมเป็นอะไร แล้วจะให้เปลียนเป็นค่าใหม่ตามที่คุณต้องการอย่างไรครับ
หากจะไม่นำค่าว่างที่ได้จากสูตรไปวางทับค่าเดิม คุณต้อง Loop แน่ ๆ ไม่ใช่เอาไปวางตรง ๆ แบบนั้นครับ
bank9597
Guru
Posts: 3868 Joined: Wed Aug 17, 2011 11:49 am
#10
Post
by bank9597 » Wed Jun 18, 2014 10:59 am
ผมลองทำไฟล์ตัวอย่างมาให้ดู ลองเข้าไปดูตัวอย่างโค๊ดได้ครับ
Attachments
update_code.xlsm
(18.24 KiB) Downloaded 50 times
Forum Rules
อย่าใช้ภาษาแชทในการตอบ-ถาม
ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
femexjoker
Member
Posts: 8 Joined: Wed Apr 25, 2012 3:12 pm
#11
Post
by femexjoker » Wed Jun 18, 2014 11:00 am
คือแบบนี้ครับ ถ้าโหลดฟอร์มผมดู จะเห็นว่า ผมมีปุ่ม Search คือ ใส่เลขที่ในฟอร์ม แล้วเมื่อกดปุ่มนี้ ปุ่มนี้จะทำหน้าที่ ไปค้นหาข้อมูลรายการที่เกี่ยวข้องและคัดลอกมาวางในฟอร์ม จากนั้นคือหน้าที่ของปุ่มที่เป็นปัญหาอยู่ปัจจุบัน คือปุ่ม SAVE EDIT หลังจาก Search ข้อมูลมาแล้ว ผมก็จะจะปรับแก้ข้อมูลบ้างส่วน เช่น จำนวนเงิน 10,000 เป็น 15,000 และกดปุ่ม SAVE EDIT เพื่อ update ข้อมูลไปยังข้อมูลเดิมหรือบันทึกทับที่เดิมที่มีอยู่ครับ ทั้งนี้หลังจากลองเขียน code จึงเกิดเป็นปัญหาที่ปัจจุบันผมลองปรับแก้ตามคำแนะนำข้างต้นของทุกท่านแล้ว แต่ก็ยังมีการส่งค่าว่างไปทับข้อมูลอื่นๆ ที่ไม่เกี่ยวข้องอยู่
femexjoker
Member
Posts: 8 Joined: Wed Apr 25, 2012 3:12 pm
#12
Post
by femexjoker » Wed Jun 18, 2014 11:23 am
bank9597 wrote: ผมลองทำไฟล์ตัวอย่างมาให้ดู ลองเข้าไปดูตัวอย่างโค๊ดได้ครับ
ขอบคุณครับลองดูตัวอย่างแล้ว สอบถามนิดนึงครับ คือยังไงก็ต้องส่งค่าไปแค่ครั้งละรายการ และต้องมี boxlist "UPDATE" ทุกครั้งที่ต้องการแก้ไขและบันทึกตามที่ผมเข้าใจใช่หรือไม่ครับ? หลายรายการต่อครั้งได้แต่ต้องระบุ boxlist "UPDATE"ใช่หรือไม่ครับ?
bank9597
Guru
Posts: 3868 Joined: Wed Aug 17, 2011 11:49 am
#13
Post
by bank9597 » Wed Jun 18, 2014 11:46 am
ใช่แล้วครับ จะบันทึกอัพเดทครั้งล่ะกี่รายการ เราก็กำหนดที่ Boxlist ครับ
Forum Rules
อย่าใช้ภาษาแชทในการตอบ-ถาม
ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
snasui
Site Admin
Posts: 31191 Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:
#14
Post
by snasui » Wed Jun 18, 2014 7:36 pm
femexjoker wrote: คือแบบนี้ครับ ถ้าโหลดฟอร์มผมดู จะเห็นว่า ผมมีปุ่ม Search คือ ใส่เลขที่ในฟอร์ม แล้วเมื่อกดปุ่มนี้ ปุ่มนี้จะทำหน้าที่ ไปค้นหาข้อมูลรายการที่เกี่ยวข้องและคัดลอกมาวางในฟอร์ม จากนั้นคือหน้าที่ของปุ่มที่เป็นปัญหาอยู่ปัจจุบัน คือปุ่ม SAVE EDIT หลังจาก Search ข้อมูลมาแล้ว ผมก็จะจะปรับแก้ข้อมูลบ้างส่วน เช่น จำนวนเงิน 10,000 เป็น 15,000 และกดปุ่ม SAVE EDIT เพื่อ update ข้อมูลไปยังข้อมูลเดิมหรือบันทึกทับที่เดิมที่มีอยู่ครับ ทั้งนี้หลังจากลองเขียน code จึงเกิดเป็นปัญหาที่ปัจจุบันผมลองปรับแก้ตามคำแนะนำข้างต้นของทุกท่านแล้ว แต่ก็ยังมีการส่งค่าว่างไปทับข้อมูลอื่นๆ ที่ไม่เกี่ยวข้องอยู่
ลองตามนี้ครับ
ไฟล์ Form_outsource_jobs_order.xlsm
เซลล์ AF8 ปรับสูตรเป็น
Code: Select all
=MATCH(1,IF(outsource_jobs_order_sheet!$H$5=[Data_outsource_jobs_order.xlsm]DATA!$A$2:$A$1000,IF(outsource_jobs_order_sheet!$C$3=[Data_outsource_jobs_order.xlsm]DATA!$G$2:$G$1000,1,0)),0)
เซลล์ AG8 คีย์สูตร
=COUNT(AD9:AD28)
ปรับ Code เป็น
Code: Select all
Sub edit_save()
Dim rs As Range
Dim rt As Range
With Workbooks("Form_outsource_jobs_order.xlsm").Worksheets("outsource_jobs_order_sheet")
Set rs = .Range("n9:ae9").Resize(.Range("ag8").Value)
End With
With Workbooks("Data_outsource_jobs_order.xlsm").Worksheets("DATA")
Set rt = .Range("a1").Offset(Workbooks("Form_outsource_jobs_order.xlsm").Worksheets("outsource_jobs_order_sheet") _
.Range("af8").Value, 0)
End With
If Workbooks("Form_outsource_jobs_order.xlsm").Worksheets("outsource_jobs_order_sheet").Range("N9") = "" Then
MsgBox "Can't replace data"
Exit Sub
End If
rs.Copy: rt.PasteSpecial Paste:=xlPasteValues
Application.CutCopyMode = False
MsgBox "Replace Complete"
End Sub