: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

มีปัญหาด้านประมวลผล

ฟอรัมถาม-ตอบปัญหาการใช้งาน 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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
yodpao.b
Gold
Gold
Posts: 1558
Joined: Tue Jul 19, 2011 2:47 pm
Excel Ver: 2013,excel standard

มีปัญหาด้านประมวลผล

#1

Post by yodpao.b »

" มีปัญหาด้านประมวลผล "
ปัญหา ประมวลช้า
ผมได้ทดลองหลายแบบแล้วพบสาเหตุที่ประมวลผลช้าเพราะมี VLOOKUP เข้ามาเกียว
แต่เมื่อ Copy ที่เป็น VLOOKUP แล้ว วางแบบค่า ปัญหาที่พบหายไป

:!: แต่เนื่องจากต้องการใช้ VLOOKUP ในการแสดงที่ฐานข้อมูล
:?: คำถาม จะทำอย่างไรให้ประมวลผลเร็วขึ้น

แสดงขั้นตอนการทำงาน
1.ไปที่หน้า "FormPrint" คลิกที่ช่อง Range("V15")
2.ฟอร์มจะขึ้นมาให้เห็น
3.คลิกที่ปุ่ม "จัดเก็บข้อมูล"
จบขั้นตอน จะเห็นว่าเครื่องทำงานประมวลช้ามาก
แต่ถ้า VLOOKUP ที่อยู่ในหน้า "DataReimbursement" วางแบบค่า ก็จะเป็นปกติ

ทั้งนี้ได้แนบไฟล์มาให้อาจาร์ยดูครับ
You do not have the required permissions to view the files attached to this post.
prawitj
Member
Member
Posts: 89
Joined: Wed Aug 31, 2011 11:35 am

Re: มีปัญหาด้านประมวลผล

#2

Post by prawitj »

vlookup ทำให้ Excel คำนวณช้าอยู่แล้วครับ เพราะมองทั้ง ทางกว้าง ทางลึก ลองใช้ index กับ match ดูครับ จะเร็วขึ้นเพราะมองทางลึกอย่างเดียว
User avatar
bank9597
Guru
Guru
Posts: 3868
Joined: Wed Aug 17, 2011 11:49 am

Re: มีปัญหาด้านประมวลผล

#3

Post by bank9597 »

:D ลองสูตรนี้แทนดูน่ะครับ ว่าจะดีขึ้นไหม

ที่ชีท DataReimbursement
เซลล์ I11 คีย์ =IF(C11="","",INDEX(DataEachUse!$H$11:$H$1000,MATCH(C11,DataEachUse!$C$11:$C$1000,0))) คัดลอกลงมา
เซลล์ T11 คีย์ =IF(C11="","",INDEX(DataEachUse!$I$11:$I$1000,MATCH(C11,DataEachUse!$C$11:$C$1000,0))) คัดลอกลงมา
เซลล์ U11 คีย์ =IF(C11="","",INDEX(DataEachUse!$J$11:$J$1000,MATCH(C11,DataEachUse!$C$11:$C$1000,0))) คัดลอกลงมา
เซลล์ V11 คีย์ =IF(C11="","",INDEX(DataEachUse!$L$11:$L$1000,MATCH(C11,DataEachUse!$C$11:$C$1000,0))) คัดลอกลงมา
เซลล์ W11 คีย์ =IF(C11="","",INDEX(DataEachUse!$M$11:$M$1000,MATCH(C11,DataEachUse!$C$11:$C$1000,0))) คัดลอกลงมา

หรือจะให้สะดวกขึ้นมาหน่อย ก็กำหนด Range Name ก่อนครับ เพื่อให้ดึงข้อมูลตามจริง ไม่ต้องกำหนดในสูตรเผื่อไป ทำให้ช้านั่นเอง
ตามไฟล์แนบครับ
You do not have the required permissions to view the files attached to this post.
Forum Rules
  1. อย่าใช้ภาษาแชทในการตอบ-ถาม
  2. ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
  3. ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
  4. ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
  5. หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
  6. แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
yodpao.b
Gold
Gold
Posts: 1558
Joined: Tue Jul 19, 2011 2:47 pm
Excel Ver: 2013,excel standard

Re: มีปัญหาด้านประมวลผล

#4

Post by yodpao.b »

