Page 1 of 1

การ replace ข้อมูลโดย code vba

Posted: Sat Jul 21, 2012 11:41 pm
by natthaporn
From FJAN

To FFEB

A B C
11 22.00
22 44.00
33 66.00

ดิฉันอยากจะขอคำแนะนำท่านผู้รู้ เกี่ยวกับเรื่องการเขียน code เพื่อ replace ข้อมูลคะ
ข้อมูลที่ต้องการ replace คือ FJAN, FFEB, FMAR,… ซึ่งจะต้องทำการ replace สลับไปมาระหว่างกัน
โดยเงื่อนไขตามนี้คะ
ดิฉันจะต้องดูว่าสูตร ณ ปัจจุบันอยู่ที่สูตร ถ้าอยู่ที่ FJAN และดิฉันต้องการที่จะเปลี่ยนเป็น FFEB
ก็จะเลือกที่ C2 = FJAN และที่ C4 = FFEB
โดยดิฉันทดลองเขียน code ได้ตามนี้คะ

Private Sub CommandButton1_Click()
If ActiveSheet.Range("C2") = "FJAN" And Range("C4") = "FFEB" Then
Application.Goto Reference:="Source"
Selection.Replace What:=ActiveSheet.Range("C2"), Replacement:=ActiveSheet.Range("C4"), LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
End If
End Sub

ซึ่ง code ที่ดิฉันเขียนสามารถ run ได้เพียงแค่ครั้งเดียว แต่ดิฉันต้องการที่จะเปลี่ยนจาก FFEB เป็นเดือนอื่น
จะต้องเขียน code อย่างไรคะ
การที่ดิฉันไม่ replace ข้อมูลแบบ mannual คือ กด ctrl+H เนื่องจาก file ดังกล่าวนี้จะมีผู้อื่นใช้ร่วมด้วยหลายคน
ซึ่งบางคนยังไม่ค่อยคล่องเกี่ยวกับการใช้ excel เท่าได้นัก และข้อมูลที่จะ replace ก็มีเป็นจำนวนมากคะ

Re: การ replace ข้อมูลโดย code vba

Posted: Sun Jul 22, 2012 7:12 am
by snasui
:D ลองปรับ Code โดยนำ If ออกไป เนื่องจาก Code ต้องการที่จะเปลี่ยนข้อมูลจาก Range Name ใน C2 ไปเป็น Range Name ใน C4 อยู่แล้ว โดยทั้งสองค่าจะเป็นอะไรก็ไม่น่าจะมีปัญหา

แต่ปัญหาคือ Range Name ที่เขียนไว้ถูกต้องหรือไม่ต้องตรวจสอบด้วยครับ นอกจากนี้สิ่งที่ต้องการ Replace มีลักษณะเป็นอย่างไร ตั้งใจจะเปลี่ยนค่าใดเป็นค่าใด ปกติการ Replace จะเป็นการเปลี่ยนอักขระใด ๆ ในพื้นที่ใด ๆ เป็นค่าที่ต้องการ

Re: การ replace ข้อมูลโดย code vba

Posted: Sun Jul 22, 2012 1:16 pm
by natthaporn
หลังจากที่ตัด if ออกตามที่อาจารย์แนะนำแล้ว แต่พอดิฉันจะ replace จาก FFEB ไป FMAR ทำไม่ได้คะ เพราะใน code นั้น range ที่กำหนดไว้ที่ C2 และ C 4 นั้น ระบุไว้แล้วว่า
C2 = "FMAR" และ C4 = "FFEB"
หรือจะreplace จาก FMAR ไป FJAN ก็ทำไม่ได้คะ

Private Sub CommandButton1_Click()
ActiveSheet.Range("C2") = "FMAR" And Range("C4") = "FFEB"
Application.Goto Reference:="Source"
Selection.Replace What:=ActiveSheet.Range("C2"), Replacement:=ActiveSheet.Range("C4"), LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False

