ขอทราบวิธี Export : to Excel 2007 ด้วยค่ะอาจารย์
กระทู้เก่าบอร์ด อ.Yeadram

 7,516   16
URL.หัวข้อ / URL
ขอทราบวิธี Export : to Excel 2007 ด้วยค่ะอาจารย์

หนูมีปัญหาการส่งออกข้อมูล เป็นไฟล์ Excel ที่มีนามสกุลต่างกันค่ะ
สมมติคำสั่งเดิมที่หนูใช้กับ Access to Excel 2002 / 2003 เขียนไว้แบบนี้ค่ะ

DoCmd.OutputTo acOutputQuery, "Qry_ส่งข้อมูลทดสอบ¹", acFormatXLS, "C:\รับข้อมูลทดสอบ.xls"

มันก็ทำงานได้ปกติทุกประการค่ะ

แต่พอนำไปใช้กับ Access to Excel 2007 แล้วมันแจ้ง error ส่งออกข้อมูลไม่ได้ค่ะ ซึ่งหนูเข้าใจเอาเองว่า Excel 2007 และ 2010 ที่กำลังจะออกมานั้น นามสกุลมันไม่ได้ใช้ .xls แล้ว หนูจำไม่ได้ว่าเป็นนามสกุลอะไร

หากเป็นกรณีย์เช่นนี้ เรามีวิธีแก้ไขคำสั่งดังกล่าว เพื่อให้มันใช้ร่วมกันได้ทั้งสองนามสกุลอย่างไรคะ
หรือปัญหานี้ มันเกิดจากส่วนอื่นที่มันเข้ากันไม่ได้หรือเปล่าคะอาจารย์

ขอความช่วยเหลือจากท่านอาจารย์ด้วยค่ะ

16 Reply in this Topic. Dispaly 1 pages and you are on page number 1

1 @R04428
ระบบแจ้ง Error ตามในรูปนี้อะค่ะ



2 @R04436
ลองเปลี่ยนไปใช้ TransferSpreadsheet แทน

DoCmd.TransferSpreadsheet acExport,,String Expression ที่เป็นชื่อคิวรี่ หรือ SQL Statement ที่ใช้เลือกข้อมูลที่จะให้ส่งออก, String Expression ที่เป็นชื่อ path และ file ของไฟล์ Excel ที่จะสร้าง, True เมื่อต้องการให้มีชื่อฟิลด์ใน Excel ด้วย หรือเป็น False เมื่อไม่ต้องการ

ตย.เช่น DoCmd.TransferSpreadsheet acExport,,"SELECT ... FROM ... WHERE ...", "C:\Output\Out.xls", False
3 @R04437
อาจารย์คะ หนูลองทำตามไม่ถูกค่ะ คือข้อมูลที่หนูต้องการส่งออกมีอยู่ 3 คิวรี่โดยส่งไปเป็นไฟล์ Excel 3 ไฟล์พร้อมๆกันในครั้งเดียวค่ะ

คิวรี่สมติ..ที่ต้องการจะส่งออกมีดังนี้ค่ะอาจารย์
Qry_ส่งข้อมูลทดสอบ-1
Qry_ส่งข้อมูลทดสอบ-2
Qry_ส่งข้อมูลทดสอบ-3

และไฟล์ Excel สมมติ..ที่ปลายทางให้เป็นดังนี้ค่ะ
C:\รับข้อมูลทดสอบ-1.xls
C:\รับข้อมูลทดสอบ-2.xls
C:\รับข้อมูลทดสอบ-3.xls

ประมาณนี้แหละค่ะอาจารย์ หนูขอรบกวนอาจารย์ช่วยเขียนโค้ดตัวอย่างให้หนูหน่อยนะคะ เพราะหนูลองเดา โดยเติมชื่อคิวรี่ตรงจุดไข่ปลาตามโค้ดที่ท่านแนะนำ แล้วมันก็ไม่ได้ค่ะ
4 @R04438
DoCmd.TransferSpreadsheet acExport,,"Qry_ส่งข้อมูลทดสอบ-1", "C:\รับข้อมูลทดสอบ-1.xls", False
5 @R04439
ยังคงไม่ได้ค่ะอาจารย์ ยังคง error ตามในรูปค่ะ (แต่ถ้าไปเปิดใน Access 2003 แล้วจะใช้ได้ปกติ)



