: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

การดึงข้อมูลจาก database มาแสดงบนฟอร์ม

ฟอรัมถาม-ตอบปัญหาการใช้งาน MS Excel and 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
snasui
Site Admin
Site Admin
Posts: 30938
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การดึงข้อมูลจาก database มาแสดงบนฟอร์ม

#21

Post by snasui »

:shock: สำหรับชื่อหน่วยงานแก้ Code นี้เท่านั้น

Code: Select all

With Sheets("PurchaseOrder")
   .Range("I13") = r ': .Range("C7") = r.Offset(0, 1)
End With
นอกจากนั้นก็เป็น Code ที่ใช้งานได้แล้ว หรือมีอะไรที่ไม่ถูกต้องเกินกว่านั้นครับ :?:

กรณีต้องการที่จะนำ Code มาวางที่ตำแหน่งเดิมให้ทำการ Cleare เฉพาะค่าเดิมออกก่อน การ Clear ค่าให้ใช้ Code ยกตัวอย่างเช่น

Code: Select all

Range("A1:A10").ClearContents
ไม่ใช่

Code: Select all

Range("A1:A10").Clear
และไม่ใช่

Code: Select all

Range("A1:A10").Delete
User avatar
bank9597
Guru
Guru
Posts: 3868
Joined: Wed Aug 17, 2011 11:49 am

Re: การดึงข้อมูลจาก database มาแสดงบนฟอร์ม

#22

Post by bank9597 »

:D รบกวนอีกหน่อยครับ

ผมติดปัญหาการดึงข้อมูลไปยังแบบฟอร์มที่เราจะใช้พิมพ์ออกมาครับ

คือว่า ผมได้แนบไฟล์มาให้น่ะครับ ในชีท "FindPO" จะมีปุ่มที่ชื่อว่า "พิมพ์ใบสั่งซื้อ" ใช้ดึงข้อมูลไปยังชีท "PrintPO"
ซึ่งในชีท "PrintPO" ผมจะล๊อคชีทไว้ Pass : 240130

ผมได้สร้างโค๊ดไว้แล้วครับ สามารถดึงข้อมูลได้ตามตรงการแล้ว แต่ยังวางไม่ตรงช่องตามที่ต้องการ ทั้งนี้เพราะว่าในฟอร์มมีการผสานเซลล์ และเป็นฟอร์มแบบต่อเนื่องแบ 3 ฟอร์มติดกัน ต้องการนำข้อมูล ลำดับ,รายการสินค้า,จำนวน,หน่วย,ราคา ไปวางไว้ตามช่องในฟอร์มที่เรากำหนดไว้ โดยแต่ละฟอร์ม ผมจะกำหนดให้มีรายการสูงสุด 20 รายการครับ หากมากกว่านั้นก็จะขึ้นฟอร์ม 2 ต่อไปครับ

ผมอธิบายต่อไม่ถูกแล้วครับ :roll: อาจารย์เห็นชีทแล้วน่าจะเข้าใจแน่นอนครับ :D
You do not have the required permissions to view the files attached to this post.
Forum Rules
  1. อย่าใช้ภาษาแชทในการตอบ-ถาม
  2. ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
  3. ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
  4. ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
  5. หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
  6. แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
User avatar
snasui
Site Admin
Site Admin
Posts: 30938
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การดึงข้อมูลจาก database มาแสดงบนฟอร์ม

#23

Post by snasui »

:lol: จากชีท FindPO ให้ Link ตรง ๆ ไปยังชีท PrintPO เลย ไม่ต้องเขียน Code สำหรับการวางข้อมูลให้ยุ่งยากครับ บรรทัด 21 ก็ให้ Link ไปฟอร์มที่สอง บรรทัดที่ 61 ก็ Link ไปฟอร์มที่ 3 เช่นนี้ไปเรื่อย ๆ
User avatar
bank9597
Guru
Guru
Posts: 3868
Joined: Wed Aug 17, 2011 11:49 am

Re: การดึงข้อมูลจาก database มาแสดงบนฟอร์ม

#24

Post by bank9597 »

