Page 1 of 1

code vba ทำงานตลอดเวลาเมื่อวางข้อมูลจาก dde ลงไปใน excel

Posted: Fri Jun 12, 2020 4:59 pm
by sarawoot
สวัสดีครับ ขอเรียนถามครับ

ผมใช้ excel รับค่าภายนอกจาก OPC โดยใช้ DDE ค่าที่รับเข้ามาจะเป็นสถานะ failed ของอุปกรณ์ มีสถานะเลข 8 หรือ เลข 1 (คือมากกว่า 0)
เขียน code สร้าง looptable ทดสอบแสดงทาง msgbox สามารถแสดงได้ถูกต้องตามต้องการ
ใช้ Private Sub Worksheet_Calculate() ในการ call Looptable ให้ทำงาน

แต่เมื่อนำค่าจาก OPC เข้าวางใน excel ในคอลัมน์ที่กำหนดแล้ว code มันจะทำงานตลอดเวลา ทั้งๆที่ไม่มีค่าเปลี่ยนแปลงใดๆ เป็นเพราะอะไรครับ โดย code ผมลองทั้งกำหนด range ที่ต้องการ และไม่กำหนด range ก็ยังเป็นเหมือนเดิม

รบกวนช่วยชี้แนะด้วยครับว่าต้องปรับแก้ตรงไหน
ขอบคุณครับ

Code: Select all

Private Sub Worksheet_Calculate1()
Application.EnableEvents = False
        Call LoopTable
        Application.EnableEvents = True
End Sub
[\code]

Re: code vba ทำงานตลอดเวลาเมื่อวางข้อมูลจาก dde ลงไปใน excel

Posted: Fri Jun 12, 2020 8:54 pm
by puriwutpokin
ลองปรับดูครับตามนี้ว่าใช่ไหมครับ

Code: Select all

For i = 1 To Cells(Rows.Count, "a").End(xlUp).Row

Re: code vba ทำงานตลอดเวลาเมื่อวางข้อมูลจาก dde ลงไปใน excel

Posted: Sat Jun 13, 2020 7:22 am
by snasui
sarawoot wrote: Fri Jun 12, 2020 4:59 pm แต่เมื่อนำค่าจาก OPC เข้าวางใน excel ในคอลัมน์ที่กำหนดแล้ว code มันจะทำงานตลอดเวลา
:D Code นี้ใช้ Event Worksheet_Calculate มันจะทำงานก็ต่อเมื่อมีการคำนวณใด ๆ เกิดขึ้น

ผมทดสอบ Copy สูตรและลอง Edit สูตรในเซลล์ใด ๆ ก็ไม่พบว่ามีการทำงานซ้ำๆ คงต้องลอง Debug ที่ Event นี้ว่าทำงานในจังหวะไหนบ้างจะได้แก้ที่ต้นทางที่ก่อให้เกิดการคำนวณที่ไม่จำเป็นครับ

Re: code vba ทำงานตลอดเวลาเมื่อวางข้อมูลจาก dde ลงไปใน excel

Posted: Sat Jun 13, 2020 10:52 am
by sarawoot
ผมใช้ OPC system.net ในการดึงข้อมูลจาก OPC ใน System ที่ทำงานอีกทีนึง ที่ทำงานใช้ ABB 800xA
น่าจะเกิดจากตัว OPC system.net เองที่มันทำงานตลอดเวลา เพราะผมลองใช้ข้อมูลจากในตัว OPC เอง (simulate) เอามาวางใน excel โดยใช้ Event Worksheet_Calculate มันก็ทำงานตลอดเวลาเช่นกัน โดยที่ยังไม่ได้รับข้อมูลจาก OPC ของ System ที่ทำงาน

ขอบคุณมากครับ เดี๋ยวจะลองหาดูว่ามีวิธีแก้ไขที่ OPC อย่างไรบ้างครับ

