Page 1 of 1

การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Mon Jul 16, 2012 1:03 pm
by natthaporn
คำถาม ต้องการ 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

Re: การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Mon Jul 16, 2012 5:34 pm
by snasui
:D แนบไฟล์ที่ได้เขียน Code ไว้แล้วใน VBE พร้อมข้อมูลตัวอย่างมาด้วยจะได้ทดสอบได้ครับ

Re: การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Mon Jul 16, 2012 9:07 pm
by natthaporn
แนบ file มาให้แล้วคะ เป็นข้อมูลจริงแต่ตัดรายละเอียดอื่น ๆ ออก ส่วน code ที่ส่งมาครั้งแรกเป็นตัวอย่างคะ

Re: การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Mon Jul 16, 2012 9:23 pm
by snasui
:D ลองปรับเป็นตามด้านล่างครับ

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

Re: การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Mon Jul 16, 2012 10:27 pm
by natthaporn
code ที่อาจารย์แนะนำสามารถ run ข้อมูลได้ตามต้องการคะ เป็น code ที่ดีมากเลยคะ ขอบคุณอาจารย์มากนะคะ แต่ดิฉันอยากจะรบกวนอาจารย์ช่วยอธิบายความหมายของ code บางส่วนด้วยคะ เพื่อที่ดิฉันจะได้นำไปประยุกต์ใช้ต่อไป

Sheets(Sheets("ARECL").Range("E2").Value) _
.Range(Sheets("ARECL").Range("E2").Value & "x").Copy

Re: การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Tue Jul 17, 2012 6:50 am
by snasui
:D จาก 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 ที่กำหนดไว้ก่อนหน้านี้

Re: การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Tue Jul 17, 2012 1:39 pm
by natthaporn
ดิฉันต้องพยายามกว่าครึ่งวันที่จะเข้าระบบได้
ก่อนอื่นต้องขอบคุณสำหรับคำแนะนำของอาจารย์คะ และดิฉันมีคำถามเพิ่มเติมคะ (พร้อมแนบ 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 มีขนาดใหญ่มาก ซึ่งในกรณีหลังนี้ดิฉันจะรบกวน
อาจารย์อีกครั้งหนึ่งคะ

Re: การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Tue Jul 17, 2012 5:24 pm
by snasui
:D กรณีที่ใช้ Validation ทำได้ให้เลือกใช้ Validation ดีกว่าครับ จะได้ง่ายต่อการใช้งานและการแก้ไข หากจะใช้ Control อื่น ๆ ก็ต้องเขียน Code เพิ่ม เพราะต้องส่งค่ากลับไปกลับมา ทำให้เสียเวลาในการจัดทำครับ

สำหรับการถามตอบ VBA จำเป็นที่จะต้องเขียน Code มาก่อนแล้วถามเฉพาะที่ติดปัญหา และต้องแจ้งด้วยว่า Code ที่มีปัญหานั้นอยู่ใน Module ใด ชื่อว่า Procedure ใด เพื่อจะเข้าถึงข้อมูลและปัญหาได้โดยไว

Re: การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Thu Jul 19, 2012 2:54 pm
by natthaporn
ก่อนอื่นต้องขอโทษด้วยที่ตอบอาจารย์ช้าไป เพราะดิฉันเพิ่งแก้ปัญหาการเข้าระบบได้คะ ดิฉันได้แนบ file ตัวอย่างมาให้แล้วคะ

Re: การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Thu Jul 19, 2012 3:24 pm
by bank9597
:D ผมยังงงกับบางคำถามครับ

ลองเอาโค๊ดสั่งบันทึกข้อมูลไปดูก่อนครับว่าใช้ได้หรือไม่ ส่วนปัญหาอื่นๆ ค่อยทยอยถามไปเรื่อยๆครับ

ลองปรับโค๊ดสั่งบันทึกข้อมูลเป็น :ard:

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

Re: การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Thu Jul 19, 2012 4:25 pm
by natthaporn
ดิฉันลองเปลี่ยน code ตามที่คุณ bank9597 แนะนำแล้ว ติด error คะ

Re: การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Thu Jul 19, 2012 4:29 pm
by snasui
:D ติด Error อย่างไร Procedure ใด บรรทัดใด ช่วยแจ้งรายละเอียดด้วยครับ

Re: การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Thu Jul 19, 2012 4:58 pm
by natthaporn
ดิฉันต้องขอโทษด้วยคะ เนื่องจาก
1. ดิฉันเปิด file ผิดคะ เพราะดิฉัน click open file หลายครั้ง และยังไม่ได้กด enable (file นี้เคยเป็น V2003) และดิฉันเพิ่งเปลี่ยนเป็น 2010
2. ดิฉันยังไม่คุ้นเคยกับ google chrome คะ เพิ่งเริ่มใช้เมื่อสักครู่นี้เอง
และดิฉันได้ทดลองใหม่แล้ว code คุณbank9597 สามารถ run ได้คะ แต่ดิฉันอยากจะรบกวนเพิ่มเติมขอให้ย่อสูตรได้ไหมคะ เพราะ sheet "Rx" มีถึง 12 sheet คะ ซึ่ง code ดังกล่าวนี้ดีมากสำหรับคนเพิ่งหัดเขียน code แบบดิฉํน เข้าใจง่ายดี เพียงแต่ดิฉันอยากได้ความรู้เพิ่มเติมว่า ถ้า code เดิมเป็นแบบนี้ แล้วเราจะย่อสูตรดังกล่าวนี้ได้อย่างไรคะ

ขอบคุณมากคะ

Re: การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Thu Jul 19, 2012 5:04 pm
by snasui
:D ลองปรับปรุงมาเองก่อนครับ ติดตรงไหนค่อยมาถามกันครับ พยายามฝึกทำเองก่อน ไม่ควรถามต่อเนื่องกันไปจนกว่าจะได้พยายามแล้วครับ

Re: การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Thu Jul 19, 2012 5:06 pm
by bank9597
ดิฉันยังไม่คุ้นเคยกับ google chrome คะ เพิ่งเริ่มใช้เมื่อสักครู่นี้เอง
ใช้ง่ายดีครับ ผมใช้ตลอดและไม่หนักเครื่องเท่าไหร่

ให้เปลี่ยนคำว่าสูตร เป็น โค๊ดน่ะครับ สำหรับ VBA แล้ว คำว่าสูตรจะไม่เกี่ยวข้องเลย จะมีแต่คำว่าโค๊ดเท่านั้น ทั้งนี้เพื่อให้ง่ายต่อการเข้าใจของผู้ตอบครับ


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

เว้นแต่เราจะมีความสามรถในการเขียนโค๊ดเก่งๆครับ

แล้วผมจะลองดูให้อีกครั้งครับ ระหว่างนี้คงมีท่านอื่นๆ เข้ามาช่วยดูให้อีกครับ

Re: การเขียน code VBA เพื่อ copy ข้อมูล

Posted: Thu Jul 19, 2012 5:18 pm
by natthaporn
ขอบคุณทุกท่านมากคะ ดิฉันรู้สึกดีมากเลยคะที่ปัญหาต่างที่ดิฉันหนักใจมาตลอดเกี่ยวกับเรื่องการจัดการ file ที่มีขนาดใหญ่มาก ๆ ได้รับแก้ปัญหาเสียทีคะ