:cry: จริงๆแล้วผมก็ทำแบบอาจารย์ว่าน่ะครับ คือ Link ไปแล้วโดยใช้สูตร แต่ว่าอย่างนี้น่ะครับ
ในใบสั่งซื้อ "PurchaseOrder" ตรงคอลัมน์ "รายการสินค้า" ผมได้ทำค่า Validation ไว้ ฉะนั้นจะต้องเลือกรายการสินค้าจากที่มีอยู่เท่านั้น ไม่สามารถเพิ่มรายละเอียดของสินค้าลงไปได้อีก ตามหลักความเป็นจริงที่ทำงานอยู่ตอนนี้ คือ ถึงแม้จะแค่เลือกรายการสินค้าจาก List ที่มีอยู่แล้วก็จริง แต่ในทางปฏิบัติแล้ว รายการสินค้าหลายรายการจะต้องมีส่วนอธิบายเพิ่มเติมลงไปอีกครับ เช่น "ท่อเหล็กเหนียวใต้ดิน 200 มม. ปลายเรียบ 2 ด้าน PN8 ยาว 3 เมตร" นั่นคือชื่อเต็มซึงยาวมาก เราจะต้องตัดลงมาให้สั้น (แต่เราเข้าใจ) เหลือแค่ "ท่อเหล็กใต้ดิน 200X3 มม. PN8" ซึ่งเราเข้าใจ แต่คนขายเขาไม่เข้าใจ ฉะนั้นเราจึงต้องมีการอธิบายเพิ่มเติมไปอีกครับ เช่น เพิ่ม ปลายปากระฆัง,ปลายเรียบ 2 ด้าน,ปลายเรียบ 1 ด้าน
เป็นเหล็กหล่อ, มันมีหลายชนิดมากครับ หลายๆรายการเราจึงต้องเรียกเหมารวม ถ้าแยกประเภทชัดเจนคงทำได้ยากครับ แม้แต่วิศวกรที่ทำงานเอง เค้าก็เรียกสั้นๆ พอเข้าใจ ถ้าเราใส่ชื่อยาวมากไป เขาก็ไม่เข้าใจอีก คนรับของเข้าหน้างานก็ไม่เข้าใจ

เป็นปัญหาที่ผมคิดไม่ตกเลยครับ ผมต้องตั้งชื่อสินค้าให้ทุกคนเข้าใจตรงกัน คือ คนขาย(Vendor) คนทำใบสั่งซื้อ คนที่หน้างาน ให้เข้าใจตรงกัน ฉะนั้นจึงเป็นเรื่องยากมาครับ หลายสินค้าที่มีชื่อเรียกมากกว่า 2 ชื่อ ผมเลยแก้ปัญหาแบบนี้ครับ คือให้เพิ่มรายละเอียดลงไปในสินค้าอีก เช่น ตั้งชื่อว่า "ท่อเหล็กเหนียวใต้ดิน 200 มม." ให้ไปเพิ่มเองว่า ท่อนล่ะกี่เมตร (มันมีหลายขนาดครับ) ความหนาเท่าไหร่ ปลายเรียบหรือปลายระฆัง กี่ด้าน ความหนาเท่าไหร่ ให้เพิ่มไปเองครับ แต่เราจะเหมารวมเป็นประเภทๆไป ให้แยกชัดเจนเป็นเรื่องลำบากมากๆ ครับ ซึ่งนายช่างหน้างานและที่อื่นๆเค้าจะไม่ทำกัน อย่างดีคือแยกประเภทหมู่ใหญ่ๆไว้ชัดเจน แล้วค่อยมาดูเอาเองว่ามันป็นชนิดไหน

ผมเลยต้องดึงข้อมูลมาลงในชีท PrintPO แล้วอนุญาตให้สามารถแก้ไขได้ เพื่อให้คนทำใบสั่งซื้อสามารถเพิ่มรายละเอียดต่างๆลงใบในรายการได้ เช่น รูปภาพลายเส้นเล็กๆประกอบสินค้าพวกวงกบประตูเป็นต้น หรือแม้แต่แจ้งการโอนเงินผ่านธนาคารไหนผ่านใบสั่งซื้อก็มีครับ เพราะเหตุนี้เลยต้องทำออกมาในรูปแบบดังกล่าวครับ :|

ยกมายาวมาก ไม่รู้อาจารย์เข้าใจไหม แต่ผมว่าอาจารย์คงสบายๆครับ :D
Forum Rules
  1. อย่าใช้ภาษาแชทในการตอบ-ถาม
  2. ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
  3. ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
  4. ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
  5. หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
  6. แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
User avatar
bank9597
Guru
Guru
Posts: 3868
Joined: Wed Aug 17, 2011 11:49 am

