Page 1 of 1

macro recordbill แยก Deposit ขอบคุณครับ

Posted: Wed Jun 08, 2011 1:38 pm
by godman
จากโค้ตนี้ ผมรู้สึกว่ามันจะเอาข้อมูลจาก Template ทั้ง 12 แถวแต่ถ้าผมจะทำให้มันนับจำนวนข้อมูลแถวที่จะเอาเป็น CASE ไปผมต้องปรับเปลี่ยน macro นี้อย่างไรครับ สมมุติว่า cell n1 คือนับจำนวนแถวที่จะเอา ต้องขอขอบคุณผู้แบ่งปัน Record Bill ครับเพราะผมสามารถนำมาใช้ในลักษณะงานของผมต่อไปได้ ผมกำลังต้องาารให้ macro ทำแบบนี้พอดีเลย

Code: Select all

Sub RecordTraining()
Dim rs As Range, rt As Range
Dim rs1 As Range, rt1 As Range
Dim i As Integer
Worksheets("Form1").Range("L1") _
    = Application.Max(Worksheets("Database") _
        .Range("C:C")) + 1
With Worksheets("Template")
    i = Application.CountIf( _
        .Range("M3:M15"), ">0")
    Set rs = .Range("A2:M" & 12 + i)
    Set rs1 = .Range("A21:K21")
End With
    Set rt = Worksheets("Database") _
        .Range("A65536").End(xlUp).Offset(1, 0)
    Set rt1 = Worksheets("Score") _
        .Range("A65536").End(xlUp).Offset(1, 0)
    rs.Copy
    rt.PasteSpecial xlPasteValues
    rs1.Copy
    rt1.PasteSpecial xlPasteValues
    Application.CutCopyMode = False
MsgBox "Finish"
End Sub

Re: macro recordbill แยก Deposit ขอบคุณครับ

Posted: Wed Jun 08, 2011 1:51 pm
by snasui
:D อ่านดูแล้วเข้าใจว่าเป็นการนำข้อมูลโดยเลือกเฉพาะค่าที่ต้องการ หากเป็นเช่นนั้นจะต้องปรับ Code ใหม่เพื่อให้ Loop ครับ ควรมีตัวอย่างเงื่อนไขและตัวอย่างข้อมูลประกอบเพื่อสะดวกในการเขียน Code ครับ

Re: macro recordbill แยก Deposit ขอบคุณครับ

Posted: Wed Jun 08, 2011 2:26 pm
by godman
ขอโทษครับ ผมไม่ได้ส่งไฟล์ไป นี่คือไฟล์ตัวอย่างครับ

Re: macro recordbill แยก Deposit ขอบคุณครับ

Posted: Wed Jun 08, 2011 2:53 pm
by snasui
:D ช่วยอธิบายเงื่อนไขด้วยครับว่าการเอาบรรทัดต่าง ๆ ไปนั้นโดยดูเงื่อนในคอลัมน์ใด เซลล์ใด อย่างไร ยกตัวอย่างเช่นต้องเป็น True ทั้ง 3 ช่องหรือ ฯลฯ

Re: macro recordbill แยก Deposit ขอบคุณครับ

Posted: Wed Jun 08, 2011 3:02 pm
by godman
เอาเฉพาะข้อมูลใน sheet template ที่มีชื่อ ทักษะ J1-J11 เป็นตัวกำหนด ครับ จะเห็นว่ามันมีข้อมูลที่ดึงมาคือ J1-J15 แต่ผมไม่ต้องการ J12-J15 คือสนใจเฉพาะข้อมูลที่มีความหมายครับ

Re: macro recordbill แยก Deposit ขอบคุณครับ

Posted: Wed Jun 08, 2011 3:15 pm
by snasui
:D เอาเป็นว่าถามไปตอบไปแล้วกันครับ ตามโจทย์ที่ถามมาทำดังนี้ครับ

1. ที่ชีท Template เซลล์ N1 คีย์เพื่อนับว่าจะต้องนำไปใช้กี่บรรทัด

=COUNTIF(J2:J15,"*?")+1

Enter

2. ตัวอย่างการเปลี่ยน Code สำหรับการ Copy ข้อมูลตามด้านล่าง

Code: Select all

With Worksheets("Template")
    i = Application.CountIf( _
        .Range("M3:M15"), ">0")
    Set rs = .Range("A2:H" & .Range("N1"))
    Set rs1 = .Range("A21:K21")
