Page 1 of 1

code ดักจับค่าที่เป็น 0 เกิดขึ้นกี่ครั้งใน cell นั้นๆ

Posted: Thu Mar 03, 2022 2:56 pm
by sarawoot
มีปัญหามาปรึกษาครับ

ที่ column A1 ถึง A10 แต่ละ cell ค่าจะเปลี่ยน 0-->1 สลับไปมาในแต่ละวัน

ต้องการนับว่า แต่ละ cell เปลี่ยนเป็น 0 กี่ครั้ง โดยจำนวนครั้ง จะใส่ไว้ที่ column C1 ถึง C10

ผมไปหา code มาชุดนึง มันจะนับทุกครั้งที่ค่ามีการเปลี่ยนแปลงซึ่งยังไม่ตรงตามที่ต้องการ
ที่อยากได้คือให้มันนับแค่ตอนที่เปลี่ยนเป็น 0 ครับ โดยที่สถานะค่าเริ่มต้น (default) ของแต่ละ cell คือ 1 เช่น

1 --> 0 แบบนี้คือนับ 1 ครั้ง
และจาก 0 --> 1 กลับมาเป็น 1 ยังไม่นับ
เมื่อ 1 -->0 เป็น 0 อีกครั้ง นับเป็นครั้งที่ 2

พยายามหาและลองแก้เองมานานแล้วครับ พอดีไม่ค่อยเก่งเลยยังแก้ไม่ได้
รบกวนด้วยครับ

ส่วนเวลาเปิดไฟล์แล้วให้ Column C1 ถึง C10 มันเป็น 0 เพื่อเริ่มนับใหม่ อันนี้ทำได้แล้วครับ

Re: code ดักจับค่าที่เป็น 0 เกิดขึ้นกี่ครั้งใน cell นั้นๆ

Posted: Thu Mar 03, 2022 8:42 pm
by snasui
:D ตัวอย่าง Code ครับ

Code: Select all

'ThisWorkbook

Private Sub Workbook_Open()
    a = Sheets("Sheet2").[a1:a10].Value
    Sheets("Sheet2").[C1:C10].Value = 0
End Sub

'Module1
Public a As Variant

'Worksheet2
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If Not Application.Intersect(Target, Range("A1:A10")) Is Nothing Then
        If a(Target.Row, Target.Column) = 1 And Target.Value = 0 Then
            Target.Offset(0, 2).Value = Target.Offset(0, 2).Value + 1
        End If
    End If
    a = Me.[a1:a10].Value
    Application.EnableEvents = True
End Sub

Re: code ดักจับค่าที่เป็น 0 เกิดขึ้นกี่ครั้งใน cell นั้นๆ

Posted: Fri Mar 04, 2022 8:19 am
by sarawoot
ขอบคุณครับ ใช้งานได้ตรงตามต้องการเลยครับ

แตติดปัญหาอยู่อย่างนึงคือค่าใน sheet 2 / Column A เป็นค่าสัญญาณจากเครื่องจักร ทำให้ code ที่ sheet2 ไม่สามารถใช้
Private Sub Worksheet_Change(ByVal Target As Range)

ต้องใช้เป็น
Private Sub Worksheet_Calculate()

กล่ายเป็นว่า code error ไปเลย ตอนนี้พยายามดัดแปลง code เพิ่มเติม

ไม่ได้แนบ code ที่ทดลองมาให้ เพราะกำลังพยายามในหลายๆรูปแบบ และเปิดดูตามเวบต่างๆ เช่น Stackoverflow ประกอบไปด้วยครับ

Re: code ดักจับค่าที่เป็น 0 เกิดขึ้นกี่ครั้งใน cell นั้นๆ

