snasui.com ยินดีต้อนรับ
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ ระบุ Version ของ Excel
ฟอรัมถาม-ตอบปัญหาการใช้งาน Macro และ VBA
Forum rules
ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
natthaporn
Member
Posts: 187 Joined: Sun Jul 15, 2012 10:54 pm
#1
Post
by natthaporn » Sat Jul 21, 2012 11:41 pm
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 ก็มีเป็นจำนวนมากคะ
Attachments
การ replace ข้อมูลโดยใช้ code vba.xlsm
(39.16 KiB) Downloaded 29 times
snasui
Site Admin
Posts: 31253 Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:
#2
Post
by snasui » Sun Jul 22, 2012 7:12 am
ลองปรับ Code โดยนำ If ออกไป เนื่องจาก Code ต้องการที่จะเปลี่ยนข้อมูลจาก Range Name ใน C2 ไปเป็น Range Name ใน C4 อยู่แล้ว โดยทั้งสองค่าจะเป็นอะไรก็ไม่น่าจะมีปัญหา
แต่ปัญหาคือ Range Name ที่เขียนไว้ถูกต้องหรือไม่ต้องตรวจสอบด้วยครับ นอกจากนี้สิ่งที่ต้องการ Replace มีลักษณะเป็นอย่างไร ตั้งใจจะเปลี่ยนค่าใดเป็นค่าใด ปกติการ Replace จะเป็นการ
เปลี่ยนอักขระใด ๆ ในพื้นที่ใด ๆ เป็นค่าที่ต้องการ
natthaporn
Member
Posts: 187 Joined: Sun Jul 15, 2012 10:54 pm
#3
Post
by natthaporn » Sun Jul 22, 2012 1:16 pm
หลังจากที่ตัด 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)}
snasui
Site Admin
Posts: 31253 Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:
#4
Post
by snasui » Sun Jul 22, 2012 1:38 pm
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 ในเซลล์ที่กำหนด
natthaporn
Member
Posts: 187 Joined: Sun Jul 15, 2012 10:54 pm
#5
Post
by natthaporn » Sun Jul 22, 2012 2:06 pm
อาจารย์คะดิฉันเข้าใจความหมายของอาจารย์แล้วคะ ต้องขอบคุณมากจริง ๆ ตอนนี้ดิฉันสามารถ 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 แล้วนำมาประยุกต์ใช้อีกทีคะ