Re: การดึงข้อมูลจาก database มาแสดงบนฟอร์ม

#25

Post by bank9597 »

กรณีต้องการที่จะนำ Code มาวางที่ตำแหน่งเดิมให้ทำการ Cleare เฉพาะค่าเดิมออกก่อน การ Clear ค่าให้ใช้ Code ยกตัวอย่างเช่น

โค้ด: เลือกทั้งหมด
Range("A1:A10").ClearContents
ผมลองวิธีแล้วครับ ผลออกมาดังนี้คือ แทนที่มันจะเคลียร์ข้อมูลเดิม มันกลับเคลียร์ข้อมูลที่เอาไปวางใหม่ซะงั้น สาเหตุเกิดจากยังไม่ชำนาญในเรื่องการวางโค๊ด ยังไม่ทราบว่าจะต้องมีองค์ประกอบใดอีกบ้าง หรือ วางอะไรก่อน-หลัง

ส่วนที่ชื่อ "หน่วยงาน","ชื่อบริษัท" ยังวางผิดที่อยู่นั้น ผมใช้วิธีวางโค๊ด :ard:

Code: Select all

With Sheets("PurchaseOrder")
                    .Range("I13") = r.Offset(0, 6)
                    .Range("C7") = r.Offset(0, 5)
ไม่รู้ว่าถุกหลักหรือไม่ครับ แต่แสดงผลออกมาตามต้องการครับ เลยนำไปปรับใช้อีกเรื่อยๆครับ

แต่ปัญหาของผม ยิ่งลึกเข้าไป มันยิ่งยากขึ้น เหมือนเกมส์ยังไงไม่รู้ครับ โค๊ดที่อาจารย์ให้มาน่าจะปรับใช้ได้หมด แต่เปล่าเลย มันจะต้องมีอะไรๆแปลกให้คิดมากอยู่เรื่อยเลยครับ ผมเลยต้องรบกวนอาจารย์บ่อยเหลือเกิน :|
Forum Rules
  1. อย่าใช้ภาษาแชทในการตอบ-ถาม
  2. ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
  3. ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
  4. ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
  5. หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
  6. แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
User avatar
snasui
Site Admin
Site Admin
Posts: 30938
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การดึงข้อมูลจาก database มาแสดงบนฟอร์ม

#26

Post by snasui »

bank9597 wrote:
กรณีต้องการที่จะนำ Code มาวางที่ตำแหน่งเดิมให้ทำการ Cleare เฉพาะค่าเดิมออกก่อน การ Clear ค่าให้ใช้ Code ยกตัวอย่างเช่น

โค้ด: เลือกทั้งหมด
Range("A1:A10").ClearContents
ผมลองวิธีแล้วครับ ผลออกมาดังนี้คือ แทนที่มันจะเคลียร์ข้อมูลเดิม มันกลับเคลียร์ข้อมูลที่เอาไปวางใหม่ซะงั้น สาเหตุเกิดจากยังไม่ชำนาญในเรื่องการวางโค๊ด ยังไม่ทราบว่าจะต้องมีองค์ประกอบใดอีกบ้าง หรือ วางอะไรก่อน-หลัง
ที่เป็นเช่นนั้นเพราะไม่เข้าใจ Code ครับ การจะให้ลบเชลล์ใด ๆ ต้องบอกโปรแกรมให้ชัด เช่น

Code: Select all

Sheets("Temp").Range("A1:A10").ClearContents
การอ้างเฉพาะ

Code: Select all

Range("A1:A10").ClearContents
จะเป็นการลบช่วงเซลล์ที่กำหนดในชีทที่เรากำลังทำงาน
ส่วนที่ชื่อ "หน่วยงาน","ชื่อบริษัท" ยังวางผิดที่อยู่นั้น ผมใช้วิธีวางโค๊ด :ard:

Code: Select all

With Sheets("PurchaseOrder")
   .Range("I13") = r.Offset(0, 6)
   .Range("C7") = r.Offset(0, 5)