Posted: Fri Mar 04, 2022 9:12 pm
by sarawoot
ตอนนี้สามารถทดลองเปลี่ยนมาใช้ Private Sub worksheet_calculate() ได้แล้วครับ
โดยทดลองที่ A1 อย่างเดียว
โดยให้ A1 = K1
เพื่อใส่ค่าที่ K1 แล้ว A1 เปลี่ยนตาม
เมื่อใส่ 0 ที่ K1 ที่ A1 (default คือ 1) ก็จะเป็น 0 และ นับจำนวนครั้งใส่ใน C1

แต่ปัญหาอยู่ที่ ..... ทั้งๆที่ทดลองแค่ A1 และคิดว่าใช้ code ที่ระบุไว้ว่า ถ้าเป็นค่าที่เปลี่ยนเป็น 0 ที่ A1 ให้นับ แต่กลายเป็นว่า แม้เราจะใส่ค่า 0 ใน cell อื่น มันก็ยังนับรวมมาด้วย ยังหาทางแก้ code ไม่ได้ครับ

และจริงๆต้องฃการ A1 ถึง A10 อันนี้ก็ยังหาวิธีไม่ได้ครับ

Code: Select all

Private Sub worksheet_calculate()
Dim Target As Range
Set Target = Range("A1")


 Application.EnableEvents = False
    If Not Intersect(Target, Range("A1")) Is Nothing Then
        If Range("A1").Value = 0 Then
        Range("C1").Value = Range("C1").Value + 1
        End If
    End If

Application.EnableEvents = True

End Sub

Re: code ดักจับค่าที่เป็น 0 เกิดขึ้นกี่ครั้งใน cell นั้นๆ

Posted: Fri Mar 04, 2022 11:09 pm
by snasui
:D กรณีเป็น Code ควรจัดรูปแบบให้เป็นตัวอักษรแบบ Code ดูตัวอย่างที่กฎการใช้บอร์ดข้อ 5 ด้านบน :roll: ในโพสต์ก่อนหน้าผมปรับให้แล้ว

ตัวอย่างการปรับ Code จากประเด็นที่ถามมาตามด้านล่างครับ

Code: Select all

Dim r As Range
Dim c As Boolean

Private Sub worksheet_calculate()
'    Dim Target As Range
'    Set Target = Range("A1")
    If c = False Then
        c = True
        Exit Sub
    End If
    If r.Count > 1 Then Exit Sub
    Application.EnableEvents = False
    If Not Intersect(r, Me.[k1:k10]) Is Nothing Then
        If r.Value = 0 Then
           Me.Cells(r.Row, "c").Value = Me.Cells(r.Row, "c").Value + 1
        End If
    End If
    c = False
    Application.EnableEvents = True
End Sub

Private Sub Worksheet_Change(ByVal Target As Range)
    If c = False Then Exit Sub
    Set r = Target
    c = True
    r.Value = r.Value
End Sub

Re: code ดักจับค่าที่เป็น 0 เกิดขึ้นกี่ครั้งใน cell นั้นๆ

Posted: Thu Mar 10, 2022 10:19 am
by sarawoot
ได้แล้วครับ ขอบคุณมากครับ

พอจะอธิบายโค้ดคร่าวๆได้ไหมครับ พอดีมีกรณีแบบนี้ที่ต้องทำ จะได้ประยุกต์โค้ดไปตามเหตุการณ์ได้ พยายามตีความหมายแล้ว แต่บางบรรทัดไม่เข้าใจจริงๆครับ เช่น Me.Cells(r.Row, "c")

ขอบคุณอีกครั้งครับ

Re: code ดักจับค่าที่เป็น 0 เกิดขึ้นกี่ครั้งใน cell นั้นๆ

Posted: Thu Mar 10, 2022 12:11 pm
by snasui
:D Keyword Me ขึ้นกับว่าอยู่ใน Class ไหนคำว่า Me หมายถึง Class นั้น หากอยู่ในชีตใด ๆ จะหมายถึงชีตนั้น ๆ ครับ

กรณีไม่เข้าใจ Statement ใดกรุณายกมาถามเป็นราย Statement ไป ขออภัยในความไม่สะดวกครับ