ได้แล้วครับ เร็วขึ้นทันตาเห็นเลยครับ
ขอบคุณมากครับ
จุดนี้ใช้เวลาเกือบ 1 อาทิตย์ กว่าจะรู้ว่าปัญหามันเกิดตรงไหน หาวิธ๊แก้ไขก็ไม่ได้ เลยตัดสินใจโพสต์ถาม
ขอบคุณครับ
yodpao.b
Gold
Gold
Posts: 1558
Joined: Tue Jul 19, 2011 2:47 pm
Excel Ver: 2013,excel standard

Re: มีปัญหาด้านประมวลผล

#5

Post by yodpao.b »

เรียนอาจาร์ยครับผมลองทดลองการใช้ INDEX ก็ยังรู้สึกว่าทำงานช้าไม่ทันใจ
แต่ถ้าไม่ใช้สูตรก็จะทำงานเร็วมาก

คำถาม มีวิธีการอะไรบ้างให้ประมวลผลเร็วครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 30920
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: มีปัญหาด้านประมวลผล

#6

Post by snasui »

:lol: กรณีใช้สูตรจำนวนมากย่อมที่จะคำนวณช้าอยู่แล้วครับ ในงานเดียวกันหากต้องการให้คำนวณเร็วมีปัจจัยเข้ามาเกี่ยวข้องทั้ง Software และ Hardware

เช่น ด้าน Software ใช้ Excel 2010 ทำงานเร็วกว่า 2007 และ 2007 ทำงานเร็วกว่า 2003
ใช้ Windows 64Bits จะสามารถใช้ทรัพยากรของเครื่องได้ดีกว่า Windows 32Bits

ด้าน Hardware มี CPU ความเร็วสูง มี Ram ให้ใช้เยอะ คำนวณเร็วกว่า CPU ความเร็วต่ำ และ Ram น้อย
yodpao.b
Gold
Gold
Posts: 1558
Joined: Tue Jul 19, 2011 2:47 pm
Excel Ver: 2013,excel standard

Re: มีปัญหาด้านประมวลผล

#7

Post by yodpao.b »