Re: code vba ทำงานตลอดเวลาเมื่อวางข้อมูลจาก dde ลงไปใน excel

Posted: Mon Jun 15, 2020 4:51 pm
by sarawoot
สวัสดีครับ มา update ปัญหาที่เจอครับ จากปัญหาที่เมื่อนำ link จาก DDE มาวางใน excel ในคอลัมน์ที่กำหนด (column B) แล้วเขียน code ใน sheet1 code มันจะทำงานตลอดเวลา ทั้งๆที่ไม่มีข้อมูลใหม่วิ่งเข้ามา

ตอนนี้แก้ไขโดยการสร้าง Sheet2 ขึ้นมา และนำ link จาก DDE มาใส่ใน cell ที่กำหนดของ sheet2 เพิ่มด้วย โดยลบ code ใน sheet1 ออก แล้วเขียน code ที่ sheet2 แทน เพื่อเปรียบเทียบข้อมูล หลังจากนั้นให้ไป call looptable สามารถทำงานได้ตามเงื่อนไข คือเมมื่อมีข้อมูลใหม่เข้ามา

แต่ มีปัญหาที่เกิดขึ้นใหม่คือ เมื่อมันไป call looptable ตัว msgbox มันจะแสดงข้อความเท่ากับบรรทัดที่ในตาราง แทนที่มันจะแสดงแค่ครั้งเดียว นั่นเท่ากับว่าถ้ามี 14 บรรทัดในตาราง มันก็จะแสดง msgbox 14 ครั้ง ถึงจะหยุดแสดง

ตรงนี้ผมไม่แน่ใจว่าต้องไปปรับ code ตรงไหนครับ
code ที่ sheet2 ที่ผมใช้

Code: Select all

Option Explicit

Private Sub Worksheet_Calculate()
Application.EnableEvents = True
    If Range("B20").Value > 0 Then
        Call LoopTable
      Application.EnableEvents = False
    End If
End Sub
ส่วนอันนี้เป็น code ของ looptable ที่ผมใช้ครับ

Code: Select all

Public tbl As ListObject
Function GetTableData(projRow)

projDesc = tbl.DataBodyRange.Cells(projRow, tbl.ListColumns("Desc").Index)
projStatus = tbl.DataBodyRange.Cells(projRow, tbl.ListColumns("Status").Index)


projFullMsg = projDesc & " " & vbCrLf & _
"Çѹ·Õè : " & Now()


GetTableData = projFullMsg

End Function

Sub LoopTable()
Set tbl = Sheet1.ListObjects("ProjectTable")

'get value
Value = 0

'check number of rows
NumRows = tbl.DataBodyRange.Rows.Count

'Due Already
    CountDue = 0
    For i = 1 To NumRows
        projStatus = tbl.DataBodyRange.Cells(i, tbl.ListColumns("Status").Index)
        If projStatus > Value Then
        DueMsg = DueMsg & GetTableData(i) & Chr(13) & Chr(10)
        CountDue = CountDue + 1
        End If
    Next i
    
    MsgBox "Warning : " & CountDue & " items" & Chr(13) & Chr(10) & DueMsg
    
    
End Sub

Re: code vba ทำงานตลอดเวลาเมื่อวางข้อมูลจาก dde ลงไปใน excel

Posted: Mon Jun 15, 2020 4:55 pm
by sarawoot
เมื่อกี้ลืมแนบไฟล์ครับ

Re: code vba ทำงานตลอดเวลาเมื่อวางข้อมูลจาก dde ลงไปใน excel

Posted: Mon Jun 15, 2020 7:55 pm
by snasui
:D ถ้า Message Box แสดงทุกครั้งที่ Calculate และมันแสดง 14 ครั้งเท่ากับบรรทัดของข้อมูลก็แสดงว่า Event Calculate มันเกิดขึ้น 14 ครั้งครับ ลองดักจับที่ Procedure LoopTable ว่ามีการเรียกใช้กี่ครั้ง