: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

การแสดงข้อมูลจากฐานข้อมูลด้วย VBA

ฟอรัมถาม-ตอบปัญหาการใช้งาน 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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
khainui
Member
Member
Posts: 63
Joined: Sat Jan 15, 2011 10:52 am

การแสดงข้อมูลจากฐานข้อมูลด้วย VBA

#1

Post by khainui »

พอดีทำได้ลองเขียน ก๊อป Code VBA จาก กระทู้นี้มา

http://snasui.blogspot.com/2011/06/vba_26.html

ตามไฟล์แนบ

แต่พอลองเลือกตามตัวอย่างกลับไม่ขึ้นมาเหมือนตัวอย่าง ต้องไปกด run marcro คราวนี้ขึ้น แต่ขึ้นมาแถวเดียว มันผิดตรงจุดไหนครับ งง :roll:
You do not have the required permissions to view the files attached to this post.
User avatar
bank9597
Guru
Guru
Posts: 3868
Joined: Wed Aug 17, 2011 11:49 am

Re: การแสดงข้อมูลจากฐานข้อมูลด้วย VBA

#2

Post by bank9597 »

: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: 30744
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การแสดงข้อมูลจากฐานข้อมูลด้วย VBA

#3

Post by snasui »

khainui wrote:ตามไฟล์แนบ

แต่พอลองเลือกตามตัวอย่างกลับไม่ขึ้นมาเหมือนตัวอย่าง ต้องไปกด run marcro คราวนี้ขึ้น แต่ขึ้นมาแถวเดียว มันผิดตรงจุดไหนครับ งง
:D Code นั้นอ้างอิง A4 ในการ Clear ข้อมูล ดังนั้น A4:E4 ซึ่งเป็นหัวคอลัมน์ ต้องเติมข้อมูลให้ครบครับ
khainui
Member
Member
Posts: 63
Joined: Sat Jan 15, 2011 10:52 am

Re: การแสดงข้อมูลจากฐานข้อมูลด้วย VBA

#4

Post by khainui »

snasui wrote:
khainui wrote:ตามไฟล์แนบ

แต่พอลองเลือกตามตัวอย่างกลับไม่ขึ้นมาเหมือนตัวอย่าง ต้องไปกด run marcro คราวนี้ขึ้น แต่ขึ้นมาแถวเดียว มันผิดตรงจุดไหนครับ งง
:D Code นั้นอ้างอิง A4 ในการ Clear ข้อมูล ดังนั้น A4:E4 ซึ่งเป็นหัวคอลัมน์ ต้องเติมข้อมูลให้ครบครับ
เข้าใจแล้วครับ แต่ขอสอบถามเพิ่มเติม ตรงช่อง e2 ใน sheet report ทำอย่างไรให้ดึงข้อมูลมาเป็น drop down list ครับ

พอดีทำด้วย data validation เลือก list แล้วมันมาทุกรายการเลย ไม่ได้ filter ให้เหลือข้อมูลละ 1 รายการ
User avatar
snasui
Site Admin
Site Admin
Posts: 30744
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การแสดงข้อมูลจากฐานข้อมูลด้วย VBA

#5

Post by snasui »

:D สามารถทำได้หลายวิธีครับ อย่างง่าย ๆ ก็สร้างด้วย Manual แล้วค่อยนำมาใช้ใน Validation อย่างที่ยากขึ้นไปก็ใช้ VBA เขียนครับ ลองทำมาดูก่อน ติดตรงไหนก็ถามกันต่อครับ
khainui
Member
Member
Posts: 63
Joined: Sat Jan 15, 2011 10:52 am

Re: การแสดงข้อมูลจากฐานข้อมูลด้วย VBA

#6

Post by khainui »

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

ถ้ามี Record ใหม่เพิ่มเข้าไปในช่อง Database ไม่สามารถทำให้มันเพิ่มข้อมูล Auto ในคอลัมน์ h และ i ได้ครับ ต้องใช้สูตรอย่างไรครับ

ตามไฟล์แนบครับ
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 30744
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การแสดงข้อมูลจากฐานข้อมูลด้วย VBA

#7

Post by snasui »

:D ที่คอลัมน์ H และ I ใช้สูตรเดิมครับ แต่ปรับช่วงข้อมูลในสูตรให้รองรับกับข้อมูลที่เพิ่มขึ้น หรือ กำหนดชื่อ (Range Name) ให้กับช่วงข้อมูลต้นแหล่งเพื่อให้ยืดหยุ่นตามปริมาณข้อมูล แล้วค่อยนำมาใช้ในสูตร

