:D snasui.com ยินดีต้อนรับ :D
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย :thup: สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ :arrow: ระบุ Version ของ Excel
:!: โปรดทราบ :!:
  1. กรุณาอ่านกฎการใช้บอร์ด (Forum rules) ในตำแหน่งด้านบนของแต่ละบอร์ด
  2. การสมัครสมาชิก การ Login การกู้คืนรหัสผ่าน
    1. สมัครสมาชิกดูขั้นตอนได้ที่ :arrow: สมัครสมาชิก
    2. Login เข้าระบบโดยคลิกปุ่ม Login ตรงมุมขวาบนของหน้านี้ :roll:
    3. การ Login ผ่าน Facebook ดูวิธีที่ :arrow: Login ผ่าน Facebook
    4. ลืมรหัสผ่านสามารถรับรหัสใหม่ได้ที่ :arrow: Reset รหัสผ่าน
  3. มีปัญหาการใช้งาน แจ้งผู้ดูแลระบบได้ที่ :arrow: ติดต่อผู้ดูแลระบบ
  4. กำหนดการตั้งค่าส่วนตัว เช่นตั้งค่าภาษาเป็นไทยหรืออังกฤษดูได้ที่ :arrow: ตั้งค่าส่วนตัว
  5. การตั้งและตอบกระทู้ดูได้ที่ :arrow: วิธีการตั้งและตอบกระทู้
  6. การจัดรูปแบบตัวอักษรด้วย bbcode ในช่องแสดงความคิดเห็นดูได้ที่ :arrow: จัดรูปแบบตัวอักษร
  7. กำหนดขนาดตัวอักษรใน Browser ดูได้ที่ :arrow: กำหนดขนาดตัวอักษรใน Browser

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

ฟอรัมถาม-ตอบปัญหาการใช้งาน MS Excel and VBA
Forum rules
  1. ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
  2. ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
  3. กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
  4. กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
  5. กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
  6. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
sarawoot
Member
Member
Posts: 10
Joined: Thu May 28, 2020 10:23 pm

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

#1

Post 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]
You do not have the required permissions to view the files attached to this post.
User avatar
puriwutpokin
Guru
Guru
Posts: 3792
Joined: Fri Jan 04, 2013 9:49 pm
Location: Bangkok
Excel Ver: MS.365

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

#2

Post by puriwutpokin »

ลองปรับดูครับตามนี้ว่าใช่ไหมครับ

Code: Select all

For i = 1 To Cells(Rows.Count, "a").End(xlUp).Row
:shock: :roll: :D
User avatar
snasui
Site Admin
Site Admin
Posts: 30944
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

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

#3

Post by snasui »

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

ผมทดสอบ Copy สูตรและลอง Edit สูตรในเซลล์ใด ๆ ก็ไม่พบว่ามีการทำงานซ้ำๆ คงต้องลอง Debug ที่ Event นี้ว่าทำงานในจังหวะไหนบ้างจะได้แก้ที่ต้นทางที่ก่อให้เกิดการคำนวณที่ไม่จำเป็นครับ
sarawoot
Member
Member
Posts: 10
Joined: Thu May 28, 2020 10:23 pm

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

#4

Post by sarawoot »

ผมใช้ OPC system.net ในการดึงข้อมูลจาก OPC ใน System ที่ทำงานอีกทีนึง ที่ทำงานใช้ ABB 800xA
น่าจะเกิดจากตัว OPC system.net เองที่มันทำงานตลอดเวลา เพราะผมลองใช้ข้อมูลจากในตัว OPC เอง (simulate) เอามาวางใน excel โดยใช้ Event Worksheet_Calculate มันก็ทำงานตลอดเวลาเช่นกัน โดยที่ยังไม่ได้รับข้อมูลจาก OPC ของ System ที่ทำงาน

ขอบคุณมากครับ เดี๋ยวจะลองหาดูว่ามีวิธีแก้ไขที่ OPC อย่างไรบ้างครับ
sarawoot
Member
Member
Posts: 10
Joined: Thu May 28, 2020 10:23 pm

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

#5

Post 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
sarawoot
Member
Member
Posts: 10
Joined: Thu May 28, 2020 10:23 pm

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

#6

Post by sarawoot »

เมื่อกี้ลืมแนบไฟล์ครับ
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 30944
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

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

#7

Post by snasui »

:D ถ้า Message Box แสดงทุกครั้งที่ Calculate และมันแสดง 14 ครั้งเท่ากับบรรทัดของข้อมูลก็แสดงว่า Event Calculate มันเกิดขึ้น 14 ครั้งครับ ลองดักจับที่ Procedure LoopTable ว่ามีการเรียกใช้กี่ครั้ง
Post Reply