Page 1 of 1

หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Sat Jun 22, 2013 12:26 am
by yodpao.b
หาผลลัพธ์ที่ต้องการไม่ได้
เรียนอาจาร์ยช่วยแก้ โคดให้ด้วยครับ
ผมเคยทำแล้วและได้ผลที่ต้องการ แต่เมื่อมาลองใช้ดูกลับใช้ไม่ได้
สังสัยคงทดลองไม่มากพอ

1.เปิดฟอร์ม UserForm7Borrow
2.แล้วเลือก "รายชื่อครุภัณฑ์"
3.แล้วเลือก"รหัส " เช่น 1000-111400084937-00ตัวที่1
สังเกตุที่ช่อง " สถานะเบิกใช้เครื่องมือ(TB30) " จะต้องขึ้นคำว่า "เบิกออกจากคลังแล้ว"
4.เปลี่ยนรหัสไปเรื่อย จนถึง 1000-111400084938-00ตัวที่1 จะต้องขึ้นคำว่า "เบิกได้"

ที่ขึ้นข้อความ "เบิกออกจากคลังแล้ว" หรือ "เบิกได้"
มันจะ ลิงค์กับเซล Sheets("ReportReturn").Range("V4") ครับ


โคดด้านล่างเป็นโคดที่ใช้อยู่ครับ

Code: Select all

Private Sub ListBox11_Click()
On Error Resume Next

Sheets("HistoryDurable").Select
MyListBox11 = ListBox11.Text
Range("F7").Select
      Do While True
            If MyListBox11 = ActiveCell.Value Then
                        TextBox1 = MyListBox11
                        TB22.Text = ActiveCell.Offset(0, 2).Value
                        TB23.Text = ActiveCell.Offset(0, 37).Value
                            TB23.Text = Format(TB23.Text, "#0.#0")
                        TB24.Text = ActiveCell.Offset(0, 38).Text
                        TB25.Text = ActiveCell.Offset(0, 1).Value
                        TB26.Text = ActiveCell.Offset(0, 6).Value
                        TB27.Text = ActiveCell.Offset(0, 36).Value
                        'TB28.Text = ActiveCell.Offset(0, 5).Value
                        TB29.Text = ActiveCell.Offset(0, 25).Value
                        TB31.Text = ActiveCell.Offset(0, 39).Value
                        TB32.Text = ActiveCell.Offset(0, 40).Text
                        
                        Sheets("ReportReturn").Range("O4") = MyListBox11
                        TB30.Text = Sheets("ReportReturn").Range("V4")
                        
                  Exit Do
            End If
               ActiveCell.Offset(1, 0).Select
 Loop

End Sub

Re: หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Sat Jun 22, 2013 1:16 am
by yodpao.b
ผมลองปิดExcel ทั้งหมดครับ แล้วลองเปิดไฟล์ทดลองดู ใช้ได้ดีครับ ผลลัพธ์ถูกต้อง
แต่พอลองเปิดไฟล์ที่ทำจริงทิ้งไว้ แล้วกลับไปเล่นไฟล์ทดลอง ผลลัพธ์ไม่ถูกต้อง และ
ที่สำคัญอีกอย่างพอปิดไฟล์ที่ทำจริง แล้วกลับไปเล่นไฟล์ทดลอง ผลลัพธ์ก็ยังไม่ถูกต้อง

ต้องปิด Excel แล้วลองเปิดไฟล์ทดลองถึงจะใช้ได้ครับ ไม่ทราบว่าเป็นเพราะอะไร

Re: หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Sat Jun 22, 2013 6:52 am
by snasui
:D การใช้ ActiveCell จะต้องมั่นใจได้ว่าขณะ Run Code เรากำลังทำงาน หรือ Active อยู่ที่ไฟล์เป้าหมาย อยู่ในชีทเป้าหมาย อยู่ในเซลล์เป้าหมาย กรณีเปิดไฟล์อื่นขึ้นมาทีหลัง ActiveCell ย่อมจะเป็นของไฟล์ที่เปิดขึ้นมาทีหลังสุด หากต้องการกลับไปยังไฟล์เป้าหมาย สามารถใช้ .Selectเข้ามาช่วยครับ ยกตัวอย่างเช่น

Code: Select all

Workbook(1).Select
Sheets(1).Select
Range("a1").Select

Re: หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Sat Jun 22, 2013 12:29 pm
by yodpao.b
เรียนอาจาร์ยครับ
อาจาร์ยช่วยแก้ไขให้หน่อยครับ
จากไฟล์ที่แนบชื่อ สมุดงาน2
Code นั้นน่าจะทำงานถูกต้อง
ผมเห็นส่วนที่ผิดปกติคือ ในเซล V4 Sheets "ReportReturn"ทำงานช้ามาก
untitled.JPG
พอสัก 3 วินาที ในเซล V4 Sheets "ReportReturn" ค่าที่ได้จะเปลี่ยนไป แต่ในฟอร์มไม่เปลี่ยนดังรุปด้านล่าง
untitled1.JPG
จะแก้ปัญหาอย่างไรครับ

