Page 1 of 1

Code VBA ไม่ได้ดั่งใจ

Posted: Thu Feb 16, 2012 10:18 pm
by suka
เรียนอาจารย์ ขอความช่วยเหลือเรื่อง Code ค่ะ ชื่อ Sub BeenAr วางอยู่ที่ Module1

Code: Select all

Sub BeenAr()
Dim i As Integer
Dim rs As Range
Dim rt As Range
    Application.ScreenUpdating = False
    i = Worksheets("FormPaid").Range("A13")
    With Worksheets("Template")
        Set rs = .Range(.Range("A7"), .Range("F7" & i + 1))
    End With
    Set rt = Worksheets("DataPaid").Range("A65536").End(xlUp).Offset(1, 0)
    If Worksheets("FormPaid").Range("A13") = True Then
        MsgBox "Please check your data. This transaction already recorded."
        Exit Sub
    End If
    If Worksheets("FormPaid").Range("A2") = "" Then
        MsgBox "Your data is empty. Fill your data and click record button again."
        Exit Sub
    End If
    rs.Copy: rt.PasteSpecial xlPasteValues

    Sheets("Template").Range("A2:O2").Copy
    Sheets("AR").Range("A" & Rows.Count).End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("Template").Range("P2:W2").Copy
    Sheets("Print").Range("A" & Rows.Count).End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("FormPaid").Range("G3,G7:I7,K7,J8,K5").ClearContents
    With Sheets("FormPaid")
            .Range("F5") = .Range("F5") + 1
        End With
        Application.ScreenUpdating = True
End Sub
ที่ชีท FromPaid มีข้อมูลและเมื่อกดปุ่ม Record
ให้ Code ด้านบนเอาข้อมูลที่ชีท Template A2:O2 Copy ไปชีท AR เอาข้อมูลที่ชีท Template P2:W2 Copy ไปชีท Print
พอทำถึงตรงนี้เริ่มเกิดปัญหาแล้วค่ะ Code ข้อมูลที่ชีท Template A7:F17 Copy ไปชีท DataPaid ไม่ได้ตามที่ต้องการค่ะ
จากตัวอย่างที่คัดลอกมาที่ชีท DataPaid ไม่ทราบจะทำอย่างไรให้คัดลอกมาแค่เซลล์ A2:B3 ตามข้อมูลที่มีเหมือนเซลล์ C2:E3 ตัวอย่างไฟล์แนบที่ชีท DataPaid น่ะค่ะ

ขอบคุณค่ะ

Re: Code VBA ไม่ได้ดั่งใจ

Posted: Thu Feb 16, 2012 10:42 pm
by snasui
:D ลองปรับ Code เป็นตามด้านล่างครับ

Code: Select all

Sub BeenAr()
    Dim i As Integer
    Dim rs As Range
    Dim rt As Range
    Dim DataPaid As Range
    Application.ScreenUpdating = False
    i = Worksheets("FormPaid").Range("A13")
    With Worksheets("Template")
        Set rs = .Range(.Range("A7"), .Range("F7" & i + 1))
    End With
    Set rt = Worksheets("DataPaid").Range("A65536").End(xlUp).Offset(1, 0)
    If Worksheets("FormPaid").Range("A13") = True Then
        MsgBox "Please check your data. This transaction already recorded."
        Exit Sub
    End If
    If Worksheets("FormPaid").Range("A2") = "" Then
        MsgBox "Your data is empty. Fill your data and click record button again."
        Exit Sub
    End If
    rs.Copy: rt.PasteSpecial xlPasteValues

    Sheets("Template").Range("A2:O2").Copy
    Sheets("AR").Range("A" & Rows.Count).End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("Template").Range("P2:W2").Copy
    Sheets("Print").Range("A" & Rows.Count).End(xlUp) _
        .Offset(1, 0).PasteSpecial xlPasteValues
    Sheets("FormPaid").Range("G3,G7:I7,K7,J8,K5").ClearContents
    With Sheets("FormPaid")
            .Range("F5") = .Range("F5") + 1
        End With
    Application.ScreenUpdating = True
    With Sheets("DataPaid")
        Set DataPaid = .Range("B2", .Range("B" & Rows.Count).End(xlUp))
    End With
    i = 1
    Do While DataPaid.Cells(i, 1) <> ""
        If DataPaid.Cells(i, 1).Offset(0, 1) = "" Then
            DataPaid.Cells(i, 1).EntireRow.Delete
        Else
            i = i + 1
        End If
    Loop
End Sub

Re: Code VBA ไม่ได้ดั่งใจ

Posted: Fri Feb 17, 2012 11:54 am
by suka
โปรแกรมสามารถคัดลอกข้อมูลมาให้ได้ตามที่ต้องการแล้วค่ะ

อาจารย์คะ ขอถามความหมายของ Code เพิ่มอีกนิดค่ะ

Code: Select all

  With Sheets("DataPaid")
        Set DataPaid = .Range("B2", .Range("B" & Rows.Count).End(xlUp))
    End With
B2 ใช่หมายถึงเซลล์ B2 ชืท FormPaid ไหมคะ

Code: Select all

If DataPaid.Cells(i, 1).Offset(0, 1) = "" Then
แล้ว Code ด้านบนนี้แปลว่าอะไรคะ

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

Re: Code VBA ไม่ได้ดั่งใจ

Posted: Fri Feb 17, 2012 1:35 pm
by snasui
:D
อาจารย์คะ ขอถามความหมายของ Code เพิ่มอีกนิดค่ะ

Code: Select all

With Sheets("DataPaid")
      Set DataPaid = .Range("B2", .Range("B" & Rows.Count).End(xlUp))
End With
B2 ใช่หมายถึงเซลล์ B2 ชืท FormPaid ไหมคะ
ถูกต้องแล้วครับ เป็นการกำหนดว่าให้ตัวแปร DataPaid มีช่วงข้อมูลเริ่มจาก B2 จนถึง B เซลล์สุดท้ายที่มีข้อมูล

Code: Select all

If DataPaid.Cells(i, 1).Offset(0, 1) = "" Then
หมายถึง ถ้าเซลล์ของตัวแปร DataPaid ที่อยู่ถัดจากเซลล์ในคอลัมน์แรกบรรทัดที่เป็นค่าของตัวแปร i ไป 1 คอลัมน์มีค่าเท่ากับค่าว่างแล้ว...

Re: Code VBA ไม่ได้ดั่งใจ

Posted: Fri Feb 17, 2012 2:53 pm
by suka
ขอบคุณอาจารย์ค่ะ ให้ความรู้ความช่วยเหลือมากมาย พอจะเข้าใจบ้างแล้วค่ะ