เมื่อคลิกที่ Debug แล้วจะเป็นแบบในรูปถัดไปค่ะ
6 @R04440
รูปนี้หลังจากคลิกที่ Debug ค่ะ



ลองปรับแก้เป็น C:\รับข้อมูลทดสอบ-1.xlsx", False แล้วก็ยังไม่ได้ค่ะ

7 @R04443
สำหรับ Office 2007 ให้ลอง DoCmd.TransferSpreadsheet acExport,acSpreadsheetTypeExcel12,"Qry_ส่งข้อมูลทดสอบ-1", "C:\รับข้อมูลทดสอบ-1.xls", False

ถ้ายังไม่ได้ก็ลอง DoCmd.TransferSpreadsheet acExport,acSpreadsheetTypeExcel12Xml,"Qry_ส่งข้อมูลทดสอบ-1", "C:\รับข้อมูลทดสอบ-1.xlsx", False

แต่ไม่รู้ว่าเมื่อใช้กับเวอร์ชั่นก่อน 2007 แล้วจะได้ด้วยหรือเปล่านะครับ
8 @R04446
ขอบคุณค่ะอาจารย์ เดี๋ยวเย็นนี้หนูจะลองดูคะ
อาจารย์คะหนูขอความรู้เพิ่มเติมนิดนึงค่ะ โค้ดส่วนนี้ acSpreadsheetTypeExcel12 แปลว่าเน้นเจาะจงสำหรับ 2007 เท่านั้นใช่ไหมคะ
9 @R04449
คือผมไปหาใน msdn.microsoft.com มาหน่ะครับ ก็ไม่แน่ใจเหมือนกันว่ามันเริ่มมีตั้งแต่เวอร์ชั่นไหน แล้วอีกอย่าง เขาบอกว่าเป็น undocumented ไว้ด้วย แสดงว่าใน help file คงไม่ได้มีบอกค่านี้เอาไว้ด้วย
10 @R04454
ขอรายงานผลค่ะอาจารย์
หนูได้ทดลองแล้ว ผลคือยังไม่ได้ทั้งสองโค้ดเลยค่ะอาจารย์ แต่ว่า หมายเลขรหัส Run-time error ที่แจ้งขึ้นมานั้นตัวเลขจะต่างกันค่ะ

สุดท้ายหนูเลยลองหันไปใช้มาโครสร้างดู เมื่อได้ผลตามที่ต้องการแล้วก็ลองแปลงมาโครให้เป็นโค้ดเพื่อศึกษาดู ก็จะได้แบบนี้ค่ะ

DoCmd.OutputTo acQuery, "Qry_ส่งข้อมูลทดสอบ-1", "MicrosoftExcelBiff8(*.xls)", "รับข้อมูลทดสอบ-1.xlsx", False, ""

หนูขอรบกวนอาจารย์ช่วยวิเคราะห์ความแตกต่างของคำสั่ง เพื่อเป็นแนวความรู้ให้หนูและสาชิกท่านอื่นๆด้วยนะคะ
11 @R04458
ผมไม่มี Access 2007 ผมดูเอาจาก msdn.microsoft.com ปรากฏว่าในนั้นไม่มีค่าตัวเลือก "MicrosoftExcelBiff8(*.xls)" แสดงไว้ครับ เลยบอกไม่ได้จริงๆว่ามันหมายถึงอย่างไร

