Page 1 of 2
สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Wed Oct 19, 2011 6:10 pm
by bank9597
อาจารย์ครับ ผมได้สร้างฟอร์มเพื่อเพิ่มข้อมูลบริษัทลงในตาราง "Vendor"โดยใช้โค๊ดดังนี้ครับ
Code: Select all
Private Sub CommandButton1_Click()
Dim irow As Long
Dim ws As Worksheet
Set ws = Worksheets("Vendor")
'find first empty row in database
irow = ws.Cells(Rows.Count, 2) _
.End(xlUp).Offset(1, 0).Row
'Check for Id
If Trim(Me.TextBox1.Value) = "" Then
Me.TextBox1.SetFocus
MsgBox "ãÊèª×èÍÊÔ¹¤éÒ"
Exit Sub
End If
'copy the data to the database
ws.Cells(irow, 2).Value = Me.TextBox1.Value
ws.Cells(irow, 3).Value = Me.TextBox2.Value
ws.Cells(irow, 4).Value = Me.TextBox3.Value
'Clear the data
Me.TextBox1.Value = ""
Me.TextBox2.Value = ""
Me.TextBox3.Value = ""
Me.TextBox1.SetFocus
End Sub
หากข้อมูลตาราง "Vendor" ถูกบันทึกอยู่ในอีกไฟล์หนึ่ง ชื่อ Supplier.xls ผมจะเปลี่ยนแปลงโค๊ดข้างต้นอย่างไรครับ
สมมุติว่าไฟล์ชื่อ Supplier.xls อยู่ใน "C:\Server\Boonpanawat\Supplier.xls"
รบกวนด้วยครับ
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Wed Oct 19, 2011 6:14 pm
by snasui

เปิดไฟล์ Supplier.xls ขึ้นมาด้วยครับ แล้วปรับ Code จากบรรทัดนี้
เป็นด้านล่า่ง
Code: Select all
set ws = Workbooks("Supplier.xls").worksheets("Vendor")
ข้อมูลก็จะถูกบันทึกลงตามตำแหน่งไฟล์ ตำแหน่งชีทที่ต้องการ
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Wed Oct 19, 2011 7:43 pm
by bank9597
ขอบคุณมากๆครับ อิอิ
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Wed Oct 19, 2011 8:08 pm
by bank9597
อาจารย์ ผมเปลี่ยนแล้ว แต่มันยังบันทึกไม่ได้ มันเป็นดังภาพครับ
untitled.JPG
ผมต้องแก้ตรงไหนเพิ่มอีกไหมครับ
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Wed Oct 19, 2011 8:13 pm
by snasui

ดู Code แล้วไม่น่ามีปัญหาใดครับ ช่วยโพสต์ Error หรือแนบไฟล์มาด้วย เพื่อจะได้ทดสอบได้ครับ
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Wed Oct 19, 2011 9:09 pm
by bank9597
ผมเปลี่ยนจาก Supplier เป็น Product แล้วครับ ซึ่งนั่นก็หมายความว่า ผมต้องการเพิ่มข้อมูลสินค้าผ่าน UserForm2 ไปยัง Product.xls ครับ โดยอยู่ในไดร์ฟ D ครับ
Model.xlsm
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Wed Oct 19, 2011 9:14 pm
by snasui

ส่งมาทั้งสองไฟล์เลยครับ

Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Wed Oct 19, 2011 9:19 pm
by bank9597
ไฟล์ Product.xls ครับ
Product.xls
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Wed Oct 19, 2011 9:27 pm
by snasui

Code ด้านล่าง ผมทดสอบแล้วไม่พบว่าผิดพลาดครับ
Code: Select all
Private Sub CommandButton1_Click()
Dim irow As Long
Dim ws As Worksheet
Set ws = Workbooks("Product.xls").Worksheets("Product") '<== Adjust this line.
'find first empty row in database
irow = ws.Cells(Rows.Count, 2) _
.End(xlUp).Offset(1, 0).Row
'Check for Id
If Trim(Me.TextBox1.Value) = "" Then
Me.TextBox1.SetFocus
MsgBox "ãÊèª×èÍÊÔ¹¤éÒ"
Exit Sub
End If
'copy the data to the database
ws.Cells(irow, 2).Value = Me.TextBox1.Value
ws.Cells(irow, 3).Value = Me.TextBox2.Value
ws.Cells(irow, 4).Value = Me.TextBox3.Value
'Clear the data
Me.TextBox1.Value = ""
Me.TextBox2.Value = ""
Me.TextBox3.Value = ""
Me.TextBox1.SetFocus
End Sub
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Wed Oct 19, 2011 9:40 pm
by bank9597