End With
3. Code ไม่ควรวางอยู่ที่ ThisWorkbook ให้นำไปวางที่ Module ปกติครับ การสร้าง Module ปกติให้คลิกเมนู Insert > Module

Re: macro recordbill แยก Deposit ขอบคุณครับ

Posted: Wed Jun 08, 2011 3:37 pm
by godman
ขอบพระคุณมากครับใช้ได้แล้วครับ

Re: macro recordbill แยก Deposit ขอบคุณครับ

Posted: Fri Jun 24, 2011 8:20 pm
by godman
อาจารญครับจาก โค้ดนี้ ถ้าเราจะเอาข้อมูลโดยเลือกเฉพาะค่าที่ต้องการ ในส่วนที่ A21:K21 ถ้าผมเปลี่ยนเป็นจะเอา A21:K25 คือเอา 5 แถวแต่เราต้องการให้มันยืดหยุ่น ถ้าไม่มีข้อมูลในแถวที่เหลือ ก็ไม่ต้องเอาไปจะได้ไม่ต้องไปคอยลบในดาต้า คล้ายๆจะกำหนด rang ใน rs1 เราจะต้องเปลี่ยน macro อย่างไรบ้างครับ

Code: Select all

With Worksheets("Template")
    i = Application.CountIf( _
        .Range("M3:M15"), ">0")
    Set rs = .Range("A2:H" & .Range("N1"))
    Set rs1 = .Range("A21:K21")
End With

Re: macro recordbill แยก Deposit ขอบคุณครับ

Posted: Fri Jun 24, 2011 8:59 pm
by snasui
:D ลองตามนี้ครับ

1. ที่ชีท Template เซลล์ A19 คีย์สูตร

=COUNTIF(A21:A65536,"<>")

2. เปลี่ยน code เป็นตามด้านล่าง

Code: Select all

With Worksheets("Template")
    i = Application.CountIf( _
        .Range("M3:M15"), ">0")
    Set rs = .Range("A2:M" & 12 + i)
    Set rs1 = .Range("A21:K" & 21 + .Range("A19") - 1)
End With

Re: macro recordbill แยก Deposit ขอบคุณครับ

Posted: Fri Jun 24, 2011 9:16 pm
by godman
อาจารย์ครบ ขอบคุณครับ วันนี้ผมทำไฟล์เพื่อจัดการกับ manpower planing based on skill performance ทัังวันเลย แต่ว่ามาตายตอนจบ เพราะผมเล่น ลิ้งข้อมูลมาจาก 5 แหล่งในหลากหลายโฟลเดอรื เครื่องไม่ทำงานเลยครับ รอเป็นชั่วโมง เครียดมากเลยครับ อาจารย์พอมีคำแนะนำไหมครับ คร้นจะให้คนกรอกข้อมูลมาใช้ไฟล์เดียวกันก็เกรงว่าจะไม่ได้เพราะอยู่คนละแผนกกันและไฟล์มันก็ใช้ได้ทีละคนครับ ทำไมไฟล์งานผมจึงทำงานช้ายังกับเต่าเป็นช่วโมงก็ยังไม่ update ให้ ผมใช้ 2007 ครบ
อ๋อ คำว่า ครบ นี่หมายถึง ครับ นะครับ คีย์บอร์ดมันไกล้จะพัังแล้ว

Re: macro recordbill แยก Deposit ขอบคุณครับ

Posted: Fri Jun 24, 2011 9:38 pm
by snasui
:D ปกติการ Link หลาย Folder ก็ไม่ได้ทำให้ไฟล์ทำงานช้า เว้นเสียแต่ว่าไฟล์มีสูตรจำนวนมาก ยิ่งเป็นสูตร Vlookup แบบตรงตัวก็จะยิ่งคำนวณช้า อันที่จริง Excel 2007 ก็ได้ปรับให้คำนวณเร็วขึ้นสำหรับกรณีนี้แล้ว การคำนวณช้าเป็นชั่วโมงแสดงว่าไม่ปกติแล้วครับ ไม่ทราบว่าในไฟล์ทั้งหลายที่เชื่อมโยงกันมีสูตรซับซ้อนจำนวนมากหรือไม่ครับ