ขั้นตอนการทำงาน
1.เปิด ฟอร์ม UserForm7Borrow
2.คลิกเลือก 1000-111400084937-00ตัวที่6 ผลลัพธ์ที่ได้ คือ "เบิกออกจากคลังแล้ว" ทั้งในฟอร์ม และ ในเซล V4 Sheets "ReportReturn" (ถูกต้อง)
3.คลิกเลือก 1000-111400084937-00ตัวที่7 ผลลัพธ์ที่ได้ คือ "เบิกออกจากคลังแล้ว" ทั้งในฟอร์ม และ ในเซล V4 Sheets "ReportReturn" (ถูกต้อง)
4.คลิกเลือก 1000-111400084937-00ตัวที่8 ผลลัพธ์ที่ได้
- เมื่อคลิกเลือกแล้วผลลัพธ์ในครั้งแรกจะได้ดังนี้ ในฟอร์มจะขึ้น "เบิกออกจากคลังแล้ว" ส่วนในเซล V4 Sheets "ReportReturn"
ก็จะขึ้น คำว่า "เบิกออกจากคลังแล้ว" ผลลัพธ์นี้ผิด
-เมือ่ทิ้งไว้ซัก 3 วินาที ผลลัพธใน Sheets "ReportReturn" จะเปลี่ยนไปเป็น "เบิกได้" แต่ในฟอร์มยังเหมือนเดินขึ้นคำว่า"เบิก
ออกจากคลังแล้ว"

หมายเหตุ ผลลัพธ์ที่ถุกต้องคือ ทั้งสองที่ต้องเปลี่ยนค่าพร้อมกันเป็น "เบิกได้"

Re: หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Sat Jun 22, 2013 1:09 pm
by snasui
:D ช่วยแจ้งผลว่าปัญหาที่ถามมาก่อนหน้านี้ตามด้านบนสามารถแก้ปัญหาได้แล้วหรือไม่ ถ้าไม่ ติดตรงไหน อย่างไร ค่อย ๆ ถามตอบกันไปทีละปัญหาให้จบ ๆ ไปครับ

Re: หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Sat Jun 22, 2013 1:35 pm
by yodpao.b
ปัญหาที่เคยถาม
ผมลองปิดExcel ทั้งหมดครับ แล้วลองเปิดไฟล์ทดลองดู ใช้ได้ดีครับ ผลลัพธ์ถูกต้อง
แต่พอลองเปิดไฟล์ที่ทำจริงทิ้งไว้ แล้วกลับไปเล่นไฟล์ทดลอง ผลลัพธ์ไม่ถูกต้อง และ
ที่สำคัญอีกอย่างพอปิดไฟล์ที่ทำจริง แล้วกลับไปเล่นไฟล์ทดลอง ผลลัพธ์ก็ยังไม่ถูกต้อง
ต้องปิด Excel แล้วลองเปิดไฟล์ทดลองถึงจะใช้ได้ครับ ไม่ทราบว่าเป็นเพราะอะไร
ตามที่อาจาร์ยได้อธิบายมา ผมก็พอเข้าใจหลักการอยู่ครับ คือ มันจะทำงาน
ActiveCell เป็นของไฟล์ที่เปิดขึ้นมาทีหลังสุด

ผมลองเปิดไฟล์เฉพาะ สมุดงาน1 ก็ทำงานได้ตามปกติครับ
หลังจากนั้นก็ลองเปิด เฉพาะ สมุดงาน 2 ผลลัพธ์ผิดจากที่ต้องการ
เพราะ คำลั่ง if ใน V4 ทำงานช้า ช่วยช่วยแก้ไขให้ด้วยครับ งงมาก ทำไมมันถึงไม่ทำงานตามขั้นตอน

Re: หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Sat Jun 22, 2013 1:46 pm
by snasui
:D แนบไฟล์ที่ได้ปรับ Code แล้วมาด้วยครับ

Re: หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Sat Jun 22, 2013 2:00 pm
by yodpao.b
สงสัยโคดนี้จะผิดครับ เพราะคำสั่ง if ใน V4 ทำงานช้ามาก จึงทำให้ฟอร์มนำค่าเดิมมาแสดง

Code: Select all

Private Sub ListBox11_Click()
On Error Resume Next

Sheets("HistoryDurable").Select
MyListBox11 = ListBox11.Text
Range("F7").Select
      Do While True
            If MyListBox11 = ActiveCell.Value Then
                        TextBox1 = MyListBox11
                        TB22.Text = ActiveCell.Offset(0, 2).Value
                        TB23.Text = ActiveCell.Offset(0, 37).Value
                            TB23.Text = Format(TB23.Text, "#0.#0")
                        TB24.Text = ActiveCell.Offset(0, 38).Text
                        TB25.Text = ActiveCell.Offset(0, 1).Value
                        TB26.Text = ActiveCell.Offset(0, 6).Value
                        TB27.Text = ActiveCell.Offset(0, 36).Value
                        'TB28.Text = ActiveCell.Offset(0, 5).Value
                        TB29.Text = ActiveCell.Offset(0, 25).Value
                        TB31.Text = ActiveCell.Offset(0, 39).Value
                        TB32.Text = ActiveCell.Offset(0, 40).Text
                        
                        Sheets("ReportReturn").Select
                        Range("O4") = MyListBox11
                        TB30.Text = Range("V4")
                        
                  Exit Do
            End If
               ActiveCell.Offset(1, 0).Select
 Loop