ไม่รู้ว่าถุกหลักหรือไม่ครับ แต่แสดงผลออกมาตามต้องการครับ เลยนำไปปรับใช้อีกเรื่อยๆครับ
เมื่อ Code ทำงานถูกต้องก็ไม่ต้องไปกังวลครับ ค่อยสนใจเมื่อเกิด Error หรือแสดงผลลัพธ์ไม่ถูกต้อง
แต่ปัญหาของผม ยิ่งลึกเข้าไป มันยิ่งยากขึ้น เหมือนเกมส์ยังไงไม่รู้ครับ โค๊ดที่อาจารย์ให้มาน่าจะปรับใช้ได้หมด แต่เปล่าเลย มันจะต้องมีอะไรๆแปลกให้คิดมากอยู่เรื่อยเลยครับ ผมเลยต้องรบกวนอาจารย์บ่อยเหลือเกิน :|
ต้องค่อย ๆ เรียนรู้ไปครับ ให้เร่งปูพื้นฐานเรื่องการอ้างอิงเกี่ยวกับ Workbook, Worksheet, Range, Cells การ Loop ต่าง ๆ และจากที่เขียน ๆ มาจะเห็นได้ว่ายังไม่เข้าใจเรือง Offset จึงใช้แบบไม่มั่นใจ ลองทำความเข้าใจตามข้างล่างนี้
  1. Range("A1").Offset(x,y) หมายถึงถัดจาก A1 ไปจำนวน x บรรทัด y คอลัมน์
  2. Range("A1").Offset(0,0) คือไม่ไปไหนยังอยู่ที่ A1 เหมือนเดิม
  3. Range("A1").Offset(1,1) ตำแหน่งเซลล์จะไปอยู่ที่ B2
User avatar
snasui
Site Admin
Site Admin
Posts: 30938
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การดึงข้อมูลจาก database มาแสดงบนฟอร์ม

#27

Post by snasui »

:D ผมสรุปบางแนวทางสำหรับการทำงานนี้แล้วกันนะครับแล้วลองทำมาดูกันครับ
  1. เขียน Code เพื่อดึงข้อมูลจากฐานข้อมูลโดยตรงไม่ต้องไปผ่านชีท FindPO เหมือนอย่างที่ผมทำตัวอย่างไว้ให้แล้วจากที่ถามมาในคราวก่อน ๆ เท่าที่คิดเร็ว ๆ วิธีนี้จะใช้ Code เยอะและต้อง Loop เพื่อที่จะวางในแต่ละ Form จึงไม่แนะนำ
  2. เขียน Code นำข้อมูลจากชีท FindPO ที่ดึงมาแล้วด้วยสูตร วางลงในชีท PrintPO โดยนำแต่ละช่วงไปวาง เช่นบรรทัดที่ 1-20 วางใน Form ที่ 1, บรรทัดที่ 21-40 วางใน Form ที่ 2 เช่นนี้ไปเรื่อย ๆ และกรณีที่มีการ Merge เซลล์จะไม่สามารถยกไปวางทั้งชุดได้ ก็ให้แยกเป็นชุดย่อย ๆ ไปวางครับ เช่น
    • A1:A20 ของต้นทาง วางที่ A1:A20 ของปลายทาง, B1:B20 ของต้นทาง วางที่ C1:C20 ของปลายทาง ลักษณะของ Code จะได้เป็น

      Code: Select all

      'Other code
      Sheets(Target).Range("C1:C20") = Sheets(Source).Range("B1:B20").Value
      'Other code
      
    • ทำเช่นนี้กับทุก Form สามารถเขียน Code การวางแต่ละ Form แยกจากกันได้แล้วค่อยสร้าง Procedure มาเรียกใช้ Code ทั้งหมดอีกที
User avatar
bank9597
Guru
Guru
Posts: 3868
Joined: Wed Aug 17, 2011 11:49 am

Re: การดึงข้อมูลจาก database มาแสดงบนฟอร์ม

#28

Post by bank9597 »

Code: Select all

    Range("A1").Offset(x,y) หมายถึงถัดจาก A1 ไปจำนวน x บรรทัด y คอลัมน์
    Range("A1").Offset(0,0) คือไม่ไปไหนยังอยู่ที่ A1 เหมือนเดิม
    Range("A1").Offset(1,1) ตำแหน่งเซลล์จะไปอยู่ที่ B2

