Page 1 of 1
VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ
Posted: Tue Jan 21, 2014 1:29 pm
by DhitiBank
สวัสดีครับอาจารย์และเพื่อนๆ
ผมติดปัญหาการเขียนโค้ด VBA คือจากไฟล์แนบ ชีท Cal สิ่งที่ต้องการคือเมื่อกดปุ่ม SKU1 แล้ว โปรแกรมจะคัดลอกข้อมูลในชีท Cal คอลัมน์ B - H ตั้งแต่แถวที่ 2 ลงไปทุกค่า เอาไปวางไว้ในชีท Record คอลัมน์ A - G ตั้งแต่แถวที่ 2 ลงไป
ลองเขียนโค้ดมาดังนี้ครับ
Code: Select all
Private Sub CommandButton1_Click()
Range("B2:H2").Select
Range(Selection, Selection.End(xlDown)).Select
Selection.Copy
Sheets("Record").Select
Range("A2").Select
Selection.PasteSpecial Paste:=xlPasteValues
Sheets("Cal").Select
Application.CutCopyMode = False
End Sub
แต่หลังจากสั่งรัน โปรแกรมฟ้องว่า Run-time error 1004
ผมต้องปรับโค้ดอย่างไรครับ (มือใหม่หัดเขียน VBAครับ)
ขอบคุณครับ
Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ
Posted: Tue Jan 21, 2014 3:39 pm
by snasui

ผมทดลองตาม Code ที่แนบมาไม่ติดปัญหาใด ลองกดแป้น F8 เพื่อ Run ทีละ Step แล้วแจ้งมาว่าติดที่บรรทัดใดครับ
Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ
Posted: Tue Jan 21, 2014 3:59 pm
by DhitiBank
ขอบคุณครับอาจารย์
ผมลองกด F8 ดูแล้ว Run จนถึงบรรทัด
ผ่านไปได้ด้วยดีครับ แต่พอจะ Run บรรทัด
Code: Select all
Selection.PasteSpecial Paste:=xlPasteValues
excel ฟ้องว่า
Run-time error '1004'
Application-defined or object-defined error
ข้อความแบบนี้หมายถึงอะไรครับอาจารย์
Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ
Posted: Tue Jan 21, 2014 5:37 pm
by snasui

ให้คัดลอก Code ไปวางที่ Module1 แล้วลบ Code ที่ชีท Cal ทิ้งไปครับ
การที่เกิด Error เนื่องจากเป็นการกระทำข้ามชีทโดย Code ไม่ได้วางอยู่ใน Module
ปกติการอ้าง Range หรือ Cells ในไฟล์เดียวกัน ควรจะอ้าง Parent มันด้วยเพื่อป้องกัน Code แสดง Error ที่ไม่พึงประสงค์ เช่น
เดิม
Range("I2:O2") เราควรเขียนเป็น
Sheets("Sheet1").Range("I2:O2") ครับ
Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ
Posted: Wed Jan 22, 2014 12:46 am
by DhitiBank

อ้อ ขอบคุณมากครับอาจารย์ มองเห็นทางไปต่อเสียที

Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ
Posted: Sat Jan 25, 2014 2:03 pm
by DhitiBank
สวัสดีอาจารย์และเพื่อนๆครับ
ผมลองเขียนโค้ดล้างข้อมูล โค้ดอยู่ชีท Action จะลบข้อมูลที่อยู่ในชีท Record ระหว่างลบ เอกสารก็จะคำนวณไปด้วยเพราะมีสูตรจำนวนมาก (ตัวอย่างไฟล์ลบสูตรออกไปเยอะแล้วครับ) ผมควรจะเขียนโค้ดอย่างไรให้ระหว่างล้างข้อมูลไม่ต้องทำการคำนวณเอกสารครับ ลองแล้วลองอีกยังไงก็ไม่ได้ครับ
Code: Select all
Private Sub ClearData_Click()
Dim stgChoose As Integer
Dim rngCount As Range
Dim rngCstCode As Range
Set rngCount = Sheets("record").Range("A2:EJ2")
Set rngCstCode = Sheets("record").Range("A4:EJ800")
stgChoose = MsgBox("คุณแน่ใจหรือว่าจะลบข้อมูลในชีท Record", vbOKCancel + 64)
If stgChoose = 1 Then
rngCount.ClearContents
rngCstCode.ClearContents
End If
MsgBox "ล้างข้อมูลในชีท 'Record' เรียบร้อยแล้ว"
End Sub
ขอบคุณครับ
Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ
Posted: Sat Jan 25, 2014 2:14 pm
by snasui

