Page 3 of 4
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Fri Nov 25, 2016 11:12 pm
by snasui

จาก Code ข้างต้นเป็นการนำค่าจาก
Workbooks("book2").Worksheets("[color=#FF4000]sheet1[/color]").Range("A1:A10") ไปวางที่ tBook ซึ่งก็คือ
Book1.xlsx โดยวางที่
Worksheets("Sheet2").Range("C1:C10") ไม่ได้นำ
Book2, Sheet2 ไปวางแต่อย่างใด
ดังนั้น หากจะให้ปลายทางมีค่า ต้นทางก็ต้องมีค่าเสียก่อน ให้ตรวจสอบว่า
Workbooks("book2").Worksheets("sheet1").Range("A1:A10") มีค่าที่ต้องการนำไปวางหรือไม่ หรือหากไม่ได้ต้องการนำตำแหน่งนี้ไปวางก็ให้เขียนตำแหน่งให้ถูกต้อง
การอ้างถึง Workbook ควรอ้างนามสกุลด้วยเสมอ เช่น
Workbooks("Book2.[color=#FF4000]xlsm[/color]")
จาก Code ที่ผมโพสต์ไปด้านบน ปรับเพิ่มเติมนิดหน่อย จาก
tBook.Close [color=#FF4000],[/color] True เป็น
tBook.Close True เป็นการปิดและ Save โดยไม่ต้องถามครับ
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Fri Nov 25, 2016 11:56 pm
by sakajohn
ได้แล้วครับอาจารย์ ขอบคุณครับ อาจารย์ครับ ถ้าเราเกิดเปิด book 1 แล้วคีย์ข้อมูลอยู่ พอดีมีคนมาคีย์ข้อมูลที่ book 2 มันจะสั่งปิด book 1 โดยไม่มีการบันทึกค่าที่กำลังคีย์ที่ book 1 ครับ มันจะบันทึกค่าที่ Book 2 คีย์ลงไปเท่านั้น เป็นไปได้ไหมครับ ถ้าเปิดอยู่พร้อมกัน ก่อนจะปิด book 1 ให้ save ค่าที่ book1 ก่อน ตอนนี้ที่ book 1 ผมใส่ code ไว้ที่ This workbook
Code: Select all
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Saved = False
End Sub
มันก็ไม่บันทึกให้ครับ
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 12:21 am
by sakajohn
แก้ได้แล้วครับ
Code: Select all
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveWorkbook.Save
End Sub
คือที่ book 1 key ไป save ไป ถ้ามีคนมาคีย์ที่ book 2 แล้วปิด book 1 ค่าก็จะยังอยู่ แบบนี้มันจะมีปัญหาหรือเปล่าครับอาจารย์
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 1:08 am
by sakajohn
อาจารย์ครับตอนนี้ผมเอามาปรับใช้กับงานจริง คือ Workbook plannew.xlsm เป็นตัวป้อนข้อมูล workbook planning.xlsm เป็นตัวรับข้อมูล
Code: Select all
Private Sub Worksheet_Change(ByVal Target As Range)
Dim bookpath As String, bookname As String, tBook As Workbook
bookpath = "c:\plan\"
bookname = "planning.xlsm"
Set tBook = Workbooks.Open(Filename:=bookpath & bookname) ' Add "(" and ")"
tBook.Worksheets("M01").Range("A3:Q4000").Value = _
Workbooks("planning").Worksheets("M01").Range("A3:Q4000").Value
tBook.Close True
End Sub
เวลาบันทึกค่ามันเหมือนจะทำงานตามช่องที่เรากำหนด เช่น ช่องข้อมูลมี 16 ช่อง มันก็จะกระพริบ 16 ครั้งครับ มันไม่เหมือนตอนลองตัวอย่างครับ
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 6:35 am
by snasui
sakajohn wrote:...ถ้าเราเกิดเปิด book 1 แล้วคีย์ข้อมูลอยู่ พอดีมีคนมาคีย์ข้อมูลที่ book 2 มันจะสั่งปิด book 1 โดยไม่มีการบันทึกค่าที่กำลังคีย์ที่ book 1 ครับ มันจะบันทึกค่าที่ Book 2 คีย์ลงไปเท่านั้น เป็นไปได้ไหมครับ ถ้าเปิดอยู่พร้อมกัน ก่อนจะปิด book 1 ให้ save ค่าที่ book1 ก่อน ตอนนี้ที่ book 1 ผมใส่ code ไว้ที่ This workbook
Code: Select all
Private Sub Workbook_BeforeClose(Cancel As Boolean)
ThisWorkbook.Saved = False
End Sub
มันก็ไม่บันทึกให้ครับ

เป็นไปไม่ได้ตั้งแต่มีคนมาเปิด Book2 ในเครื่องตัวเอง แล้วสั่งปิด Book1 โดยไปกระทบกับ Book1 ในเครื่องใด ๆ ที่มีการเปิดใช้อยู่แล้วให้ปิดไปด้วย เพราะจะปิดได้ก็แต่เพียง Book1 ในเครื่องตัวเองเท่านั้น
การเปิดไฟล์เดียวกันจากหลายเครื่องหากเป็นไฟล์ที่ไม่ได้ Shared มันจะฟ้องว่ามีคนเปิดอยู่แล้ว แต่หาก Shared จะเปิดและทำงานได้พร้อมกัน 255 คนครับ
sakajohn wrote:แก้ได้แล้วครับ
Code: Select all
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
ActiveWorkbook.Save
End Sub
คือที่ book 1 key ไป save ไป ถ้ามีคนมาคีย์ที่ book 2 แล้วปิด book 1 ค่าก็จะยังอยู่ แบบนี้มันจะมีปัญหาหรือเปล่าครับอาจารย์
ลักษณะแบบนี้ไม่ใช่วิธีการแก้ การทำเช่นนี้ไม่ได้ไม่ได้ช่วยให้ค่ายังคงอยู่ตามที่กล่าวมา หากเป็นไฟล์ที่ไม่ได้ Shared ข้อมูลใน Book1 จะเป็นของคนที่เปิดไฟล์และ Save คนล่าสุดและไม่สามารถตรวจสอบได้ว่าเป็นข้อมูลที่ใครเป็นคนคีย์
หลักการ Share ไฟล์ ไฟล์ที่เป็นข้อมูลไม่ควรมี Code เป็นไฟล์เพื่อการเก็บข้อมูลเท่านั้น และเปิด Shared เพื่อให้ไฟล์ที่มี Code สามารถเปิดไฟล์นี้ขึ้นมาทำงาน ทำเสร็จแล้วปิดไป
ไฟล์ที่ Shared จะสามารถทำงานพร้อมกันได้หลายคน การปิดและเปิดไฟล์ที่ Shared นี้จะเป็นอิสระจากกัน ไม่มีใครสามารถไปปิดไฟล์ที่เปิดพร้อมกันในเครื่องอื่นได้ ยกเว้นเดินไปปิดหรือแฮกเข้าไปปิด
จากสองไฟล์ที่แนบมาล่าสุด ไฟล์ใดเป็นไฟล์โปรแกรม ไฟล์ใดเป็นไฟล์ข้อมูล ได้ทำมาตามหลักการด้านบนแล้วหรือไม่ครับ
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 9:39 am
by sakajohn
ผมขออธิบายการทำงานนะครับ ไฟล์ plannew เป็นไฟล์โปรแกรมครับจะอยู่ที่ com 1 ที่ sheet 1 เป็น formคีย์ข้อมูล เมื่อกดบันทึก ข้อมูลก็จะไปsaveตามsheet ที่เลือกไว้ใน cell C17 ส่วนไฟล์ planningจะเป็นไฟล์ข้อมูล อยู่ที่ com 2 จะเป็นตัวรับข้อมูลจากไฟล์ plannew เมื่อได้ข้อมูลแล้ว จะมีคนมาคีย์ว่า งานนั้นได้ทำอะไรไปแล้วอีกครั้ง ผมเลยต้องเขียนให้ต้อง save อยู่ตลอดเวลา
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 9:44 am
by snasui

ถ้าเขียน Save ตลอดเวลาจากไฟล์โปรแกรมไปยังไฟล์ปลายทางไม่ใช่ปัญหาแต่อาจจะเกินความจำเป็น ควร Save เท่าที่จำเป็น แต่ถ้าเป็นไฟล์ปลายทาง ไม่จำเป็นครับ
sakajohn wrote:ฟล์ planningจะเป็นไฟล์ข้อมูล อยู่ที่ com 2 จะเป็นตัวรับข้อมูลจากไฟล์ plannew เมื่อได้ข้อมูลแล้ว จะมีคนมาคีย์ว่า งานนั้นได้ทำอะไรไปแล้วอีกครั้ง
ไฟล์ที่ Com 2 ไม่ควรเป็นไฟล์โปรแกรม ไม่จำเป็นต้อง Save อัตโนมัติ แค่ Shared ไว้ ใครเปิดมาทำงานให้ทำการ Save เอง หากต้องการดูค่าล่าสุดว่ามีเซลล์ใดเป็นค่าใดให้กดปุ่ม Save ก็จะได้ค่าล่าสุดมาแสดง ส่วนนี้เป็นหน้าที่ของผู้ใช้งาน ต้องอธิบายและทำความเข้าใจวิธีและหลักการทำงานที่ถูกต้องก่อนนำไปใช้ครับ
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 10:15 am
by sakajohn
sakajohn wrote:อาจารย์ครับตอนนี้ผมเอามาปรับใช้กับงานจริง คือ Workbook plannew.xlsm เป็นตัวป้อนข้อมูล workbook planning.xlsm เป็นตัวรับข้อมูล
Code: Select all
Private Sub Worksheet_Change(ByVal Target As Range)
Dim bookpath As String, bookname As String, tBook As Workbook
bookpath = "c:\plan\"
bookname = "planning.xlsm"
Set tBook = Workbooks.Open(Filename:=bookpath & bookname) ' Add "(" and ")"
tBook.Worksheets("M01").Range("A3:Q4000").Value = _
Workbooks("planning").Worksheets("M01").Range("A3:Q4000").Value
tBook.Close True
End Sub
เวลาบันทึกค่ามันเหมือนจะทำงานตามช่องที่เรากำหนด เช่น ช่องข้อมูลมี 16 ช่อง มันก็จะกระพริบ 16 ครั้งครับ มันไม่เหมือนตอนลองตัวอย่างครับ
อารย์ครับส่วนปัญหานี้มันเกิดจากอะไรครับ มันเหมือนกับว่ามันต้องเปิดปิดไฟล์ถึง 16 ครั้ง ถึงจะsaveงานเสร็จครับ
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 10:28 am
by snasui

ต้วอย่างการปรับ Code ครับ
Code: Select all
Private Sub Worksheet_Change(ByVal Target As Range)
Dim bookpath As String, bookname As String, tBook As Workbook
Application.EnableEvents = True
bookpath = "c:\plan\"
bookname = "planning.xlsm"
Set tBook = Workbooks.Open(Filename:=bookpath & bookname) ' Add "(" and ")"
tBook.Worksheets("M01").Range("A3:Q4000").Value = _
Workbooks("planning").Worksheets("M01").Range("A3:Q4000").Value
tBook.Close True
Application.EnableEvents = False
End Sub
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 12:14 pm
by sakajohn
พอเพิ่ม
Application.EnableEvents = Trueกับ
Application.EnableEvents = False เข้าไป มีปัญหา ดังนี้ครับ
1. ข้อมูลไม่บันทึกลงใน book planning ครับ
2. ที่ form กรอกข้อมูล ใน book plannew ตรง drop-down list ไม่ทำงานครับ เกี่ยวกับ code นี้หรือเปล่าครับ
Code: Select all
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
Dim xStr As String
Dim xCombox As OLEObject
Application.EnableEvents = False
Set xCombox = ActiveSheet.OLEObjects("TempCombo")
With xCombox
.ListFillRange = ""
.LinkedCell = ""
.Visible = False
.Top = Target.Top
End With
If InStr("$C$7$C$12$C$17", Target.Address) = 0 Then
Application.EnableEvents = True
Exit Sub
End If
If Target.Address = "$C$7" Then
xStr = "Sheet1!H2:H3"
ElseIf Target.Address = "$C$12" Then
xStr = "Sheet1!J2:J51"
ElseIf Target.Address = "$C$17" Then
xStr = "Sheet1!G2:G10"
End If
With xCombox
.Visible = True
.Left = Target.Left
.Top = Target.Top
.Width = Target.Width + 5
.Height = Target.Height + 5
.ListFillRange = xStr
.LinkedCell = Target.Address
End With
xCombox.Activate
Me.TempCombo.DropDown
Application.EnableEvents = True
End Sub
Private Sub TempCombo_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
Select Case KeyCode
Case 9
Application.ActiveCell.Offset(0, 1).Activate
Case 13
Application.ActiveCell.Offset(1, 0).Activate
End Select
End Sub
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 12:17 pm
by snasui

ขออภัยครับ
ผมวางสับกัน ต้องกำหนดเป็น False ไว้ก่อน ทำงานเสร็จกำหนดเป็น True ครับ
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 12:44 pm
by sakajohn
แก้ปัญหา ข้อ1กับข้อ2 ได้แล้วครับ แต่มันฏ้จะกลับไปเป็นเหมือน อารย์ครับส่วนปัญหานี้มันเกิดจากอะไรครับ มันเหมือนกับว่ามันต้องเปิดปิดไฟล์ถึง 16 ครั้ง ถึงจะsaveงานเสร็จครับ
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 12:58 pm
by snasui

แนบไฟล์ล่าสุดมาใหม่ครับ
ไฟล์ที่เป็นตัวรับข้อมูล ให้ลบ Code ทิ้งให้หมดแล้ว Save ให้นามสกุลเป็น .xlsx ครับ
ไฟล์ที่เป็นตัวรับข้อมูลไม่จำเป็นต้องมี Code อ่านทบทวนตามที่ผมตอบไปแล้วตามด้านบนครับ
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 1:29 pm
by sakajohn
ไฟล์ที่รับข้อมูลครับ ลบCODE ออกหมดครับ
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 1:34 pm
by snasui

เขียนนามสกุลไฟล์ตามที่ผมแจ้งไป แนบไฟล์ทั้งคู่มาใหม่ ไฟล์โปรแกรมจะต้องปรับ Code ให้ทำงานกับไฟล์นามสกุลใหม่นี้ให้เรียบร้อยด้วยครับ
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 1:39 pm
by sakajohn
ไฟล์โปรแกรมและไฟล์ข้อมูลครับ
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 1:42 pm
by snasui

ชุดล่าสุด ไฟล์ข้อมูลยังเป็นนามสกุล .xlsm อยู่เช่นเดิม ตรวจสอบดูใหม่อีกครั้งครับ
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 1:47 pm
by sakajohn
ขอโทษครับ แก้ใหม่ครับ
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 1:59 pm
by snasui

ตัวอย่างการปรับ Code ครับ
Code: Select all
Private Sub CommandButton1_Click()
Dim InputRange As Range, Target As Range
Application.EnableEvents = False
Set InputRange = Range("c2:c17")
Set Target = Worksheets([C17].Value).Range("b" & Rows.Count).End(xlUp)
For Each cll In InputRange
Target.Offset(1, c).Value = cll.Value
c = c + 1
Next
Range("c2:c17").Select
'Application.CutCopyMode = False
MsgBox "จัดเก็บข้อมูลเรียบร้อยแล้ว"
Selection.ClearContents
Range("C2").Select
ThisWorkbook.Save
Application.EnableEvents = True
End Sub
Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime
Posted: Sat Nov 26, 2016 2:05 pm
by sakajohn
อาจารย์ครับมันไม่บันทึกข้อมูลใน worbook planning.xlsx ครับ แต่อาการ dropdown หายแล้วครับ