End Sub

ส่วน range name ของ C2 และ C4 นั้น ดิฉันไม่ได้ตั้งไว้ จึงอยากจะรบกวนขอคำแนะนำจากอาจารย์ด้วยคะ

ส่วนข้อมูลที่ต้องการ replace (C7:E9) เป็นสูตรซึ่งดึงข้อมูลมาจาก sheet data คะ มีสูตรดังนี้คะ
FMAR = {SUM(($B7=CODEMAR)*(C$6=CONMAR)*AMOUNTMAR)}
FFEB = {SUM(($B7=CODEFEB)*(C$6=CONFEB)*AMOUNTFEB)}
FMAR = {SUM(($B7=CODEMAR)*(C$6=CONMAR)*AMOUNTMAR)}

Re: การ replace ข้อมูลโดย code vba

Posted: Sun Jul 22, 2012 1:38 pm
by snasui
:D
natthaporn wrote:ส่วน range name ของ C2 และ C4 นั้น ดิฉันไม่ได้ตั้งไว้ จึงอยากจะรบกวนขอคำแนะนำจากอาจารย์ด้วยคะ
ไม่จำเป็นต้องตั้ง Range Name สำหรับเซลล์ดังกล่าวครับ
natthaporn wrote:ส่วนข้อมูลที่ต้องการ replace (C7:E9) เป็นสูตรซึ่งดึงข้อมูลมาจาก sheet data คะ มีสูตรดังนี้คะ
FMAR = {SUM(($B7=CODEMAR)*(C$6=CONMAR)*AMOUNTMAR)}
FFEB = {SUM(($B7=CODEFEB)*(C$6=CONFEB)*AMOUNTFEB)}
FMAR = {SUM(($B7=CODEMAR)*(C$6=CONMAR)*AMOUNTMAR)}
การตั้ง Range Name ลักษณะนี้ไม่สามารถใช้ได้ครับ ถ้าต้องการผลลัพธ์จากสูตร Array ให้ลองใช้ Sumproduct แทน Sum

ลองอธิบายขั้นตอนการทำงานมาอีกรอบว่าต้องการจะทำอะไร จากไหนไปไหน คำว่า Replace คือการ Copy ค่าในช่วงเซลล์ใด ๆ มาแทนที่ค่าเดิมใช่หรือไม่ โดยการ Replace จากใดเป็นค่าใดให้ดูใน C2 และ C4 ซึ่งได้ตั้งเป็น Range Name เอาไว้แล้ว ดังนี้เป็นต้น

หากเป็นการ Replace ลักษณะนี้ยังไม่เห็นมีความจำเป็นที่จะต้องบอกว่า Replace จากค่าใดเป็นค่าใด เราสามารถบอกว่า นำค่าใดมาแสดงได้เลย โดยดูจาก Range Name ในเซลล์ที่กำหนด

Re: การ replace ข้อมูลโดย code vba

Posted: Sun Jul 22, 2012 2:06 pm
by natthaporn
อาจารย์คะดิฉันเข้าใจความหมายของอาจารย์แล้วคะ ต้องขอบคุณมากจริง ๆ ตอนนี้ดิฉันสามารถ replace ได้แล้วคะ แค่เปลี่ยน code เป็น ดังนี้คะ
Private Sub CommandButton1_Click()
Application.Goto Reference:="Source"
Selection.Replace What:=ActiveSheet.Range("C2"), Replacement:=ActiveSheet.Range("C4"), LookAt:=xlPart, _
SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False

End Sub

ิดิฉันคิดมากไปเอง คำแนะนำของอาจารย์ทำให้ดิฉันคิดออกคะ ขอบคุณคะ
หมายเหตุ code อันนี้ดิฉันไม่ได้เขียนเองคะ แต่ลองใช้ macro แล้วนำมาประยุกต์ใช้อีกทีคะ