ผมขอลองใช้แบบนี้ไปก่อนนะครับ
ผมก็เลยจะไม่ใช้สูตร
ที่นี้ก็มีปัญหาในการเก็บข้อมูล
ขั้นตอนการทำงานดังนี้
1.เรียกฟอร์ม ดังรูป
Untitled0.gif
2.แก้ไขตรงช่อง สถานที่ติดตั้ง เป็นอะไรก็ได้
Untitled1.gif
3.คลิก " จัดเก็บข้อมูล "
โปรแกรมจะทำการ Update ข้อมูลลงใน Sheet "DataEachUset"และ Sheet "DataReimbursement"
โดยใช้ ตัวแปรรหัส1 เป็นตัวอ้างอิง เทียบกับ TextBox10
ดังโคดด้านล่างนี้ (โคดนี้ใช้ Update ข้อมูลลงใน Sheet "DataEachUset" เท่านั้น

Code: Select all

Private Sub CommandButton6_Click()
       If TextBox21.Text <> "" And TextBox22.Text <> "" And TextBox23.Text <> "" And TextBox24.Text <> "" And TextBox31.Text <> "" _
            And TextBox32.Text <> "" And TextBox33.Text <> "" And TextBox34.Text <> "" And TextBox35.Text <> "" Then
                If MsgBox("     ท่านต้องการ  ปรับปรุงข้อมูล ไว้ในฐานข้อมูลนี้ใช่หรือไม่ ?    ", vbYesNo + vbQuestion, "การจัดเก็บข้อมูลนี้ มิใช่ เป็นการ Save โปรแกรม") = vbYes Then
                            Sheets("DataEachUse").Select
                            Range("C11").Select
                                 Do While True
                                        If ActiveCell.Value = TextBox10.Text Then
                                                ActiveCell.Offset(0, 6).Value = TextBox21.Text
                                                ActiveCell.Offset(0, 7).Value = TextBox22.Text
                                                ActiveCell.Offset(0, 8).Value = TextBox23.Text
                                                ActiveCell.Offset(0, 5).Value = DateSerial(Year(CDate(TextBox24)), Month(CDate(TextBox24)), Day(CDate(TextBox24)))
                                                ActiveCell.Offset(0, 9).Value = TextBox31.Text
                                                ActiveCell.Offset(0, 10).Value = TextBox32.Text
                                                ActiveCell.Offset(0, 11).Value = TextBox33.Text
                                                ActiveCell.Offset(0, 12).Value = TextBox34.Text
                                                ActiveCell.Offset(0, 13).Value = TextBox35.Text
                                                Unload Me
                                                MsgBox "ได้ทำการปรับปรุง Record ID  " & Sheets("CalPrint").Range("B5") & "  นี้เรียบร้อยแล้ว"
                                                Exit Sub
                                        End If
                                        ActiveCell.Offset(1, 0).Select
                                 Loop
                        End If
                    Else	
                                        MsgBox "                   ท่านต้องใส่ข้อมูลให้ครบทุกช่องถ้าไม่มีข้อมูลให้ใช้สัญลักษณ์" & " ( - ) " & "หรือแบบอื่นก็ได้                   ", vbExclamation, "    โปรแกรมการเบิกจ่ายหลอด T5 "	
                End If	
End Sub	
ส่วนการ Update ข้อมูลลงใน Sheet "DataReimbursement" ยังไม่ได้ทำ เนื่องจากติดปัญหาดังนี้
ยกตัวอย่างที่ GP-2554-00080 ซ้ำกันถึง 3 บรรทัด ต้องการ Update ทั้ง 3 บรรทัด

อยากให้อาจาร์ยกรุณาเขียนโคดให้ด้วยครับ

จุดประสงค์คือ ต้องการ อัพเดททั้ง 2 หน้า บรรทัดที่ใช้รหัส GP-2554-00080

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

Re: มีปัญหาด้านประมวลผล

#8

Post by snasui »

yodpao.b wrote:ส่วนการ Update ข้อมูลลงใน Sheet "DataReimbursement" ยังไม่ได้ทำ เนื่องจากติดปัญหาดังนี้
ยกตัวอย่างที่ GP-2554-00080 ซ้ำกันถึง 3 บรรทัด ต้องการ Update ทั้ง 3 บรรทัด

อยากให้อาจาร์ยกรุณาเขียนโคดให้ด้วยครับ

จุดประสงค์คือ ต้องการ อัพเดททั้ง 2 หน้า บรรทัดที่ใช้รหัส GP-2554-00080

ขอบคุณมากครับ
พร้อมกันนี้ได้แนบไฟล์มาด้วยครับ
ลองเขียนมาก่อนครับ เขียนแล้วติดตรงไหนก็ค่อยมาดูกันต่อครับ :P
yodpao.b
Gold
Gold
Posts: 1558
Joined: Tue Jul 19, 2011 2:47 pm
Excel Ver: 2013,excel standard

Re: มีปัญหาด้านประมวลผล

#9

Post by yodpao.b »

Code: Select all

Private Sub CommandButton6_Click()
                            Sheets("DataEachUse").Select
                            Range("C11").Select
                                 Do While True
                                        If ActiveCell.Value = TextBox10.Text Then
                                                ActiveCell.Offset(0, 6).Value = TextBox21.Text
                                                ActiveCell.Offset(0, 7).Value = TextBox22.Text
                                                ActiveCell.Offset(0, 8).Value = TextBox23.Text
                                                ActiveCell.Offset(0, 5).Value = DateSerial(Year(CDate(TextBox24)), Month(CDate(TextBox24)), Day(CDate(TextBox24)))
                                                ActiveCell.Offset(0, 9).Value = TextBox31.Text
                                                ActiveCell.Offset(0, 10).Value = TextBox32.Text
                                                ActiveCell.Offset(0, 11).Value = TextBox33.Text
                                                ActiveCell.Offset(0, 12).Value = TextBox34.Text
                                                ActiveCell.Offset(0, 13).Value = TextBox35.Text
                                                'Unload Me
                                                'MsgBox "ä´é·Ó¡ÒûÃѺ»Ãا Record ID  " & Sheets("CalPrint").Range("B5") & "  ¹ÕéàÃÕºÃéÍÂáÅéÇ"
                                                Exit Sub
                                        End If
                                        ActiveCell.Offset(1, 0).Select
                                 Loop
                                 
                            Sheets("DataReimbursement").Select
                            Range("C11").Select
                                 Do While True
                                        If ActiveCell.Value = TextBox10.Text Then
                                                ActiveCell.Offset(0, 17).Value = TextBox21.Text
                                                ActiveCell.Offset(0, 18).Value = TextBox22.Text
                                                ActiveCell.Offset(0, 6).Value = DateSerial(Year(CDate(TextBox24)), Month(CDate(TextBox24)), Day(CDate(TextBox24)))
                                                ActiveCell.Offset(0, 19).Value = TextBox31.Text
                                                ActiveCell.Offset(0, 20).Value = TextBox32.Text
                                                Unload Me
                                                MsgBox "ä´é·Ó¡ÒûÃѺ»Ãا Record ID  " & Sheets("CalPrint").Range("B5") & "  ¹ÕéàÃÕºÃéÍÂáÅéÇ"
                                                Exit Sub
                                        End If
                                        ActiveCell.Offset(1, 0).Select
                                 Loop
                        
End Sub
โดด ด้านบนได้ทดลองทำแต่ดูเหมือนว่ามันจะสั่งทำงานแค่นี้ครับ
Sheets("DataEachUse").Select
Range("C11").Select
Do While True
If ActiveCell.Value = TextBox10.Text Then
ActiveCell.Offset(0, 6).Value = TextBox21.Text
ActiveCell.Offset(0, 7).Value = TextBox22.Text
ActiveCell.Offset(0, 8).Value = TextBox23.Text
ActiveCell.Offset(0, 5).Value = DateSerial(Year(CDate(TextBox24)), Month(CDate(TextBox24)), Day(CDate(TextBox24)))
ActiveCell.Offset(0, 9).Value = TextBox31.Text
ActiveCell.Offset(0, 10).Value = TextBox32.Text
ActiveCell.Offset(0, 11).Value = TextBox33.Text
ActiveCell.Offset(0, 12).Value = TextBox34.Text
ActiveCell.Offset(0, 13).Value = TextBox35.Text
'Unload Me
'MsgBox "ä´é·Ó¡ÒûÃѺ»Ãا Record ID " & Sheets("CalPrint").Range("B5") & " ¹ÕéàÃÕºÃéÍÂáÅéÇ"
Exit Sub
End If
ActiveCell.Offset(1, 0).Select
Loop
ไม่รู้ว่าจะสั่งให้ทำงานไป update อีกหน้าได้อย่างไรครับ
User avatar
tupthai
Bronze
Bronze
Posts: 302
Joined: Sat Feb 04, 2012 2:49 pm

Re: มีปัญหาด้านประมวลผล

#10

Post by tupthai »

ถ้าผมเข้าใจถูกนะครับ :D
ผมลองเพิ่ม code

Code: Select all

Sheets("CalPrint").Select
Range("B11:X" & Cells(Rows.Count, 2).End(xlUp).Row).Copy Sheets("DataReimbursement").Cells(Rows.Count, 3).End(xlUp).Offset(1, 0)
ไว้ในนี้

Code: Select all

Private Sub CommandButton6_Click()
       If TextBox21.Text <> "" And TextBox22.Text <> "" And TextBox23.Text <> "" And TextBox24.Text <> "" And TextBox31.Text <> "" _
            And TextBox32.Text <> "" And TextBox33.Text <> "" And TextBox34.Text <> "" And TextBox35.Text <> "" Then
                If MsgBox("     ·èÒ¹µéͧ¡Òà  »ÃѺ»Ãا¢éÍÁÙÅ äÇéã¹°Ò¹¢éÍÁÙŹÕéãªèËÃ×ÍäÁè ?    ", vbYesNo + vbQuestion, "¡ÒèѴà¡çº¢éÍÁÙŹÕé ÁÔãªè à»ç¹¡Òà Save â»Ãá¡ÃÁ") = vbYes Then
                            Sheets("DataEachUse").Select
                            Range("C11").Select
                                 Do While True
                                        If ActiveCell.Value = TextBox10.Text Then
                                                ActiveCell.Offset(0, 6).Value = TextBox21.Text
                                                ActiveCell.Offset(0, 7).Value = TextBox22.Text
                                                ActiveCell.Offset(0, 8).Value = TextBox23.Text
                                                ActiveCell.Offset(0, 5).Value = DateSerial(Year(CDate(TextBox24)), Month(CDate(TextBox24)), Day(CDate(TextBox24)))
                                                ActiveCell.Offset(0, 9).Value = TextBox31.Text
                                                ActiveCell.Offset(0, 10).Value = TextBox32.Text
                                                ActiveCell.Offset(0, 11).Value = TextBox33.Text
                                                ActiveCell.Offset(0, 12).Value = TextBox34.Text
                                                ActiveCell.Offset(0, 13).Value = TextBox35.Text
                                                Unload Me
                                                
                                               Sheets("CalPrint").Select
                                               
                                                Range("B11:X" & Cells(Rows.Count, 2).End(xlUp).Row).Copy Sheets("DataReimbursement").Cells(Rows.Count, 3).End(xlUp).Offset(1, 0)
                                                MsgBox "ä´é·Ó¡ÒûÃѺ»Ãا Record ID  " & Sheets("CalPrint").Range("B5") & "  ¹ÕéàÃÕºÃéÍÂáÅéÇ"
                                                Exit Sub
                                        End If
                                        ActiveCell.Offset(1, 0).Select
                                 Loop
                        End If
                    Else
                                        MsgBox "                   ·èÒ¹µéͧãÊè¢éÍÁÙÅãËé¤Ãº·Ø¡ªèͧ¶éÒäÁèÁÕ¢éÍÁÙÅãËéãªéÊÑ­Åѡɳì" & " ( - ) " & "ËÃ×ÍẺÍ×蹡çä´é                   ", vbExclamation, "    â»Ãá¡ÃÁ¡ÒÃàºÔ¡¨èÒÂËÅÍ´ T5 "
                End If
End Sub
User avatar
bank9597
Guru
Guru
Posts: 3868
Joined: Wed Aug 17, 2011 11:49 am

Re: มีปัญหาด้านประมวลผล

#11

Post by bank9597 »

เรียนอาจาร์ยครับผมลองทดลองการใช้ INDEX ก็ยังรู้สึกว่าทำงานช้าไม่ทันใจ
แต่ถ้าไม่ใช้สูตรก็จะทำงานเร็วมาก

คำถาม มีวิธีการอะไรบ้างให้ประมวลผลเร็วครับ
:D สามารถใช้ VBA แทนได้ครับ
Forum Rules
  1. อย่าใช้ภาษาแชทในการตอบ-ถาม
  2. ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
  3. ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
  4. ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
  5. หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
  6. แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
User avatar
snasui
Site Admin
Site Admin
Posts: 30920
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: มีปัญหาด้านประมวลผล

#12

Post by snasui »

bank9597 wrote:
เรียนอาจาร์ยครับผมลองทดลองการใช้ INDEX ก็ยังรู้สึกว่าทำงานช้าไม่ทันใจ
แต่ถ้าไม่ใช้สูตรก็จะทำงานเร็วมาก

คำถาม มีวิธีการอะไรบ้างให้ประมวลผลเร็วครับ
:D สามารถใช้ VBA แทนได้ครับ
กรณีเงื่อนไขเหมือนกัน พื้นที่การทำงานเท่ากัน การใช้ VBA มักจะไม่เร็วกว่าการใช้ฟังก์ชั่นครับ :mrgreen:
User avatar
bank9597
Guru
Guru
Posts: 3868
Joined: Wed Aug 17, 2011 11:49 am

Re: มีปัญหาด้านประมวลผล

#13

Post by bank9597 »

กรณีเงื่อนไขเหมือนกัน พื้นที่การทำงานเท่ากัน การใช้ VBA มักจะไม่เร็วกว่าการใช้ฟังก์ชั่นครับ
:tt: :tt: :tt: ขอบคุณมากครับ :tt: :tt: :tt:
Forum Rules
  1. อย่าใช้ภาษาแชทในการตอบ-ถาม
  2. ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
  3. ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
  4. ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
  5. หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
  6. แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
yodpao.b
Gold
Gold
Posts: 1558
Joined: Tue Jul 19, 2011 2:47 pm
Excel Ver: 2013,excel standard

Re: มีปัญหาด้านประมวลผล

#14

Post by yodpao.b »

Code: Select all

Sheets("CalPrint").Select
Range("B11:X" & Cells(Rows.Count, 2).End(xlUp).Row).Copy Sheets("DataReimbursement").Cells(Rows.Count, 3).End(xlUp).Offset(1, 0)
ได้ทดลองทำแล้ว ผลที่ได้ข้อมูลไปใส่บรรทัดใหม่

ความต้องการคือนำข้อมูลไปใส่บรรทัดเดิมครับผม

นำข้อมูลหน้า CalPrint ไปใส่ที่หน้า DataReimbursement อย่างที่อาจาร์ยเข้าใจก็ได้ครับ
จะได้รูปแบบใหม่ในการ Update ข้อมูล

แต่ถ้าไม่ได้ก็ให้Updateจากในฟอร์มก็ได้ครับ
User avatar
tupthai
Bronze
Bronze
Posts: 302
Joined: Sat Feb 04, 2012 2:49 pm

Re: มีปัญหาด้านประมวลผล

#15

Post by tupthai »

Code: Select all

With Worksheets(2).Range("c11:c" & Cells(Rows.Count, 3).End(xlUp).Row)
    Set c = .Find(TextBox10.Text, LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            c.Offset(0, 1).Value = "---test----"
            c.Offset(0, 2).Value = TextBox22.Text
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With
2 บรรทัดนี่ตัวอย่าง
c.Offset(0, 1).Value = "---test----"
c.Offset(0, 2).Value = TextBox22.Text
:D
User avatar
snasui
Site Admin
Site Admin
Posts: 30920
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: มีปัญหาด้านประมวลผล

#16

Post by snasui »

:D กรณีต้องการ Update ให้ครบทุกรายการก็ควรจะ Loop ให้จบก่อนที่จะ Exit do, Exit For, Exit Sub หรือ Unload Me ยกเว้นต้องการ Update แค่รายการเดียว

ลองปรับ Code เป็นตามด้านล่างแล้วทดสอบดูครับ

Code: Select all

Private Sub CommandButton6_Click()
    Sheets("DataEachUse").Select
    Range("C11").Select
         Do While ActiveCell <> ""
            If ActiveCell.Value = TextBox10.Text Then
                ActiveCell.Offset(0, 6).Value = TextBox21.Text
                ActiveCell.Offset(0, 7).Value = TextBox22.Text
                ActiveCell.Offset(0, 8).Value = TextBox23.Text
                ActiveCell.Offset(0, 5).Value = DateSerial( _
                    Year(CDate(TextBox24)), Month(CDate(TextBox24)), Day(CDate(TextBox24)))
                ActiveCell.Offset(0, 9).Value = TextBox31.Text
                ActiveCell.Offset(0, 10).Value = TextBox32.Text
                ActiveCell.Offset(0, 11).Value = TextBox33.Text
                ActiveCell.Offset(0, 12).Value = TextBox34.Text
                ActiveCell.Offset(0, 13).Value = TextBox35.Text
'                Unload Me
'                MsgBox "ได้ทำการปรับปรุง Record ID  " & Sheets("CalPrint").Range("B5") & "  นี้เรียบร้อยแล้ว"
'                    Exit Sub
            End If
            ActiveCell.Offset(1, 0).Select
         Loop
         
    Sheets("DataReimbursement").Select
    Range("C11").Select
         Do While ActiveCell <> ""
            If ActiveCell.Value = TextBox10.Text Then
                ActiveCell.Offset(0, 17).Value = TextBox21.Text
                ActiveCell.Offset(0, 18).Value = TextBox22.Text
                ActiveCell.Offset(0, 6).Value = DateSerial( _
                    Year(CDate(TextBox24)), Month(CDate(TextBox24)), Day(CDate(TextBox24)))
                ActiveCell.Offset(0, 19).Value = TextBox31.Text
                ActiveCell.Offset(0, 20).Value = TextBox32.Text
'                Unload Me
'                MsgBox "ได้ทำการปรับปรุง Record ID  " & Sheets("CalPrint").Range("B5") & "  นี้เรียบร้อยแล้ว"
'                Exit Sub
            End If
            ActiveCell.Offset(1, 0).Select
         Loop
    MsgBox "ได้ทำการปรับปรุง Record ID  " & Sheets("CalPrint").Range("B5") & "  นี้เรียบร้อยแล้ว"
    Unload Me
End Sub
กรณีการเยื้องในบรรทัดที่เป็น Code ย่อยของ Code หลักให้กดแป้น Tab ไปสักครั้งก็พอครับ จะทำให้อ่าน Code ได้สะดวก

กรณีที่มีการเว้นวรรคจำนวนมากเพื่อความสวยงาม สามารถใช้ฟังก์ชั่น Space เข้ามาช่วยแทนการเคาะวรรคจำนวนมาก เช่น

Code: Select all

MsgBox Space(20) & "Please try again."
เทียบเท่ากับเคาะ Space bar ไป 20 ครั้งก่อนประโยค Please try again.

นอกจากนี้การตัดข้อความขึ้นบรรทัดใหม่ด้วยการเคาะ Space bar 1 ครั้งแล้วตามด้วยเครื่องหมาย _ จะทำให้ Code ไม่ล้นหน้า สะดวกต่อการอ่านครับ
User avatar
tupthai
Bronze
Bronze
Posts: 302
Joined: Sat Feb 04, 2012 2:49 pm

Re: มีปัญหาด้านประมวลผล

#17

Post by tupthai »

เห็นบอกว่าต้องการเรื่องความเร็ว
ผมจึงใช้ codeนี้ update ชีท DataReimbursement ที่ข้อมูล 30000 row ใช้เวลาไม่เกิน2วินาที
เพราะ Find หรือ ใช้ Ctrl+F ใช้หาข้อมูลได้รวดเร็วอยู่แล้ว
แต่ถ้าข้อมูลไม่มากก็ใช้แบบเดิมก็ได้ครับ

ลองใช้ดูครับ

ที่มา..http://msdn.microsoft.com/en-us/library ... 11%29.aspx

Code: Select all

Private Sub CommandButton6_Click()
 Sheets("DataReimbursement").Select
 With Range("c11:c" & Cells(Rows.Count, 3).End(xlUp).Row)
    Set c = .Find(TextBox10.Text, LookIn:=xlValues)
    If Not c Is Nothing Then
        firstAddress = c.Address
        Do
            c.Offset(0, 17).Value = TextBox21.Text
            c.Offset(0, 18).Value = TextBox22.Text
            c.Offset(0, 6).Value = DateSerial(Year(CDate(TextBox24)), Month(CDate(TextBox24)), Day(CDate(TextBox24)))
            c.Offset(0, 19).Value = TextBox31.Text
            c.Offset(0, 20).Value = TextBox32.Text
            Set c = .FindNext(c)
        Loop While Not c Is Nothing And c.Address <> firstAddress
    End If
End With
Unload Me

End Sub
yodpao.b
Gold
Gold
Posts: 1558
Joined: Tue Jul 19, 2011 2:47 pm
Excel Ver: 2013,excel standard

Re: มีปัญหาด้านประมวลผล

#18

Post by yodpao.b »

ขอบคุณมากครับใช้ได้ดีทั้ง 2 ตัวอย่างเลย
yodpao.b
Gold
Gold
Posts: 1558
Joined: Tue Jul 19, 2011 2:47 pm
Excel Ver: 2013,excel standard

Re: มีปัญหาด้านประมวลผล

#19

Post by yodpao.b »

กรณีที่มีการเว้นวรรคจำนวนมากเพื่อความสวยงาม สามารถใช้ฟังก์ชั่น Space เข้ามาช่วยแทนการเคาะวรรคจำนวนมาก

คำถาม ฟังก์ชั่น Space คืออะไร กดตรงไหน
User avatar
snasui
Site Admin
Site Admin
Posts: 30920
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: มีปัญหาด้านประมวลผล

#20

Post by snasui »

:shock:
yodpao.b wrote:กรณีที่มีการเว้นวรรคจำนวนมากเพื่อความสวยงาม สามารถใช้ฟังก์ชั่น Space เข้ามาช่วยแทนการเคาะวรรคจำนวนมาก

คำถาม ฟังก์ชั่น Space คืออะไร กดตรงไหน
ผมเขียนอธิบายไว้เรียบร้อยแล้ว
snasui wrote:กรณีที่มีการเว้นวรรคจำนวนมากเพื่อความสวยงาม สามารถใช้ฟังก์ชั่น Space เข้ามาช่วยแทนการเคาะวรรคจำนวนมาก เช่น
โค้ด: เลือกทั้งหมด
MsgBox Space(20) & "Please try again."

เทียบเท่ากับเคาะ Space bar ไป 20 ครั้งก่อนประโยค Please try again.
:roll: ลองอ่านทบทวนอีกครั้งครับ
Post Reply