ส่วน method .OutputTo นั้นใช้สำหรับส่งข้อมูลออกจาก Access Object ต่างๆ ไปได้หลายๆรูปแบบ    ในขณะที่ .TransferSpreadSheet ใช้ได้ทั้งส่งออกและนำเข้าข้อมูล แต่ก็ใช้ได้เฉพาะกับ Excel ไฟล์เท่านั้นครับ
12 @R04459
ขอบคุณค่ะอาจารย์ที่กรุณาเพิ่มเติมความรู้ดีๆให้เสมอค่ะ

อาจารย์คะ หนูลองคิดเดาเล่นๆดูว่า เป็นไปได้ไหมที่คำสั่ง Biff8(*.xls)" นั้นมันจะหมายถึงรุ่นเวอร์ชั่นของ Excel ที่แทนด้วยตัวเลข หรือเปล่าคะอาจารย์

13 @R04464
เท่าที่ผมมีก็คือเวอร์ชั่น 2002 พบว่า Output Format option ที่อ้างตัวแปร acFormatXLS constant (เหมือนในโจทย์) นั้น มีค่าเป็น string constant คือ "Microsoft Excel (*.xls)" ครับ ส่วนเวอร์ชั่นถัดๆไป ก็อาจมีค่า constant อย่างอื่นๆเพิ่มเติมได้   ถ้าใช้ object browser เป็น ให้ลองไปค้นหาด้วยคำว่า acFormat คุณก็จะเห็นว่า constant ต่างๆมีอะไรบ้างสำหรับ option นี้ และมีค่าเป็นอะไรด้วย (ตามรูปประกอบ)

14 @R04465
คิดว่าน่าจะเป็นกับ Access 2007 มากกว่า

ที่ผมเคยเจอ แต่ไม่ใช่กรณีเดียวกันอย่างนี้นะครับ

ผมจะเจอกับการเขียนโค้ดให้สร้าง Workbook ใหม่ จะใช้คำสั่ง Add ไม่ได้
เจอกับ Acess 2007/2010 ที่ทำงานบน Vista แต่จะไม่มีปัญหากับ Access 2007/2010 บน XP หรือ Windows7

วิธีแก้ไขคือ ไปกำหนด Locale ใน Regional Settings ให้เป็น En (United States) ก็จะหาย

ให้คุณมาลีลองแบบนี้ดูครับ

DoCmd.OutputTo acOutputQuery, "Qry_ส่งข้อมูลทดสอบ¹"

เมื่อเปิดสั่งให้มันทำงาน มันจะให้เราเลือกประเภทของไฟล์ และชื่อไฟล์และห้องที่ต้องการเก็บ

ลองดูครับ
15 @R04468
นับเป็นเกียรติอย่างยิ่งที่ ที่อาจารย์ระดับเซียนทั้งสอง ได้กรุณาเข้ามาร่วมแจมช่วยแก้ปัญหานี้

ขอเรียนอาจารย์ทั้งสองท่านดังนี้ค่ะ ขณะนี้หนูทำได้แล้วโดยใช้โค้ดด้านล่างนี้แหละค่ะ
DoCmd.OutputTo acQuery, "Qry_ส่งข้อมูลทดสอบ-1", "MicrosoftExcelBiff8(*.xls)", "รับข้อมูลทดสอบ-1.xls", False, ""

โค้ดนี้นอกจากจะใช้ได้แล้ว ยังไม่มีปัญหาข้อความภาษาไทยที่หัวคอลั่มของ Excel ที่ Export ออกไป เคยเป็นภาษาต่างดาว ก็ไม่เป็นต่างดาวอีกแล้วค่ะ

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

อย่างไรเสียก็ต้องขอขอบคุณอาจารย์ทั้งสองท่านเป็นอย่างสูงค่ะ
16 @R16794
ใช้ได้ดีครับ

ขอบคุณมาก
@ ประกาศใช้งานเว็บบอร์ดใหม่ => บอร์ดเรียนรู้ Access สำหรับคนไทย
แล้วจะใส่ลิ้งอ้างอิงมาที่โพสต์เก่านี้หรือไม่ก็ตามสะดวกครับ
Time: 0.3204s