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

การใช้ 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

ช่วยแจ้งผลว่าปัญหาที่ถามมาก่อนหน้านี้ตามด้านบนสามารถแก้ปัญหาได้แล้วหรือไม่ ถ้าไม่ ติดตรงไหน อย่างไร ค่อย ๆ ถามตอบกันไปทีละปัญหาให้จบ ๆ ไปครับ
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

แนบไฟล์ที่ได้ปรับ 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

ลองปรับ 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 ด้านบน หมายถึงอะไรครับ
Re: หาผลลัพธ์ที่ต้องการไม่ได้
Posted: Sat Jun 22, 2013 3:22 pm
by snasui
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

ถ้าเครื่องทำงานเร็ว มีการ 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:
DoEvent เป็นการส่งการประมวลผลไปยัง Application เมื่อประมวลผลจบค่อยทำตาม Statement ถัดไปใน Userform ที่เป็นปัญหาเพราะว่า Application ยังประมวลผลไม่จบแต่ Userform เอาผลลัพธ์มาใช้ก่อนแล้ว
Loop Until ActiveCell = "" ความหมายตรงตัวอยู่แล้วคือ Loop ไปจนกระทั่งพบว่า ActiveCell เป็นค่าว่างจึงหยุด Loop ครับ
กำลังศึกษา VBA อย่างหนัก