ส่วนการเรียงจากน้อยไปหามากหรือจากมากไปหาน้อย หากจะใช้สูตรสามารถดูเพิ่มเติมได้ที่นี่ครับ :arrow: การเรียงข้อมูลด้วยสูตร ซึ่งเพิ่มคอลัมน์สำหรับเรียงข้อมูลออกมาต่างหากอีก 1 คอลัมน์ครับ
khainui
Member
Member
Posts: 63
Joined: Sat Jan 15, 2011 10:52 am

Re: การแสดงข้อมูลจากฐานข้อมูลด้วย VBA

#8

Post by khainui »

ได้ลองเพิ่มช่วงแล้วครับแต่เหมือนมันขึ้น error ครับ เพราะมันเป็นค่าว่างหรือเปล่าครับ
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 30744
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การแสดงข้อมูลจากฐานข้อมูลด้วย VBA

#9

Post by snasui »

:D ลองตามนี้ครับ
  1. ที่เซลล์ I เปลี่ยนสูตรเป็น
    =ROUND(SUMPRODUCT((Dept<>"")/COUNTIF(Dept,Dept&"")),0)
    Enter
  2. ที่เซลล์ H เปลี่ยนสูตรเป็น
    =IF(ROWS(H$2:H2)>$I$2,"",INDEX(Dept,SMALL(IF(FREQUENCY(IF(Dept<>"",MATCH(Dept,Dept,0)),ROW(Dept)-MIN(ROW(Dept))+1),ROW(Dept)-MIN(ROW(Dept))+1),ROWS(H2:$H$2))))
    Ctrl+Shift+Enter > Copy ลงด้านล่าง
khainui
Member
Member
Posts: 63
Joined: Sat Jan 15, 2011 10:52 am

Re: การแสดงข้อมูลจากฐานข้อมูลด้วย VBA

#10

Post by khainui »

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

ตอนนี้กำลังใช้สูตร sort ข้อมูลเพื่อไปออกในช่อง e2 อยู่ครับ

ขอบคุณครับ :D
khainui
Member
Member
Posts: 63
Joined: Sat Jan 15, 2011 10:52 am

Re: การแสดงข้อมูลจากฐานข้อมูลด้วย VBA

#11

Post by khainui »

snasui wrote::D ลองตามนี้ครับ
  1. ที่เซลล์ I เปลี่ยนสูตรเป็น
    =ROUND(SUMPRODUCT((Dept<>"")/COUNTIF(Dept,Dept&"")),0)
    Enter
  2. ที่เซลล์ H เปลี่ยนสูตรเป็น
    =IF(ROWS(H$2:H2)>$I$2,"",INDEX(Dept,SMALL(IF(FREQUENCY(IF(Dept<>"",MATCH(Dept,Dept,0)),ROW(Dept)-MIN(ROW(Dept))+1),ROW(Dept)-MIN(ROW(Dept))+1),ROWS(H2:$H$2))))
    Ctrl+Shift+Enter > Copy ลงด้านล่าง
อาจารย์ครับขอความหมายของสูตร 2 สูตรนี้หน่อยครับ (กำลังแกะสูตรอยู่ครับ)

