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

อ่านดูแล้วเข้าใจว่าเป็นการนำข้อมูลโดยเลือกเฉพาะค่าที่ต้องการ หากเป็นเช่นนั้นจะต้องปรับ 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

ช่วยอธิบายเงื่อนไขด้วยครับว่าการเอาบรรทัดต่าง ๆ ไปนั้นโดยดูเงื่อนในคอลัมน์ใด เซลล์ใด อย่างไร ยกตัวอย่างเช่นต้องเป็น 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

เอาเป็นว่าถามไปตอบไปแล้วกันครับ ตามโจทย์ที่ถามมาทำดังนี้ครับ
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

ลองตามนี้ครับ
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

ปกติการ 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

ครับไม่ต้องสงสัยอื่นใด หากเป็นเช่นที่บอกมาก็เป็นเพราะสูตรแหละครับ ยิ่งเป็นสูตร 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 เปอร์เซนของอาจารญ์ก็พอ มันช่วยลดเวลาทำงานผมได้มากมาย ผมทำงานเสร้๗เร็วมาก ครับ