Page 1 of 1

เป็นCode สำหรับใช้บันทึกข้อมูล

Posted: Mon Jun 23, 2014 2:12 pm
by pongpang
เป็นCode สำหรับใช้บันทึกข้อมูล

Code: Select all

Private Sub CommandButton1_Click()
Dim rAll As Range, r As Range
    With Sheets("sheet1")
        Set rAll = .Range("b3", .Range("b" & Rows.Count).End(xlUp))
        For Each r In rAll
            If CStr(r) = ComboBox1.Text Then
                r.Offset(0, 1) = TextBox1.Text
                r.Offset(0, 2) = TextBox2.Text
                r.Offset(0, 3) = TextBox3.Text
                r.Offset(0, 4) = TextBox4.Text
               
                Exit For
            End If
        Next r
    End With
End Sub
ผลที่ได้รับ
จุดเด่น ถ้าต้องปรับปรุงข้อมูลเก่าสามารถปรับปรุงลงในตำแหน่งเดิมได้
จุดอ่อนที่ต้องปรับปรุง
การบันทึกช้อมูลใหม่(เพิ่มข้อมูล) ถ้าไม่พิมพ์เลขที่สมาชิกลงในตารางไว้ล่วงหน้า
ไม่สามารถคลิกเพิ่มข้อมูลได้

ความต้องการ1 ไม่ต้องพิมพ์เลขที่สมาชิกในตารางไว้ล่วงหน้าก็ให้สามารถบันทึกข้อมูลได้
ขอความกรุณา แก้ไขปรับปรุงให้ด้วยครับ
ความต้องการ2 กำหนดให้TEXTBOX แสดงค่าเป็นรูปแบบ d/mm/yy

Re: เป็นCode สำหรับใช้บันทึกข้อมูล

Posted: Mon Jun 23, 2014 2:56 pm
by snasui
:D Code ที่แนบมาเป็นการแก้ไขข้อมูลเก่าเท่านั้น

ทุกจุดอ่อนที่ถามให้พยายามเขียนแก้มาเองก่อนและต้องเป็นเช่นนี้ทุกครั้ง ติดแล้วค่อยถามกันต่อครับ

Re: เป็นCode สำหรับใช้บันทึกข้อมูล

Posted: Mon Jun 23, 2014 10:04 pm
by pongpang
เรียน อาจารย์ คนควน
ได้พยายามแล้วครับ แต่เมื่อแก้ไขข้อมูลเก่าหรือเพิ่มข้อมูลจะเกิด ดีบัก ตามภาพครับ
AXY1.png
AXY.png

Code: Select all

Private Sub CommandButton1_Click()
    Dim rAll As Range, r As Range
    Set ws = Worksheets("sheet1")
    With ws
        Set rAll = .Range("b3", .Range("b" & Rows.Count).End(xlUp))
        For Each r In rAll
            If CStr(r) = ComboBox1.Text Then
                r.Offset(0, 1) = TextBox1.Text
                r.Offset(0, 2) = TextBox2.Text
                r.Offset(0, 3) = TextBox3.Text
                r.Offset(0, 4) = TextBox4.Text
                ComboBox1.Text = ""
                 TextBox1.Text = ""
                 TextBox2.Text = ""
                 TextBox3.Text = ""
                 TextBox4.Text = ""
              ElseIf CStr(r) <> ComboBox1.Text Then
                Irow = Sheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row + 1
                ws.Cells(Rows, 1).Value = ComboBox1.Text
                 ws.Cells(Rows, 2).Value = TextBox1.Text
                 ws.Cells(Rows, 3).Value = TextBox2.Text
                 ws.Cells(Rows, 4).Value = TextBox3.Text
                 ws.Cells(Rows, 5).Value = TextBox4.Text
                 ComboBox1.Text = ""
                 TextBox1.Text = ""
                 TextBox2.Text = ""
                 TextBox3.Text = ""
                 TextBox4.Text = ""
                Exit For
            End If
        Next r
    End With
End Sub

Re: เป็นCode สำหรับใช้บันทึกข้อมูล

Posted: Mon Jun 23, 2014 10:24 pm
by snasui
:D จาก ws.Cells(Rows, 1).Value = ComboBox1.Text ควรเป็น ws.Cells(Irow, 1).Value = ComboBox1.Text รวมทั้งตัวอื่น ๆ ก็เช่นเดียวกัน

่ส่วน IRow ควรจะมีค่าเท่ากับบรรทัดหลังบรรทัดที่มีข้อมูลคือ Irow = Sheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row