ผมติดปัญหาตรงนี้ตลอดอย่างที่เคยบอกอาจารย์ว่า อ่อนมากเลยกับ Offet เข้าไปอ่านที่อาจารย์โพสต์ไว้ในบอร์ดก็ยังไม่ค่อยเข้าใจ ยังไม่ทราบประโยชน์ว่าจะนำไปใช้ตรงไหนได้บ้าง แต่ตอนนี้ยอมรับว่าเข้าใจมาอีกระดับหนึ่งแล้วครับ จากตัวอย่างที่อาจารย์ยกโค๊ดมา ผมเข้าครับ อิอิ
ให้เร่งปูพื้นฐานเรื่องการอ้างอิงเกี่ยวกับ Workbook, Worksheet, Cell การ Loop ต่าง ๆ


ผมนั่งอ่านและนั่งดูวิดีโอการทำ Loop,Do While,Next,For Each หลายๆรอบ เพื่อจะได้นำปรับมาใช้ แต่ไม่เป็นผลเลย ผมยังคิดเอาความสามารถของมันออกมาใช้ไม่ได้เลยครับ ขาดความรู้พื้นฐานจริงๆ งานชิ้นนี้เสร็จ ผมจะเอาจริงกับพื้นฐานสักที
A1:A20 ของต้นทาง วางที่ A1:A20 ของปลายทาง, B1:B20 ของต้นทาง วางที่ C1:C20 ของปลายทาง ลักษณะของ Code จะได้เป็น
โค้ด: เลือกทั้งหมด
'Other code
Sheets(Target).Range("C1:C20") = Sheets(Source).Range("B1:B20").Value
'Other code
ทำเช่นนี้กับทุก Form สามารถเขียน Code การวางแต่ละ Form แยกจากกันได้แล้วค่อยสร้าง Procedure มาเรียกใช้ Code ทั้งหมดอีกที
แจ่มแจ้งครับ เห็นแนวทางทันที (คิดเองไม่ได้เลย) ผมต้องขอเวลาไปลองทำครับ :D

อธิบายอีกนิดน่ะครับ อาจจะสับสนหน่อย แต่อาจารย์ไม่สับสนแน่ครับ
ผมจะให้ทุกการทำงาน เริ่มจากชีท "WellCome" ซึ่งในขั้นต่อไปจะมีการซ่อนชีทที่ไม่จำเป็นออกไปแล้วจะแสดงชีทที่มีความเกี่ยวข้องกันมาแสดง เพื่อไม่ให้ผู้ทำงานออกนอกเส้นทางที่เราได้วางไว้ ในกรณีนี้ผมยกตัวอย่างการ "ทำใบสั่งซื้ออ้างQO" โดยให้เลือก "รหัสQO" ก่อนแล้วนำมายังชีท "PurchaseOrder" จะเห็นได้ว่าช่องรหัสQO จะล๊อคไว้
เมื่อทำรายการเรียบร้อยแล้ว ผมจะบังคับให้ "บันทึก" ข้อมูลก่อน ก่อนที่จะพิมพ์ใบสั่งซื้อ โดยพฤติกรรมการทำงานของพนักงานทั่วไป (ยกเว้นเราที่ทำระบบเอง) พอเค้าทำรายการเสร็จ เค้าจะสั่งพิมพ์ทันที โดยไม่ได้บันทึก พอไม่ได้บันทึก ข้อมูลจึงไม่มีใน Database พอทำใบสั่งซื้อใบที่ 2 ข้อมูลใบสั่งซื้อที่ 1 ที่ค้างอยู่ในชีท "PurchaseOrder" จะถูกเคลียร์ออกตามคำสั่ง ClearContents กลายเป็นว่าข้อมูลใบสั่งซื้อที่ 1ไม่ได้บันทึกไป ผมจึงไม่ได้ใช้วิธีการเคลียร์ข้อมูลก่อน ก่อนที่เอาข้อมูลใหม่ลง เพื่อป้องกันการลืมบันทึกข้อมูล

ที่ดึงข้อมูลมายัง FindPO นั้น สืบเนื่องมาจากการป้องกันการลืมบันทึกข้อมูล จริงๆแล้ว ไม่อยากทำให้มันยุ่งยากหลายขั้นตอน แต่เพื่อป้องการทำรายการผิดพลาด ผมเลยต้องทำแบบนี้ เพราะถ้าข้อมูลผิดพลาด ผมคิดว่ามันจะส่งผลระยะยาวกับระบบ ซึ่งอันนี้ผมคิดว่าอาจารย์คงรู้ดี
เมื่อทำรายการในชีท "PurchaseOrder" เสร็จแล้ว จะต้องกดบันทึกข้อมูลก่อน เพื่อส่งข้อมูลไปยัง Database ในขณะเดียวกันก็ส่งรหัส PO ไปยัง เซลล์ "D2" ของชีท "FindPO" ด้วย เพื่อดึงข้อมูลจาก Database ขึ้นมาแสดง ซึ่งถ้าไม่บันทึกก่อน ยังไงก็ไม่สามารถพิมพ์ใบสั่งซื้อได้ เพราะชีท "FindPO" ดึงข้อมูลจาก Database โดยตรง

