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
:D ผมทดลองตาม Code ที่แนบมาไม่ติดปัญหาใด ลองกดแป้น F8 เพื่อ Run ทีละ Step แล้วแจ้งมาว่าติดที่บรรทัดใดครับ

Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ

Posted: Tue Jan 21, 2014 3:59 pm
by DhitiBank
ขอบคุณครับอาจารย์

ผมลองกด F8 ดูแล้ว Run จนถึงบรรทัด

Code: Select all

Range("A2").Select
ผ่านไปได้ด้วยดีครับ แต่พอจะ 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
:D ให้คัดลอก 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
:o อ้อ ขอบคุณมากครับอาจารย์ มองเห็นทางไปต่อเสียที :thup:

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
:D ลองปรับ 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
:D ลองปรับ 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 ให้กับปุ่มอย่างไรครับ :oops:

2 ถ้าผมตั้งรหัสล็อกชีทเป็น 111
ตรงคำสั่ง Unprotect และ คำสั่ง Protect ผมจะต้องปรับโค้ดอย่างไรครับ

ขอบพระคุณมากครับ

Re: VBA ครับ การคัดลอกข้อมูลไปวางไว้ในตำแหน่งที่ต้องการ

Posted: Mon Jan 27, 2014 5:38 pm
by snasui
:D วาด 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
:D แล้วแต่ความประสงค์ครับ

สำหรับ 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 ก็เหมาะกับคนเพิ่งหัดใหม่ๆ อย่างผมมากกว่าสินะครับ

ขอบคุณอาจารย์มากครับ