Re: เป็นCode สำหรับใช้บันทึกข้อมูล

Posted: Mon Jun 23, 2014 11:19 pm
by pongpang
เรียน อาจารย์
ผมได้ปรับปรุง Code บางส่วน จนสามารถลงในคอลัมน์ได้ตามต้อง แต่มีบางส่วน ยังคงมีความต้องการและปัญหา ดังนี้
ความต้องการ เมื่อแก้ไขข้อมูลเก่าให้นำข้อมูลวางที่ Row เดิม
ถ้าเพิ่มข้อมูล นำข้อมูลต่อที่Rowล่าง
ผลของ Code
ถ้าแก้ไขเช่น แก้ไข นามสกุลของเลขที่ 1,3,4 จะไม่วางข้อมูลทับของเลขที่เดิม จะนำข้อมูลไปต่อข้างล่าง และไม่แก้ไขตามที่คีย์
1.จากCode ข้างล่างต้องแก้ไขที่ส่วนใด
2.การกำหนดให้ Text แสดงข้อมูลวันเดือนปี เป็นวันเดือนปี
ต้องดำเนินการอย่างไร ครับ

Code: Select all

Private Sub CommandButton1_Click()
    Dim rAll As Range, r As Range
    Set ws = Worksheets("sheet1")
    With ws
        Set rAll = .Range("b3", .Range("b" & Rows.Count).End(xlUp))
        For Each r In rAll
            If CStr(r) = ComboBox1.Text Then
                r.Offset(0, 1) = TextBox1.Text
                r.Offset(0, 2) = TextBox2.Text
                r.Offset(0, 3) = TextBox3.Text
                r.Offset(0, 4) = TextBox4.Text
                ComboBox1.Text = ""
                 TextBox1.Text = ""
                 TextBox2.Text = ""
                 TextBox3.Text = ""
                 TextBox4.Text = ""
              ElseIf CStr(r) <> ComboBox1.Text Then
                'Irow = Sheets("sheet1").Cells(Rows.Count, 1).End(xlUp).Offset(1, 0).Row + 1
                Irow = Sheets("sheet1").Cells(Rows.Count, 2).End(xlUp).Offset(1, 0).Row
                'ws.Cells(Rows, 1).Value = ComboBox1.Text
                ws.Cells(Irow, 2).Value = ComboBox1.Text
                 ws.Cells(Irow, 3).Value = TextBox1.Text
                 ws.Cells(Irow, 4).Value = TextBox2.Text
                 ws.Cells(Irow, 5).Value = TextBox3.Text
                 ws.Cells(Irow, 6).Value = TextBox4.Text
                 ComboBox1.Text = ""
                 TextBox1.Text = ""
                 TextBox2.Text = ""
                 TextBox3.Text = ""
                 TextBox4.Text = ""
                Exit For
            End If
        Next r
    End With
End Sub

Re: เป็นCode สำหรับใช้บันทึกข้อมูล

Posted: Tue Jun 24, 2014 6:30 pm
by snasui
:D ตัวอย่างการปรับ Code ตามด้านล่างครับ

Code: Select all

Private Sub ComboBox1_Change()
    On Error Resume Next
    Set myRange = Worksheets("sheet1").Range("num")
    With Application.WorksheetFunction
'        ComboBox1.Value = .VLookup(CLng(ComboBox1.Text), myRange, 1, False)
        TextBox1.Text = .VLookup(CLng(ComboBox1.Text), Range("data"), 2, False)
        TextBox2.Text = .VLookup(CLng(ComboBox1.Text), Range("data"), 3, False)
        TextBox3.Text = .Text(.VLookup(CLng(ComboBox1.Text), Range("data"), 4, False), "dd/mm/yyyy")
        TextBox4.Text = .VLookup(CLng(ComboBox1.Text), Range("data"), 5, False)
    End With
End Sub


Private Sub CommandButton1_Click()
    Dim rAll As Range, r As Range
    Dim iRow As Long
    Set ws = Worksheets("sheet1")
    With ws
        Set rAll = .Range("b3", .Range("b" & Rows.Count).End(xlUp))
        If Application.CountIf(rAll, ComboBox1.Text) > 0 Then
            iRow = Application.Match(CLng(ComboBox1.Text), .Range("b:b"), 0)
        Else
            iRow = .Range(rAll.Rows.Count).Row + 1
        End If
        ws.Cells(iRow, 3).Value = TextBox1.Text
        ws.Cells(iRow, 4).Value = TextBox2.Text
        ws.Cells(iRow, 5).Value = Application.Text(TextBox3.Text, "dd/mm/yyyy")
        ws.Cells(iRow, 6).Value = TextBox4.Text
        ws.Cells(iRow, 2).Value = ComboBox1.Text
        ComboBox1.Text = ""
        TextBox1.Text = ""
        TextBox2.Text = ""
        TextBox3.Text = ""
        TextBox4.Text = ""
    End With