การทำเช่นนี้เป็นการป้องกันกรณีความผิดพลาดที่อาจจะเกิดขึ้น เพราะผมเชื่อว่าคนเรามีโอกาสผิดพลาดได้ ต้องยอมรับว่าผมคิดได้ถึงแค่นี้ ตอนนี้ยังไม่เห็นวิธีการอื่น หากอาจารย์มีวิธีที่มันง่ายกว่านี้ รบกวนแนะนำด้วยน่ะครับ เพื่อจะได้ให้งานมันดีที่สุด
Forum Rules
  1. อย่าใช้ภาษาแชทในการตอบ-ถาม
  2. ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
  3. ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
  4. ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
  5. หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
  6. แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
User avatar
snasui
Site Admin
Site Admin
Posts: 30938
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การดึงข้อมูลจาก database มาแสดงบนฟอร์ม

#29

Post by snasui »

:D เอาเป็นว่าติดตรงไหนก็ถามมาเรื่อย ๆ แล้วกันครับ เรื่องการบันทึกข้อมูลแล้วแต่ความมุ่งหมายในการใช้งาน สิ่งที่ต้องระวังคือ ความครบถ้วน ถูกต้อง เรื่องอื่น ๆ แม้จะสำคัญก็เป็นเรื่องรองลงไป

ปกติก่อนที่จะทำงานใดเราต้องมีการวางแผน สำหรับการเขียน Code VBA เราต้องเขียนพิมพ์เขียวหรือ Flow Chart เสียก่อนด้วยซ้ำเพื่อให้เห็น Process ว่างานชิ้นนี้ต้องทำอะไรบ้าง มี Code อะไรบ้าง การตัดสินใจต้องทำตรงไหนบ้าง แล้วค่อยเขียน Code ตามนั้น

ควรจะแยก Code ออกเป็นงาน ๆ ไป เมื่อแก้ไขปรับปรุงเปลี่ยนแปลงจะได้ง่าย การเขียนรวดเดียวจบพร้อมกันไปทุกงานจะแก้ลำบาก กรณีติดปัญหาจะต้องไล่หาว่า Code ที่ผิดพลาดอยู่ตรงไหน

เรื่อง Comment ก็สำคัญ เพื่อป้องกันการหลงลืมเราสามารถเขียน Comment ไว้ได้ตามสมควร เมื่อกลับมาดูภายหลังจะได้เข้าใจได้เลยไม่ต้องอ่าน Code คนที่จะมาทำต่อจากเราก็จะได้สะดวก
User avatar
bank9597
Guru
Guru
Posts: 3868
Joined: Wed Aug 17, 2011 11:49 am

Re: การดึงข้อมูลจาก database มาแสดงบนฟอร์ม

#30

Post by bank9597 »

:D ครับอาจารย์

รายงานผลนิดนึงครับ จากโค๊ด :ard:

Code: Select all

'Other code
Sheets(Target).Range("C1:C20") = Sheets(Source).Range("B1:B20").Value
'Other code
ใช้ได้ผลดีมากครับ ไม่ต้องมากังวลเรื่อง MergeCell ขอบคุณมากครับ

ส่วนเรื่องการสร้างระบบที่ต้องมีพิมพ์เขียวด้วย ผมหงายหลังเลยครับ เพิ่งรู้ว่าต้องมี ที่รู้ๆคือต้องวางแผนเขียนแบบออกมาพอคร่าวๆ อันนี้ต้องขอบคุณอีกครับครับที่ชี้แนะให้

อย่างไรก็ตาม งานนี้แค่ตัวโมเดล ผมคงต้องทำใหม่ให้โครงสร้างทุกอย่างแน่นกว่านี้ :D
Forum Rules
  1. อย่าใช้ภาษาแชทในการตอบ-ถาม
  2. ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
  3. ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
  4. ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
  5. หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
  6. แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
Post Reply