ของผมมันยังไม่ได้เลยครับอาจารย์ รันแล้วก็เกิด Error ตามภาพที่แนบไว้ข้างต้นอ่ะครับ
ผมเปิดสองไฟล์พร้อมกัน มัน Error พอปิดไฟล์ Product.xls มันก็ Error อีกครับ
แต่เวลาปิดไฟล์ Product.xls มันจะฟ้อง ดังภาพ
untitled2.JPG
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Wed Oct 19, 2011 10:06 pm
by snasui

เจอปัญหานี้เป็นเรื่องที่ดีครับ จะเป็นประโยชน์กับท่านอื่น ๆ ด้วยครับ
สาเหตุเป็นเพราะ
- ไฟล์ Product.xls เป็น Version 2003
- ไฟล์ Model.xlsm เป็น Version 2007
- หากเปิด Model.xlsm ด้วย Version 2007 จะมีปัญหากับการ Assign ค่าให้กับ irow เป็น irow = ws.Cells(Rows.Count, 2) _
.End(xlUp).Offset(1, 0).Row ทั้งนี้เพราะ 2003 มีแค่ 65536 บรรทัด แต่ Rows.Count นับแล้วได้ 1048576 คือเท่ากับจำนวนบรรทัดของ Excel 2007 ซึ่งไม่มีบรรทัดนี้ใน Excel Version 2003 จึงเกิด Error อย่างที่เห็น
การแก้ไขให้แปลงไฟล์ Product.xls ให้เป็น Product.xls
x การแปลงสามารถเข้าเมนูโดยคลิก Office Button > Convert
และเพื่อป้องกันปัญหาลักษณะนี้ ควรใช้ไฟล์ที่เป็น Excel Version เดียวกันทั้งหมดครับ

Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Wed Oct 19, 2011 10:30 pm
by bank9597

อิอิ Get เลยครับ แก้ได้แล้วครับ
ผมใช้ Version 2007 ครับ แต่เพื่อป้องกันปัญหาเลยบันทึกเป็น 2003 ตลอดเลย เพื่อให้เวอร์ชั่นเก่าๆ สามารถใช้งานได้
ผมอยากทราบว่า ถ้าเราบันทึกเป็น .xlsx จะมีปัญหาอย่างไร หรือถ้าบันทึกเป็น .xls จะมีปัญหาอะไรที่จะตามมาในอนาคตบ้างครับ
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Wed Oct 19, 2011 10:34 pm
by bank9597

เพิ่มอีกนิดครับ เวลาเราจะบันทึกข้อมูลในลักษณะแบบนี้ จำเป็นไหมที่เราต้องเปิดไฟล์ทั้ง 2 ขึ้นมาพร้อมกัน
พอดีว่าผมลองปิดไฟล์ Product แล้วทำการบันทึกข้อมูล ปรากฏว่าไม่สามารถบันทึกได้ แต่ถ้าเปิดมาพร้อมกัน ก็ไม่มีปัญหาใดๆครับ
และถ้าสามารถบันทึกข้ามไฟล์โดยที่ไม่ต้องเปิดไฟล์ทั้ง 2 พร้อมกันได้ แสดงว่า ผมก็สามารถทำรายการสั่งซื้อ แล้วบันทึกข้อมูลไปอยู่ในอีกไฟล์หนึ่ง ที่ใช้เก็บข้อมูลโดยเฉพาะ แบบนี้จะได้ไหมครับ
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Wed Oct 19, 2011 10:38 pm
by snasui

การบันทึกเป็นอะไรไม่สำคัญเท่าการใช้ร่วมกัน 2 Version ครับ ปัญหาก็อาจจะเป็นได้หลายอย่าง ดูกระทู้นี้สำหรับข้อมูลเพิ่มเติมครับ
http://www.snasui.com/viewtopic.php?f=3&t=1727
สำหรับการเปิดไฟล์พร้อมกันนั้น จำเป็นหรือไม่แล้วแต่ความชำนาญเกี่ยวกับการใช้ VBA ครับ การเปิดขึ้นมาย่อมทำงานได้ง่ายกว่าบันทึกในไฟล์ที่ปิดอยู่ครับ ถ้าไม่บันทึกข้ามไฟล์ก็ต้องบันทึกในไฟล์เดียวคนละชีทดังนี้เป็นต้น หรือจะเขียนให้บันทึกไปยัง Text File, Access, SQL ไปเลยก็ทำได้แต่ไม่ใช่เรื่องง่ายที่จะทำเช่นนั้นครับ
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Wed Oct 19, 2011 10:44 pm
by bank9597
ครับ ผมพอเข้าใจแล้วครับ ขอบคุณสำหรับความช่วยเหลือครับ วันนี้ผมรบกวนแค่นี้ครับ ขอบคุณอาจารย์มากๆครับ
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Thu Oct 20, 2011 11:10 am
by bank9597