End Sub

Re: หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Sat Jun 22, 2013 2:48 pm
by snasui
:D ลองปรับ Code เป็นตามด้านล่างครับ

Code: Select all

Private Sub ListBox11_Click()
    'On Error Resume Next
    
    Sheets("HistoryDurable").Select
    MyListBox11 = ListBox11.Text
    Range("F7").Select
    Do
        If MyListBox11 = ActiveCell.Value Then
            TextBox1 = MyListBox11
            TB22.Text = ActiveCell.Offset(0, 2).Value
            TB23.Text = ActiveCell.Offset(0, 37).Value
            TB23.Text = Format(TB23.Text, "#0.#0")
            TB24.Text = ActiveCell.Offset(0, 38).Text
            TB25.Text = ActiveCell.Offset(0, 1).Value
            TB26.Text = ActiveCell.Offset(0, 6).Value
            TB27.Text = ActiveCell.Offset(0, 36).Value
            'TB28.Text = ActiveCell.Offset(0, 5).Value
            TB29.Text = ActiveCell.Offset(0, 25).Value
            TB31.Text = ActiveCell.Offset(0, 39).Value
            TB32.Text = ActiveCell.Offset(0, 40).Text
            
            Sheets("ReportReturn").Select
            DoEvents
            Range("O4") = MyListBox11
            TB30.Text = Range("V4")
            
            Exit Do
        End If
        ActiveCell.Offset(1, 0).Select
    Loop Until ActiveCell = ""

End Sub
สังเกตการเยื้อง Code ด้วยว่าโดยทั่วไปแล้วเยื้องแต่พอสมควร Code ที่อยู่ภายใต้ Code อื่นเท่านั้นที่จะเยื้องเข้าไป หากระดับเดียวกันไมจำเป็นต้องเยื้อง เพราะจะทำให้อ่านแล้วเข้าใจยากครับ

Re: หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Sat Jun 22, 2013 3:03 pm
by yodpao.b
ใช้ได้ครับ ขอบคุณครับ
เรียนถามอาจารย์ครับ

Code: Select all

DoEvents

Code: Select all

Loop Until ActiveCell = ""
code ด้านบน หมายถึงอะไรครับ

Re: หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Sat Jun 22, 2013 3:22 pm
by snasui
:D DoEvent เป็นการส่งการประมวลผลไปยัง Application เมื่อประมวลผลจบค่อยทำตาม Statement ถัดไปใน Userform ที่เป็นปัญหาเพราะว่า Application ยังประมวลผลไม่จบแต่ Userform เอาผลลัพธ์มาใช้ก่อนแล้ว

Loop Until ActiveCell = "" ความหมายตรงตัวอยู่แล้วคือ Loop ไปจนกระทั่งพบว่า ActiveCell เป็นค่าว่างจึงหยุด Loop ครับ

Re: หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Sat Jun 22, 2013 3:35 pm
by yodpao.b
ครับ เข้าใจแล้วครับ

Re: หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Mon Jun 24, 2013 10:19 am
by yodpao.b
เรียนอาจารย์ครับ
ผมสงสัยว่าเครื่องที่บ้าน ต้องใช้คำสั่ง " DoEvent " ถึงจะทำงานถูกต้อง
แต่เครื่องที่ทำงานไม่จำเป็นต้องใช้คำสั่ง " DoEvent " ก็ทำงานถูกต้องเหมือนกัน
เพราะอะไรครับ

Re: หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Mon Jun 24, 2013 12:15 pm
by snasui
:D ถ้าเครื่องทำงานเร็ว มีการ Return ค่ากลับมาเร็ว จะไม่ใช้ DoEvents ก็ไม่น่าจะมีปัญหาครับ

Re: หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Mon Jun 24, 2013 12:46 pm
by yodpao.b
เข้าใจแล้วครับ

Re: หาผลลัพธ์ที่ต้องการไม่ได้

Posted: Wed Jun 26, 2013 6:59 am
by วังวู ช่ง
snasui wrote::D DoEvent เป็นการส่งการประมวลผลไปยัง Application เมื่อประมวลผลจบค่อยทำตาม Statement ถัดไปใน Userform ที่เป็นปัญหาเพราะว่า Application ยังประมวลผลไม่จบแต่ Userform เอาผลลัพธ์มาใช้ก่อนแล้ว

Loop Until ActiveCell = "" ความหมายตรงตัวอยู่แล้วคือ Loop ไปจนกระทั่งพบว่า ActiveCell เป็นค่าว่างจึงหยุด Loop ครับ
:thup: :cp:

กำลังศึกษา VBA อย่างหนัก :cp: