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 » Mon Jul 16, 2012 1:03 pm
คำถาม ต้องการ copy ข้อมูลจาก sheet "data1" ถึง "data12"
โดยเลือกเงื่อนไขจาก sheet"report" range "B2"
โดยมี target อยู่ที่เดียวกัน คือ sheet"report" range "B5:Z111"
ซึ่ง code ดังกล่าวสามารถทำงานได้ตามที่ต้องการ แต่อยากจะรบกวนอาจารย์
ช่วยแนะนำ code ที่สั้นและรวบรัดกว่านี้คะ
หมายเหตู ตอนนี้ดิฉันกำลังฝึกการเขียน code VBA เพื่อนำมาใช้กับงานที่ทำอยู่คะ
ขอบคุณคะ
If Sheets("Report").Range("B2") = "Data1" Then
Sheets("Data1").Range("Data1x").Copy
Range("Target").PasteSpecial xlPasteValues
Application.CutCopyMode = False
ElseIf Sheets("Report").Range("B2") = "Data2" Then
Sheets("Data2").Range("Data2x").Copy
Range("Target").PasteSpecial xlPasteValues
Application.CutCopyMode = False
ElseIf Sheets("Report").Range("B2") = "Data3" Then
Sheets("Data3").Range("Data3x").Copy
Range("Target").PasteSpecial xlPasteValues
Application.CutCopyMode = False
ElseIf Sheets("Report").Range("B2") = "Data4" Then
Sheets("Data4").Range("Data4x").Copy
Range("Target").PasteSpecial xlPasteValues
Application.CutCopyMode = False
ElseIf Sheets("Report").Range("B2") = "Data5" Then
Sheets("Data5").Range("Data5x").Copy
Range("Target").PasteSpecial xlPasteValues
Application.CutCopyMode = False
ElseIf…..
Else
Sheets("Report").Range("B2") = "Data12"
Sheets("Data12").Range("Data12x").Copy
Range("Target").PasteSpecial xlPasteValues
Application.CutCopyMode = False
End If
End Sub
Attachments
code VBA เพื่อ copy ข้อมูล.xlsx
(9.82 KiB) Downloaded 60 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 » Mon Jul 16, 2012 5:34 pm
แนบไฟล์ที่ได้เขียน Code ไว้แล้วใน VBE
พร้อมข้อมูลตัวอย่าง มาด้วยจะได้ทดสอบได้ครับ
natthaporn
Member
Posts: 187 Joined: Sun Jul 15, 2012 10:54 pm
#3
Post
by natthaporn » Mon Jul 16, 2012 9:07 pm
แนบ file มาให้แล้วคะ เป็นข้อมูลจริงแต่ตัดรายละเอียดอื่น ๆ ออก ส่วน code ที่ส่งมาครั้งแรกเป็นตัวอย่างคะ
Attachments
VBA Copy.xls
(296 KiB) Downloaded 79 times
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 » Mon Jul 16, 2012 9:23 pm
ลองปรับเป็นตามด้านล่างครับ
Code: Select all
Private Sub CommandButton1_Click()
Sheets(Sheets("ARECL").Range("E2").Value) _
.Range(Sheets("ARECL").Range("E2").Value & "x").Copy
Range("Target").PasteSpecial xlPasteValues
Application.CutCopyMode = False
End Sub
natthaporn
Member
Posts: 187 Joined: Sun Jul 15, 2012 10:54 pm
#5
Post
by natthaporn » Mon Jul 16, 2012 10:27 pm
code ที่อาจารย์แนะนำสามารถ run ข้อมูลได้ตามต้องการคะ เป็น code ที่ดีมากเลยคะ ขอบคุณอาจารย์มากนะคะ แต่ดิฉันอยากจะรบกวนอาจารย์ช่วยอธิบายความหมายของ code บางส่วนด้วยคะ เพื่อที่ดิฉันจะได้นำไปประยุกต์ใช้ต่อไป
Sheets(Sheets("ARECL").Range("E2").Value) _
.Range(Sheets("ARECL").Range("E2").Value & "x").Copy
snasui
Site Admin
Posts: 31253 Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:
#6
Post
by snasui » Tue Jul 17, 2012 6:50 am
จาก Code
Sheets(
Sheets("ARECL").Range("E2").Value ) _
.Range(
Sheets("ARECL").Range("E2").Value & "x" ).Copy
Sheets("ARECL").Range("E2").Value แทนชื่อชีท
Range(Sheets("ARECL").Range("E2").Value & "x" แทนชื่อของ Range Name
Sheets("ARECL").Range("E2").Value หมายถึง ค่าในเซลล์ E2 ของชีท "ARECL"
Sheets("ARECL").Range("E2").Value & "x" หมายถึงนำค่าในเซลล์ E2 ของชีท "ARECL" มาเชื่อมกับ x เพื่อให้แสดงเป็น Range Name ที่กำหนดไว้ก่อนหน้านี้
natthaporn
Member
Posts: 187 Joined: Sun Jul 15, 2012 10:54 pm
#7
Post
by natthaporn » Tue Jul 17, 2012 1:39 pm
ดิฉันต้องพยายามกว่าครึ่งวันที่จะเข้าระบบได้
ก่อนอื่นต้องขอบคุณสำหรับคำแนะนำของอาจารย์คะ และดิฉันมีคำถามเพิ่มเติมคะ (พร้อมแนบ file คะ)
1. ต้องการดึงข่อมูลจาก sheet "V1" range "B3:B15" โดยใช่ combobox ดิฉันลองเขียน code ตามที่อาจารย์
post ไว้เมื่อวันที่ 8/1/2012 เวลา 09.28 แต่ไม่สามารถ run ได้ ซึ่งดิฉันคิดว่าอาจจะไม่ใช่ประเด็นเดียวกันก็เลย run ไม่ได้
(เนื่องจากดิฉันอยากทดลองใช้ comcobox จึงไม่ใช้ data validation
2. ต้องการดึงข่อมูลจาก sheet "FSE1" range"C5:C7" โดยใช่เงื่อนไขตาม combobox โดย
ถ้าที่ combobox = Jan ให้ข้อมูล copy มาไว้ที่ column "D5:D7"
ถ้าที่ combobox = Feb ให้ข้อมูล copy มาไว้ที่ column "E5:E7"
ถ้าที่ combobox = Mar ให้ข้อมูล copy มาไว้ที่ column "F5:F7"
รบกวนอาจารย์ช่วยแนะนำ code ด้วยคะ เพราะ code ที่ดิฉันเขียนก็มีลักษณะคล้ายแบบเดิม คือ มี Target 12 Target
ทำให้ code ยาวมากคะ ดังนั้น ดิฉันจึงทดลองนำ code ที่อาจารย์แนะนำมาลองใช้ดู
การที่ดิฉันสนใจเรื่องการเขียน code เนื่องจากงานที่ดิฉันทำอยู่มี data ขนาดใหญ่มากบางครั้งต้อง replace ข้อมูลหลายหมื่น cell
บาง sheet เป็นสูตรแบบ array (เพราะต้องดึงข้อมูลแบบหลายเงื่อนไข) ทำให้ file มีขนาดใหญ่มาก ซึ่งในกรณีหลังนี้ดิฉันจะรบกวน
อาจารย์อีกครั้งหนึ่งคะ
Attachments
VBA Copy 1 to 3.xls
(109 KiB) Downloaded 34 times
snasui
Site Admin
Posts: 31253 Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:
#8
Post
by snasui » Tue Jul 17, 2012 5:24 pm
กรณีที่ใช้ Validation ทำได้ให้เลือกใช้ Validation ดีกว่าครับ จะได้ง่ายต่อการใช้งานและการแก้ไข หากจะใช้ Control อื่น ๆ ก็ต้องเขียน Code เพิ่ม เพราะต้องส่งค่ากลับไปกลับมา ทำให้เสียเวลาในการจัดทำครับ
สำหรับการถามตอบ VBA จำเป็นที่จะต้องเขียน Code มาก่อนแล้ว
ถามเฉพาะที่ติดปัญหา และต้องแจ้งด้วยว่า Code ที่มีปัญหานั้นอยู่ใน Module ใด ชื่อว่า Procedure ใด เพื่อจะเข้าถึงข้อมูลและปัญหาได้โดยไว
natthaporn
Member
Posts: 187 Joined: Sun Jul 15, 2012 10:54 pm
#9
Post
by natthaporn » Thu Jul 19, 2012 2:54 pm
ก่อนอื่นต้องขอโทษด้วยที่ตอบอาจารย์ช้าไป เพราะดิฉันเพิ่งแก้ปัญหาการเข้าระบบได้คะ ดิฉันได้แนบ file ตัวอย่างมาให้แล้วคะ
Attachments
VBA Copy 1 to 12.xlsm
(56.06 KiB) Downloaded 30 times
bank9597
Guru
Posts: 3868 Joined: Wed Aug 17, 2011 11:49 am
#10
Post
by bank9597 » Thu Jul 19, 2012 3:24 pm
ผมยังงงกับบางคำถามครับ
ลองเอาโค๊ดสั่งบันทึกข้อมูลไปดูก่อนครับว่าใช้ได้หรือไม่ ส่วนปัญหาอื่นๆ ค่อยทยอยถามไปเรื่อยๆครับ
ลองปรับโค๊ดสั่งบันทึกข้อมูลเป็น
Code: Select all
Private Sub CommandButton1_Click()
If Sheets("Data").Range("C2") = "R1" Then
Call Record_R1
End If
If Sheets("Data").Range("C2") = "R2" Then
Call Record_R2
End If
If Sheets("Data").Range("C2") = "R3" Then
Call Record_R3
End If
End Sub
Sub Record_R1()
Sheets("Data").Range("Source").Copy
Sheets("R1").Range("C5").PasteSpecial xlPasteValues
Application.CutCopyMode = False
End Sub
Sub Record_R2()
Sheets("Data").Range("Source").Copy
Sheets("R2").Range("C5").PasteSpecial xlPasteValues
Application.CutCopyMode = False
End Sub
Sub Record_R3()
Sheets("Data").Range("Source").Copy
Sheets("R3").Range("C5").PasteSpecial xlPasteValues
Application.CutCopyMode = False
End Sub
Attachments
VBA Copy 1 to 12.xlsm
(57.78 KiB) Downloaded 75 times
Forum Rules
อย่าใช้ภาษาแชทในการตอบ-ถาม
ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
natthaporn
Member
Posts: 187 Joined: Sun Jul 15, 2012 10:54 pm
#11
Post
by natthaporn » Thu Jul 19, 2012 4:25 pm
ดิฉันลองเปลี่ยน code ตามที่คุณ bank9597 แนะนำแล้ว ติด error คะ
snasui
Site Admin
Posts: 31253 Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:
#12
Post
by snasui » Thu Jul 19, 2012 4:29 pm
ติด Error อย่างไร Procedure ใด บรรทัดใด ช่วยแจ้งรายละเอียดด้วยครับ
natthaporn
Member
Posts: 187 Joined: Sun Jul 15, 2012 10:54 pm
#13
Post
by natthaporn » Thu Jul 19, 2012 4:58 pm
ดิฉันต้องขอโทษด้วยคะ เนื่องจาก
1. ดิฉันเปิด file ผิดคะ เพราะดิฉัน click open file หลายครั้ง และยังไม่ได้กด enable (file นี้เคยเป็น V2003) และดิฉันเพิ่งเปลี่ยนเป็น 2010
2. ดิฉันยังไม่คุ้นเคยกับ google chrome คะ เพิ่งเริ่มใช้เมื่อสักครู่นี้เอง
และดิฉันได้ทดลองใหม่แล้ว code คุณbank9597 สามารถ run ได้คะ แต่ดิฉันอยากจะรบกวนเพิ่มเติมขอให้ย่อสูตรได้ไหมคะ เพราะ sheet "Rx" มีถึง 12 sheet คะ ซึ่ง code ดังกล่าวนี้ดีมากสำหรับคนเพิ่งหัดเขียน code แบบดิฉํน เข้าใจง่ายดี เพียงแต่ดิฉันอยากได้ความรู้เพิ่มเติมว่า ถ้า code เดิมเป็นแบบนี้ แล้วเราจะย่อสูตรดังกล่าวนี้ได้อย่างไรคะ
ขอบคุณมากคะ
snasui
Site Admin
Posts: 31253 Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:
#14
Post
by snasui » Thu Jul 19, 2012 5:04 pm
ลองปรับปรุงมาเองก่อนครับ ติดตรงไหนค่อยมาถามกันครับ พยายามฝึกทำเองก่อน ไม่ควรถามต่อเนื่องกันไปจนกว่าจะได้พยายามแล้วครับ
bank9597
Guru
Posts: 3868 Joined: Wed Aug 17, 2011 11:49 am
#15
Post
by bank9597 » Thu Jul 19, 2012 5:06 pm
ดิฉันยังไม่คุ้นเคยกับ google chrome คะ เพิ่งเริ่มใช้เมื่อสักครู่นี้เอง
ใช้ง่ายดีครับ ผมใช้ตลอดและไม่หนักเครื่องเท่าไหร่
ให้เปลี่ยนคำว่าสูตร เป็น โค๊ดน่ะครับ สำหรับ VBA แล้ว คำว่าสูตรจะไม่เกี่ยวข้องเลย จะมีแต่คำว่าโค๊ดเท่านั้น ทั้งนี้เพื่อให้ง่ายต่อการเข้าใจของผู้ตอบครับ
ส่วนการย่อโค๊ดให้สั้นนั้น ทำได้ยากครับ เพราะแยกกันเก็บคนละชีทกัน ยิ่งชีทมากก็ยิ่งต้องเพิ่มเงื่อนไขไป ต่อให้ผมรวมโค๊ดไว้ในที่เดียวกัน มันก็ยาวอยู่เป็นธรรมดาครับ
เว้นแต่เราจะมีความสามรถในการเขียนโค๊ดเก่งๆครับ
แล้วผมจะลองดูให้อีกครั้งครับ ระหว่างนี้คงมีท่านอื่นๆ เข้ามาช่วยดูให้อีกครับ
Forum Rules
อย่าใช้ภาษาแชทในการตอบ-ถาม
ตั้งชื่อกระทู้ให้สื่อถึงปัญหาและไม่เจาะจงตัวผู้ตอบ
ให้อธิบายปัญหาและระบุคำตอบที่ต้องการมาในฟอรัม
ควรแนบไฟล์ตัวอย่างมาที่ฟอรั่ม
หากใช้ VBA ให้ลองเขียนมาเองก่อนเสมอ
แจ้งผลการใช้งานทุกครั้งเมื่อได้รับคำตอบ
natthaporn
Member
Posts: 187 Joined: Sun Jul 15, 2012 10:54 pm
#16
Post
by natthaporn » Thu Jul 19, 2012 5:18 pm
ขอบคุณทุกท่านมากคะ ดิฉันรู้สึกดีมากเลยคะที่ปัญหาต่างที่ดิฉันหนักใจมาตลอดเกี่ยวกับเรื่องการจัดการ file ที่มีขนาดใหญ่มาก ๆ ได้รับแก้ปัญหาเสียทีคะ