สวัสดีครับอาจารย์ เมื่อคืนทิ้งท้ายไว้ในเรื่องการบันทึกข้ามไฟล์
ปัญหาคือเราไม่สามารถบันทึกข้ามไฟล์ได้ ถ้าไฟล์ทั้ง 2 ไม่ถูกเปิดพร้อมกัน เมื่อเป็นดังนี้ผมเลยต้องหาวิธีใหม่มาแก้ปัญหาอีกครั้ง
ต้องเรียนว่า นี่เป็นโปรเจ็คศึกษาครับ เลยต้องเรียนรู้ทุกๆทางไว้ก่อน ได้มากน้อยเพียงใดนั้น จะต้องกลับไปศึกษาให้ลึกซึ้งมากกว่าเดิมอีกครั้งครับ
ผมได้สร้างไฟล์ Product.xlsx โดยมีชีท "Product","Import","Temp" ในชีท "Product" ผมได้สร้างตารางไว้ใส่ข้อมูล แล้วสร้างปุ่มไว้บันทึกไปยังไฟล์ชื่อ Test.txt ใน D\Server\Boonpanawat\Test.txt เบื้องต้นผมได้แกะโค๊ดมาใช้งาน สามารถบันทึกข้อมูลตามต้องการได้ครับ แต่ปัญหาคือ ข้อมูลที่ไปบันทึกนั้นจะต้องเหมือนกับข้อมูลต้นทางทุกครั้งไป ยกตัวอย่าง สมมุติครั้งที่ 1 มีข้อมูล 3 บรรทัด บันทึกไปเก็บไว้ พอครั้งที่ 2 เราลบข้อมูลเดิมทิ้งไป แล้วคีย์ข้อมูลใหม่ บันทึกไปเก็บ ปรากฏว่าข้อมูลที่บันทึกไปครั้งที่ 1 หายไป เหลือแต่ข้อมูลครั้งที่บันทึกไปล่าสุดเท่านั้น
เราจะแก้ปัญหานี้ได้ไหมครับ ให้ข้อมูลบันทึกไปเรียงต่อท้ายกัน เหมือนบันทึกในไฟล์ Excel และหากทำได้ เราจะนำข้อมูลมาใช้อย่างไร เพราะที่ทำแล้ว อยู่ในชีท Import ซึ่งข้อมูลที่นำเข้ามาจะไม่ตรงคอลัมน์เลย
ปัญหาดังกล่าว ไม่ใช่ประเด็นสำคัญครับ สำคัญตรงที่เราสามารถบันทึกข้อมูลข้ามไฟล์ได้ และผมอยากรู้ว่า หากผมเลือกแบบนี้มันจะดีหรือไม่ครับ เพราะ SQl,ACCESS ผมไม่ค่อยสันทัดเท่าไหร่
Product.xlsm
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Thu Oct 20, 2011 12:05 pm
by snasui

สำหรับ Code ที่แนบมามีการเว้นบรรทัดในทุก Record นอกจากนี้ยังเขียนทับตำแหน่งเดิม ผมเลยเขียนตัวอย่าง Code สำหรับการ Write ต่อเนื่องกันไปมาให้ตามด้านล่างครับ
Code: Select all
Sub SaveToText()
Dim Filename As String
Dim Data As Variant
Dim ExpRng As Range
Dim r As Range
With Worksheets("Product")
Set ExpRng = .Range("A2", _
.Range("A" & Rows.Count).End(xlUp))
End With
Filename = "D:\Test.txt" '<= Change to your path
Open Filename For Append As #1
For Each r In ExpRng
Data = r & "|" & r.Offset(0, 1) & "|" & r.Offset(0, 2)
Print #1, Data
Next r
Close #1
MsgBox "Finish."
End Sub
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Thu Oct 20, 2011 1:22 pm
by bank9597
อิอิ ขอบคุณครับ

Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Thu Oct 20, 2011 2:21 pm
by bank9597
อาจารย์ครับ ในการเซฟไปเก็บไว้ใน TextFile เราต้องเปลี่ยนแปลงโค๊ดอย่างไร เพื่อที่เวลาเราดึงมาใช้งาน มันจะมาตามคอลัมน์ที่เราต้องการ
โค๊ดนี้ครับ
Code: Select all
Data = r & "|" & r.Offset(0, 1) & "|" & r.Offset(0, 2)
Re: สร้าง user form บันทึกไปยังอีกไฟล์
Posted: Thu Oct 20, 2011 4:38 pm
by snasui

ตอนที่เปิดไฟล์ .txt โปรแกรมจะถามว่าให้แบ่งข้อความอย่างไร เลือก Dilimited > Next > ทำเครื่องหมายตรง Other > คีย์ Pipe (เครื่องหมาย |) > Finish