End Sub

Re: เป็นCode สำหรับใช้บันทึกข้อมูล

Posted: Tue Jun 24, 2014 8:51 pm
by pongpang
เรียน อาจารย์คนควน
ขอบคุณมากครับที่ได้กรุณา สำหรับCode ได้นำไปใช้แล้ว แต่เกิดปัญหา ดังนี้
1.เมื่อต้องการป้อนข้อมูลเพิ่มเมื่อเริ่มคีย์เลขประจำตัว เช่น คีย์เลข 12 ก็จะแสดงข้อมูลของเลขที่ 1 ครับ
2.เมื่อป้อนข้อมูลในฟอร์มเสร็จ คลิกปุ่มเพิ่ม/ปรับปรุง จะเกิดดีบั๊ก ตามภาพครับ
011.png

Code: Select all

Private Sub CommandButton1_Click()
    Dim rAll As Range, r As Range
    Dim iRow As Long
    Set ws = Worksheets("sheet1")
    With ws
        Set rAll = .Range("b3", .Range("b" & Rows.Count).End(xlUp))
        If Application.CountIf(rAll, ComboBox1.Text) > 0 Then
            iRow = Application.Match(CLng(ComboBox1.Text), .Range("b:b"), 0)
        Else
            iRow = .Range(rAll.Rows.Count).Row + 1
        End If
        ws.Cells(iRow, 3).Value = TextBox1.Text
        ws.Cells(iRow, 4).Value = TextBox2.Text
        ws.Cells(iRow, 5).Value = Application.Text(TextBox3.Text, "dd/mm/yyyy")
        ws.Cells(iRow, 6).Value = TextBox4.Text
        ws.Cells(iRow, 2).Value = ComboBox1.Text
        ComboBox1.Text = ""
        TextBox1.Text = ""
        TextBox2.Text = ""
        TextBox3.Text = ""
        TextBox4.Text = ""
    End With
End Sub
ขอความกรุณาขอความอนุเคราะห์อีกครับ

Re: เป็นCode สำหรับใช้บันทึกข้อมูล

Posted: Tue Jun 24, 2014 9:20 pm
by snasui
:D บรรทัดที่ Error ลองปรับเป็น

Code: Select all

iRow = rAll(rAll.Rows.Count).Row + 1
ส่วนการที่คีย์ค่าใน ComboBox แล้วมีการ Lookup เอาค่าเฉพาะหลักแรกมาให้เป็นเพราะคุณเขียนให้ Check การเปลี่ยนแปลงของ ComboBox ซึ่งจะต้องแก้มาเอง

จาก ComboBox1_Change() หมายถึง Code ที่อยู่ภายใน Procedure นี้จะทำงานทุกครั้งทีมีการเปลียนแปลงใน ComboBox1 ทุกการคีย์จะเกิดกระทบกับ Event นี้เสมอ เมื่อคีย์ 1 ก็จะไปดึงค่าที่เกียวกับ 1 มาแสดง หากคีย์คีย์ตัวถัดมาแม้จะไม่สามารถ Lookup ค่ามาได้ก็จะยังแสดงค่าเดิมเพราะไปกำหนด On error resume next เอาไว้

การใช้งานของ ComboBox เน้นที่ให้เลือกจากค่าที่มี ไม่ใช่ให้คีย์เข้าไปเอง หากต้องการให้เลือกได้ คีย์เข้าไปเองด้วยก็ต้องปรับ Code เดิมมาครับ

Re: เป็นCode สำหรับใช้บันทึกข้อมูล

Posted: Tue Jun 24, 2014 9:39 pm
by pongpang
เรียน อาจารย์ คนควน
ขอบคุณมากครับ สามารถนำไปใช้ได้ ส่วนที่จะต้องเขียนเองจะค่อย ๆ ทดลอง และถ้ามีปัญหาก็ต้องขอความกรุณอาจารย์อีก
ขอบคุณอีกครั้ง ครับ