ลองปรับ Code เป็นตามด้านล่างครับ
Code: Select all
...
Application.Calculation = xlCalculationManual
If stgChoose = 1 Then
rngCount.ClearContents
rngCstCode.ClearContents
End If
Application.Calculation = xlCalculationAutomatic
...
Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ
Posted: Sat Jan 25, 2014 2:37 pm
by DhitiBank
ขอบคุณมากๆ ครับอาจารย์ ^^
Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ
Posted: Sun Jan 26, 2014 11:19 pm
by DhitiBank
อาจารย์ครับ รบกวนหน่อยครับ
Code: Select all
Private Sub Send_Data_Click()
Dim rngData As Range
Dim intChoose As Integer
Set rngData = Sheets("1Collect").Range("A3:M200")
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
intChoose = MsgBox("ทำการส่งข้อมูลไปที่แผ่นงาน Final", vbOKCancel + vbInformation)
If intChoose = 1 Then
rngData.Select
Selection.Copy
Sheets("Final").Select
ActiveSheet.Unprotect
ActiveSheet.Range("A1048576").Select
Selection.End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial xlPasteValues
ActiveSheet.Range("B2").Select
ActiveSheet.Protect AllowFiltering:=True
Sheets("1Collect").Select
ActiveSheet.Range("P1").Select
End If
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
MsgBox "ส่งข้อมูลเรียบร้อย"
End Sub
ผมพยายามเขียนโค้ดคัดลอกข้อมูลจากชีท "1Collect" ไปไว้ที่ชีท "Final" พบปัญหาคือ
1 ทุกๆ ครั้งที่กดปุ่มรันคำสั่งครั้งที่ 2 จะเกิด error ขึ้นที่บรรทัด
Code: Select all
Selection.PasteSpecial xlPasteValues
2 ข้อมูลที่ส่งไปมีบางแถวที่เป็นค่าว่าง (เนื่องจากใส่สูตรว่าถ้าไม่มีข้อมูล ให้แสดงค่า "" แทน) เวลาคัดลอกไป แถวที่ว่างก็ไปด้วย ข้อมูลเลยไม่เรียงต่อกัน
ผมต้องปรับโค้ดอย่างไรครับ
ขอบพระคุณครับ
Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ
Posted: Mon Jan 27, 2014 12:50 pm
by snasui

ลองปรับ Code เป็นตามด้านล่าง โดยวาง Code ใน Module ปกติครับ
Code: Select all
Private Sub Send_Data_Click()
Dim rngData As Range
Dim intChoose As Integer
Dim iCount As Integer
iCount = Application.CountIf(Sheets("1Collect").Range("a3:a1000"), "?*")
Set rngData = Sheets("1Collect").Range("A3:M" & iCount)
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
intChoose = MsgBox("ทำการส่งข้อมูลไปที่แผ่นงาน Final", vbOKCancel + vbInformation)
If intChoose = 1 Then
Sheets("Final").Select
ActiveSheet.Unprotect
rngData.Copy
ActiveSheet.Range("A1048576").Select
Selection.End(xlUp).Offset(1, 0).Select
Selection.PasteSpecial xlPasteValues
ActiveSheet.Range("B2").Select
ActiveSheet.Protect AllowFiltering:=True
Sheets("1Collect").Select
ActiveSheet.Range("P1").Select
End If
Application.Calculation = xlCalculationAutomatic
Application.ScreenUpdating = True
MsgBox "ส่งข้อมูลเรียบร้อย"
End Sub
Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ
Posted: Mon Jan 27, 2014 12:55 pm
by DhitiBank
ขอบคุณมากๆ ครับ อาจารย์ จะลองดูครับ
------------edit------------
อาจารย์ครับ ผมมี 2 เรื่องครับ
1 คือ ผมลบโค้ด vba ในชีท 1Collect ออกหมดแล้ว แล้วคัดลอกโค้ดของอาจารย์ไปวางไว้ใน Module1
พอผมลองกดที่ปุ่มในชีท 1Collect แล้ว นิ่งเลยครับ
ขอถามแบบโง่ๆ ว่าผมต้องอ้างอิง Module ให้กับปุ่มอย่างไรครับ
2 ถ้าผมตั้งรหัสล็อกชีทเป็น 111
ตรงคำสั่ง Unprotect และ คำสั่ง Protect ผมจะต้องปรับโค้ดอย่างไรครับ
ขอบพระคุณมากครับ
Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ
Posted: Mon Jan 27, 2014 5:38 pm
by snasui

วาด Form control แล้ว Assign Macro เข้าไปใหม่ครับ สำหรับที่ใช้อยู่นั้นเรียกว่า ActiveX control
สำหรับการใส่ Password ดูตัวอย่างที่นี่ครับ
viewtopic.php?f=3&t=2385#p15592
Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ
Posted: Mon Jan 27, 2014 5:57 pm
by DhitiBank
ขอบคุณมากครับอาจารย์
ActiveX control เอาไว้ใช้กรณีไหนหรือครับอาจารย์
Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ
Posted: Mon Jan 27, 2014 6:07 pm
by snasui

แล้วแต่ความประสงค์ครับ
สำหรับ ActiveX Control มี Propeties ให้จัดการหลากหลาย เหมือนการใช้ Control ใน UserForm เมื่อ Double Click จะเข้าหน้าจอให้เขียน Code และ Code นั้นจะอยู่ในชีทที่ Control วางอยู่
ส่วน Form Control เมื่อวาดเสร็จและปล่อยเมาส์จะเข้าหน้าจอให้ Record Macro หรือ เขียน VBA มี Properties ให้กำหนดได้น้อยกว่า มีสภาพความเข้ากันได้กับ Worksheet ได้มากกว่า เลือกกำหนดว่าให้ Run Macro ใดในภายหลังได้
Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ
Posted: Mon Jan 27, 2014 6:14 pm
by DhitiBank
อ๋อ ถ้าอย่างนั้น Form control ก็เหมาะกับคนเพิ่งหัดใหม่ๆ อย่างผมมากกว่าสินะครับ
ขอบคุณอาจารย์มากครับ