นอกจากนั้นแล้วก็ให้สังเกตว่าได้เปิดโปรแกรมไว้หลายโปรแกรมหรือไม่เพราะอาจจะเป็นการแบ่ง Memory ไปใช้ ทำให้ Excel ใช้ไม่พอ จากประสบการณ์สำหรับเรื่องการ Link ไฟล์จากหลายไฟล์หลาย Folder ก็มีปัญหาว่าช้าบ้างแต่ไม่ช้าถึงขนาดนั้น ผมเปิดไฟล์ทำงานแต่ละครั้งนับสามสิบไฟล์พร้อม ๆ กัน ทั้งมีการ Link ระหว่างไฟล์จำนวนมาก มีสูตรหลากหลายยากง่ายแตกต่างกันไปก็ยังทำงานได้ครับ

Re: macro recordbill แยก Deposit ขอบคุณครับ

Posted: Fri Jun 24, 2011 9:50 pm
by godman
ใช่ ผมใช้สูตรมากจริงๆ เช่นสูตรดึงข้อมูลทั้ง sheet เช่น if(isnumber(search)...lookup(9.9999999 ) แต่ผมเลือกท้งฟิลล์ ไม่รู้ว่ามีผลหรือไม่ แล้วก็ index matxh match ก็ใช้เยอะมาก ครับ ไม่ทราบว่าสิ่งเหล่าน้มีผลทำให้ช้า หรือไม่

Re: macro recordbill แยก Deposit ขอบคุณครับ

Posted: Fri Jun 24, 2011 10:00 pm
by snasui
:D ครับไม่ต้องสงสัยอื่นใด หากเป็นเช่นที่บอกมาก็เป็นเพราะสูตรแหละครับ ยิ่งเป็นสูตร Array ด้วยก็จะเป็นตัวดึงให้ช้าลง

ปกติการใช้สูตรใด ๆ ก็ตามควรใช้ให้กระชับที่สุด ยกตัวอย่างเช่นขอบเขตข้อมูลมีแค่ไหนก็ใช้เท่านั้นและไม่ต้องลากสูตรเผื่อไว้ การกำหนดขอบเขตข้อมูลก็ควรจะใช้การให้ชื่อกับช่วงเซลล์เข้ามาช่วยเพื่อให้ช่วงข้อมูลในสูตรปรับเพิ่มลดตามจำนวนที่มี

กรณีการใช้สูตรแบบเผื่อช่วงข้อมูลกับการกำหนดช่วงข้อมูลเพียงเท่าที่มี ยกตัวอย่างอย่างเช่น

=Vlookup(A1,A:Z,10,0) กับ Vlookup(A1,A1:Z1000,10,0) ให้ความเร็วที่ต่างกันอย่างมาก

นอกจากนี้การใช้สูตรซ้ำ ๆ กันควรแยกออกมาต่างหาก ยกตัวอย่างเช่น

=Index(A:A,Match(Today()+B1,B:B,0)) แล้ว Copy ลงไปจำนวนมาก จะต่างกับ =Index(A:A,Match($C$1+B1,B:B,0)) ความเร็วจะต่างกันอย่างมากมายมหาศาล สำหรับกรณีที่สองเป็นการคี่ย์ Today() ไว้ที่ C1 แล้วค่อยนำไปใช้ ส่วนกรณีแรกเป็นการคีย์สูตร Today() ทุกสูตร

ฟังก์ชั่น Today และอื่น ๆ อีกมากมายเป็น Volatile Function คือถูกกระทบให้เปลี่ยนแปลงได้โดยง่าย แม้การขยับความกว้างเซลล์ใด ๆ ก็คำนวณทันที หากใช้จำนวนมากทำให้การคำนวณช้ามาก Volatile ฟังก์ชั่นสามารถดูเพิ่มเติมจากที่นี่ครับ http://www.decisionmodels.com/calcsecretsi.htm

Re: macro recordbill แยก Deposit ขอบคุณครับ

Posted: Fri Jun 24, 2011 10:30 pm
by godman
รู้ไหมครับ ว่าเวบของอาจารย์เปลี่ยนชีวิตผม ผมกลายเป็นคน crazy excel ขั้นบ้า กลับจากงานที่โรงงานมา ก็ต้องมาตามดูว่าคนอื่นกระทู้เรื่องอะไรบ้างแล้วก็น่ง load ไปศีกษา ขอบคุณมากครับ หวีงว่าผมจะเก่งได้ซัก 10 เปอร์เซนของอาจารญ์ก็พอ มันช่วยลดเวลาทำงานผมได้มากมาย ผมทำงานเสร้๗เร็วมาก ครับ