Page 3 of 4

Re: Copy Sheet1 ไป Sheet2 แบบข้าม workbook แบบrealtime

Posted: Fri Nov 25, 2016 11:12 pm
by snasui
:D จาก 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
มันก็ไม่บันทึกให้ครับ
:D เป็นไปไม่ได้ตั้งแต่มีคนมาเปิด 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
:D ถ้าเขียน 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
:D ต้วอย่างการปรับ 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
:o ขออภัยครับ

ผมวางสับกัน ต้องกำหนดเป็น 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
:D แนบไฟล์ล่าสุดมาใหม่ครับ

ไฟล์ที่เป็นตัวรับข้อมูล ให้ลบ 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
:D เขียนนามสกุลไฟล์ตามที่ผมแจ้งไป แนบไฟล์ทั้งคู่มาใหม่ ไฟล์โปรแกรมจะต้องปรับ 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
:D ชุดล่าสุด ไฟล์ข้อมูลยังเป็นนามสกุล .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
:D ตัวอย่างการปรับ 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 หายแล้วครับ