สูตรแรกคือ =match(Dept,Dept,0) ทำไมผลของสูตรถึงออกมาเป็น 1 พอไปแถวที่ 2 จึงกลายเป็น 2 ครับ
สูตรสองคือ เครื่องหมาย if(Dept<>"" หมายถึง ช่วงเซลล์นั้นต้องไม่ใช่ค่าว่างใช่ไม๊ครับ :?:
User avatar
snasui
Site Admin
Site Admin
Posts: 30744
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การแสดงข้อมูลจากฐานข้อมูลด้วย VBA

#12

Post by snasui »

:D
khainui wrote:สูตรแรกคือ =match(Dept,Dept,0) ทำไมผลของสูตรถึงออกมาเป็น 1 พอไปแถวที่ 2 จึงกลายเป็น 2 ครับ
เป็นการนำค่าใน Dept ตัวแรกไปตรวจสอบกับ Dept ทั้งชุดว่าอยู่ในลำดับที่เท่าไร เมื่อเป็นบรรทัดที่ 2 ก็จะเป็นการนำตัวที่ 2 ไปตรวจ เช่นนี้ไปเรื่อย ๆ ครับ
khainui wrote:สูตรสองคือ เครื่องหมาย if(Dept<>"" หมายถึง ช่วงเซลล์นั้นต้องไม่ใช่ค่าว่างใช่ไม๊ครับ
เข้าใจถูกแล้วครับ
khainui
Member
Member
Posts: 63
Joined: Sat Jan 15, 2011 10:52 am

Re: การแสดงข้อมูลจากฐานข้อมูลด้วย VBA

#13

Post by khainui »

=IF(ROWS(H$2:H2)>$I$2,"",INDEX(Dept,SMALL(IF(FREQUENCY(IF(Dept<>"",MATCH(Dept,Dept,0)),ROW(Dept)-MIN(ROW(Dept))+1),ROW(Dept)-MIN(ROW(Dept))+1),ROWS(H2:$H$2))))

นั่งแกะตั้งนานงงครับว่า ตรง SMALL(IF(FREQUENCY(IF(Dept<>"",MATCH(Dept,Dept,0)) ส่งกลับเป็นตัวเลข row_number อย่างไรครับ มึน
รบกวนอธิบายหน่อยครับ ช่วงไหนเป็น row_number ของ index ช่วงไหนเป็น column_number ครับ :roll:
User avatar
snasui
Site Admin
Site Admin
Posts: 30744
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: การแสดงข้อมูลจากฐานข้อมูลด้วย VBA

#14

Post by snasui »

:D จากสูตร =IF(ROWS(H$2:H2)>$I$2,"",INDEX(Dept,SMALL(IF(FREQUENCY(IF(Dept<>"",MATCH(Dept,Dept,0)),ROW(Dept)-MIN(ROW(Dept))+1),ROW(Dept)-MIN(ROW(Dept))+1),ROWS(H2:$H$2)))) หมายความว่า หาก ROWS(H$2:H2)>$I$2 มีค่าเป็นจริงแล้ว ให้แสดงค่าว่าง หากไม่เป็นจริงให้แสดงผลลัพธ์ของ INDEX(Dept,SMALL(IF(FREQUENCY(IF(Dept<>"",MATCH(Dept,Dept,0)),ROW(Dept)-MIN(ROW(Dept))+1),ROW(Dept)-MIN(ROW(Dept))+1),ROWS(H2:$H$2)))

จากสูตร INDEX(Dept,SMALL(IF(FREQUENCY(IF(Dept<>"",MATCH(Dept,Dept,0)),ROW(Dept)-MIN(ROW(Dept))+1),ROW(Dept)-MIN(ROW(Dept))+1),ROWS(H2:$H$2))) หมายความว่า จากช่วงเซลล์ Dept ให้แสดงค่าในบรรทัดที่เป็นผลลัพธ์ของสูตร SMALL(IF(FREQUENCY(IF(Dept<>"",MATCH(Dept,Dept,0)),ROW(Dept)-MIN(ROW(Dept))+1),ROW(Dept)-MIN(ROW(Dept))+1),ROWS(H2:$H$2))

จากสูตร SMALL(IF(FREQUENCY(IF(Dept<>"",MATCH(Dept,Dept,0)),ROW(Dept)-MIN(ROW(Dept))+1),ROW(Dept)-MIN(ROW(Dept))+1),ROWS(H2:$H$2)) หมายความว่า จากช่วงเซลล์ที่ได้จากผลลัพธ์ของสูตร IF(FREQUENCY(IF(Dept<>"",MATCH(Dept,Dept,0)),ROW(Dept)-MIN(ROW(Dept))+1),ROW(Dept)-MIN(ROW(Dept))+1) ให้หาค่าที่น้อยที่สุดในลำดับที่เป็นผลลัพธ์ของสูตร ROWS(H2:$H$2)

จากสูตร IF(FREQUENCY(IF(Dept<>"",MATCH(Dept,Dept,0)),ROW(Dept)-MIN(ROW(Dept))+1),ROW(Dept)-MIN(ROW(Dept))+1) หมายความว่า หาก FREQUENCY(IF(Dept<>"",MATCH(Dept,Dept,0)),ROW(Dept)-MIN(ROW(Dept))+1) เป็นจริง (ไม่เป็น 0) แล้วให้แสดงผลลัพธ์ของ ROW(Dept)-MIN(ROW(Dept))+1 หากไม่เป็นจริงให้แสดงค่า False

จากสูตร FREQUENCY(IF(Dept<>"",MATCH(Dept,Dept,0)),ROW(Dept)-MIN(ROW(Dept))+1) หมายความว่า ค่าที่ได้จากสูตร IF(Dept<>"",MATCH(Dept,Dept,0)) เกิดขึ้นกี่ครั้งจากค่าในผลลัพธ์จากสูตร ROW(Dept)-MIN(ROW(Dept))+1

ดูเพิ่มเติมเรื่อง Frequency ที่ http://www.snasui.com/viewtopic.php?f=3&t=2221

สูตร MATCH(Dept,Dept,0)) อธิบายแล้วตามความเห็นก่อนหน้านี้ :roll:

สูตร ROW(Dept)-MIN(ROW(Dept))+1 หมายถึง จำนวนบรรทัดทั้งหมดจาก Dept หักด้วยบรรทัดเริ่มต้นของ Dept แล้วบวกด้วย 1 เพื่อให้แสดงค่าลำดับเริ่มที่ 1 เสมอ ดูเพิ่มเติมที่ http://www.snasui.com/viewtopic.php?p=17983#p17983
Post Reply