:D snasui.com ยินดีต้อนรับ :D
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย :thup: สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ :arrow: ระบุ Version ของ Excel
:!: โปรดทราบ :!:
  1. กรุณาอ่านกฎการใช้บอร์ด (Forum rules) ในตำแหน่งด้านบนของแต่ละบอร์ด
  2. การสมัครสมาชิก การ Login การกู้คืนรหัสผ่าน
    1. สมัครสมาชิกดูขั้นตอนได้ที่ :arrow: สมัครสมาชิก
    2. Login เข้าระบบโดยคลิกปุ่ม Login ตรงมุมขวาบนของหน้านี้ :roll:
    3. การ Login ผ่าน Facebook ดูวิธีที่ :arrow: Login ผ่าน Facebook
    4. ลืมรหัสผ่านสามารถรับรหัสใหม่ได้ที่ :arrow: Reset รหัสผ่าน
  3. มีปัญหาการใช้งาน แจ้งผู้ดูแลระบบได้ที่ :arrow: ติดต่อผู้ดูแลระบบ
  4. กำหนดการตั้งค่าส่วนตัว เช่นตั้งค่าภาษาเป็นไทยหรืออังกฤษดูได้ที่ :arrow: ตั้งค่าส่วนตัว
  5. การตั้งและตอบกระทู้ดูได้ที่ :arrow: วิธีการตั้งและตอบกระทู้
  6. การจัดรูปแบบตัวอักษรด้วย bbcode ในช่องแสดงความคิดเห็นดูได้ที่ :arrow: จัดรูปแบบตัวอักษร
  7. กำหนดขนาดตัวอักษรใน Browser ดูได้ที่ :arrow: กำหนดขนาดตัวอักษรใน Browser

code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

Forum rules
  1. ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
  2. ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
  3. กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
  4. กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
  5. กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
  6. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่

Post a reply


This question is a means of preventing automated form submissions by spambots.
Smilies
:D :thup: :cp: :flw: :rz: :sg: :tt: :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :arrow: :ard: :arl: :aru: :| :mrgreen: :geek: :ugeek:

BBCode is ON
[img] is ON
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#25

by kuaduang » Thu Dec 06, 2012 1:44 pm

ไฟส์สำเร็จรูปลองให้สมาชิกนำไปทดลองใช้งานดู ขัดข้อง ผิดพลาด เชิญที่ kuaduang_t@hotmail.com :roll: ครับ
Attachments
บิลหน้าร้าน.xlsm
(114.24 KiB) Downloaded 31 times

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#24

by kuaduang » Tue Nov 27, 2012 5:08 pm

:lol: หาสาเหตุเจอพอดี ขอบคุณครับ การป้องกันแผ่นงาน :( เผื่อไปลบโดยบังเอิญ ป้องกันแล้ว ปุ่มบันทึก ปุ่มยกเลิกใช้ไม่ได้

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#23

by snasui » Mon Nov 26, 2012 2:06 pm

:D ที่ Procedure มีการ Disable Event เอาไว้ ดังนั้น ในทุก ๆ Exit Sub ที่เขียนใน Code ควรจะ Enable Event กลับมาเหมือนเดิม

Code: Select all

Public Sub SaveBill()
    Application.EnableEvents = False
    Debug.Print "Savebill"

    Dim ServiceCurrentID As Range
    Set ServiceCurrentID = Range("ServiceCurrentID")
    Dim ServiceCurrentQty As Range
    Set ServiceCurrentQty = Range("ServiceCurrentQty")
    
    Dim r As Long
    Dim id As String
    Dim header As String
    Dim recs As New Collection
    Dim rec As Variant
    Dim currentRow As Long, VATValue As Double, subTotal As Double, grandTotal As Double
    
    Dim printHeader As New ReceiPtHeader
    Dim printDetails As New Collection
    
    printHeader.billDate = Now()
    printHeader.customer = Range("ServiceCodeCus").Value
    header = addCSV(Format(printHeader.billDate, "yyyy/mm/dd h:mm:ss"))
    header = header & addCSV(printHeader.customer, True)
           
    
    Dim Code_Data As Range
    Dim ItemCost As Range
    Set Code_Data = Range("Code_Data")
    Set ItemCost = Range("ItemCost")
    
    Dim itemRec As ReceiptDetail
    For r = 1 To ServiceCurrentID.Count
        id = Trim(ServiceCurrentID.Cells(r, 1).Value)
        currentRow = ServiceCurrentID.Cells(r, 1).Row
        If id <> "" And ServiceCurrentQty.Cells(r, 1).Value > 0 Then
            'save record
            Set itemRec = New ReceiptDetail
            
            'id, title, qty, price, sub total, vat, grand total,cost
            With itemRec
                .itemID = id
                .title = Sheets("Service Invoice").Range("B" & currentRow).Value
                .qty = Sheets("Service Invoice").Range("F" & currentRow).Value
                .price = Sheets("Service Invoice").Range("E" & currentRow).Value
                .total = Sheets("Service Invoice").Range("G" & currentRow).Value
                
                rec = addCSV(.itemID, True, True)
                rec = rec & addCSV(.title, True)
                rec = rec & addCSV(.qty, True)
                rec = rec & addCSV(.price, True)
                rec = rec & addCSV(.total, True)
                subTotal = .total
                     
            End With
            
            Call printDetails.Add(itemRec)
            Call recs.Add(rec)
        End If
    Next r
    
    If recs.Count = 0 Then
        MsgBox "ไม่พบรายการขาย โปรดตรวจสอบอีกครั้ง", vbExclamation, "หน้าร้าน"
        Application.EnableEvents = True
        Exit Sub
    End If
    
    
    'save file to folder
    Dim targetFolder As String
    Dim resultFilename As String 'ขายหน้าร้าน_yyyy-mm.xlsx
    targetFolder = ActiveWorkbook.Path & "\data"
    resultFilename = targetFolder & "\b" & "ill" & "ขายหน้าร้าน_" & Format(Now(), "yyyy-mm") & ".csv"
    
    'check folder exist
    On Error GoTo saveError2
    Call ChDir(targetFolder)
    On Error GoTo saveError3
    Call ChDir(targetFolder)
    
    On Error GoTo 0
    'get current bill id
    Dim readLine As String
    Dim BillID As Long
    Open (targetFolder & "\ขายหน้าร้าน_id.txt") For Input As #1
    Line Input #1, readLine
    Close
    BillID = Val(readLine)
    saveBillID = BillID
    header = BillID & "," & header
    
    
    If Dir(resultFilename) = "" Then
        Open resultFilename For Output As #1
        Print #1, "บิลหมายเลข,วันที่,ลูกค้า,รหัสสินค้า,รายละเอียด,จำนวน,ราคา,รวมเป็นเงิน,VAT,รวมสุทธิ,ต้นทุน"
        Close #1
    End If

    Dim lineString As String
    Open resultFilename For Append As #1
    For Each rec In recs
        lineString = header & rec
        Print #1, lineString
    Next rec
    Close #1
    
    'add new id
    BillID = BillID + 1
    Open (targetFolder & "\ขายหน้าร้าน_id.txt") For Output As #1
    Print #1, BillID
    Close
    
    Range("ServiceCodeCus").Value = ""
    Range("ServiceCurrentID").ClearContents
    Range("ServiceCurrentQty").ClearContents
    Range("ServiceInputID").ClearContents
    Range("$G$24").ClearContents
    Range("ServiceInputID").Select
   
    Beep
    
    'print receipt
    Call PrintReceipt(printHeader, printDetails)
    
    'show form and exit
    frmStatus.Show
    Application.EnableEvents = True
    Exit Sub
    
    
saveError2:
    'create resultFolder
    Call MkDir(targetFolder)
    'create id file
    Open (targetFolder & "\ขายหน้าร้าน_id.txt") For Output As #1
    Print #1, "1"
    Close #1
    Resume Next
    
saveError3:
    MsgBox "ไม่สามารถเปิดโฟลเดอร์ " & targetFolder & " เพื่อบันทึกไฟล์ได้" & "โปรดตรวจสอบและบันทึกไฟล์ด้วยตัวท่านเอง", vbExclamation, "บิล" & ขายหน้าร้าน
    Application.EnableEvents = True
    Exit Sub

End Sub
กรณีต้องกรณีต้องการให้แสดงเลขที่ Invoice ในลำดับถัดไป ลองปรับ Code ที่ UserForm_Activate ตามด้านล่างครับ

Code: Select all

Private Sub UserForm_Activate()
    BillID.Caption = saveBillID
    Range("G4") = saveBillID + 1
End Sub

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#22

by kuaduang » Mon Nov 26, 2012 1:03 pm

:shock: ขอเพิ่มอีกนิดหนึ่ง ต้องการ ให้เลขที่บิล ขึ้นอัตโนมัติเมื่อมีการขายไปแต่ละบิลที่ G3 ต้องเพิ่ม code vba หรือ ใช้ฟังก์ชั้น
รบกวนแค่นี้ครับ ขอบคุณครับ :flw:

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#21

by kuaduang » Mon Nov 26, 2012 12:37 pm

แนบไฟส์มาให้ช่วยตรวจความถูกต้องให้ด้วย
โปรแกรมร้านค้า.xlsm
ออกบิลเสร็จ กดบันทึก เป็นเสร็จ 1 บิล จะเริ่มบิลใหม่ เลือก E7 กดเลือกชื่อสินค้าที่ต้องการ มันไม่ทำงาน ต้องไปยกเลิกบิลก่อนแล้ว กด E7 จึงจะทำงาน ขอบคุณครับ
(64.52 KiB) Downloaded 26 times

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#20

by snasui » Sun Nov 25, 2012 3:18 pm

:D ลองแนบไฟล์ที่ Update ล่าสุดมาดูกันครับ

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#19

by kuaduang » Sun Nov 25, 2012 12:58 pm

ใช้ได้แล้วครับ ไปต่างจังหวัดเสียหลายวัน แต่มันยังมีปัญหาอยู่อีกนิดหนึ่งครับ เมื่อบันทึกบิลเรียบร้อยแล้ว จะขึ้นบิลใหม่มันไม่ยอมทำงานอีก คือ พอเราจบบิลการขายครั้งหนึ่งมีการบันทึกบิลเก็บเอาไว้ โดยกด บันทึก เป็นอันว่าเสร็จการขาย 1 บิล ตอนนี้ขายต่อ กด ป้อนรหัสลูกค้าเสร็จ ไปเลือกรายการสินค้า กด E7 ปกติ รหัสสินค้า A13 จะขึ้นมาให้ แต่พอใส่ code ที่ให้มามันไม่มีรหัสสินค้า(ไม่ยอมทำงาน) ต้องไปกด ยกเลิกบิลก่อนจึงกลัมมาเลือกรายการสินค้าได้อัก แต่ที่ต้องการคือ เมื่อบันทึกเสร็จเริ่มบิลใหม่ได้เลยโดยไม่ต้องกลับไปยกเลิกบิลอีกครั้ง ครับ

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#18

by snasui » Mon Nov 05, 2012 5:07 pm

:D ปรับ Code ที่ Sub CancelBill เป็นตามด้านล่างครับ

Code: Select all

Public Sub CancelBill()
    Application.EnableEvents = False
    Debug.Print "Cancelbill"
    
    If MsgBox("ต้องการยกเลิกบิลที่กำลังทำงานอยู่", vbQuestion + vbYesNo + vbDefaultButton2, "ขายหน้าร้าน") = vbYes Then
        Range("ServiceCurrentID").ClearContents
        Range("ServiceCurrentQty").ClearContents
        Range("ServiceInputID").ClearContents
        Range("$G$24").ClearContents
        Range("ServiceInputID").Select
        
    End If
    Application.EnableEvents = True
End Sub

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#17

by kuaduang » Mon Nov 05, 2012 10:36 am

:lol: กดปุ่มยกเลิก
Attachments
แนบ2.docx
เมื่อกอปุ่มยกเลิกบิน ให้ตอบ yes or no เมื่อตอบ yes มันจะขึ้น error 13
(176.84 KiB) Downloaded 24 times

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#16

by kuaduang » Mon Nov 05, 2012 10:29 am

แนบ ภาพ 1
Attachments
แนบ1.docx
เมื่อเลือกชื่อสินค้า
(165.23 KiB) Downloaded 14 times

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#15

by kuaduang » Mon Nov 05, 2012 10:21 am

จะแนบไฟล์ให้มันใหญ่เกิน เมื่อใส่ code สินค้าซ้ำเปลี่ยนจำนวนสินค้าอัตโนมัติมันใช้ได้ แต่เวลายกเลิกบิล มัน error 8iy[
จาก sheet service เลือกป้อนชื่อสินค้าตามต้องการ E7 จะได้บิลขาย 1 บิล แต่บิลผิดพลาดต้องการยกเลิก กดปุ่มยกเลิก
ตอบ Yes :roll: มันจะขึ้น error ครับ
Attachments
เอกสาร1.doc
(179.5 KiB) Downloaded 22 times

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#14

by snasui » Sun Nov 04, 2012 11:30 am

kuaduang wrote:ขอบคุณครับ แจ้งลบไฟล์แนบให้ด้วยครับ
:D จะลบไฟล์แนบเดิมได้ ต้องส่งไฟล์ตัวอย่างใหม่มาให้ก่อน และไฟล์ตัวอย่างต้องเหมือนกับไฟล์จริง เพียงแต่เปลี่ยนข้อความสำคัญไปเป็นอย่างอื่นที่ไม่ก่อให้เกิดความเสียหายกับบุคคลหรือองค์กรที่อยู่ในไฟล์นั้นครับ โดยปกติจะไม่แนบไฟล์จริง ซึงผมได้เขียนเป็นกฎการใช้บอร์ดข้อ 4 ไว้ด้านบนครับ
kuaduang wrote: เวลายกเลิกบิล Run.time error "13:" Type mismatch. ต้องปรับโค๊ดตรงใหนครับ เดิมผมใช้
Range. Service CurrentID ( >=A13,<=A22)
การยกเลิกบิลที่ว่า มีวิธีการอย่างไร คีย์ตรงไหน คลิกปุ่มไหน Procedure ที่เกี่ยวข้องคือตัวไหน ช่วยอธิบายรายละเอียด เพื่อจะได้ช่วยทดสอบและแก้ไขให้ได้ครับ

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#13

by kuaduang » Sun Nov 04, 2012 11:11 am

เวลายกเลิกบิล Run.time error "13:" Type mismatch. ต้องปรับโค๊ดตรงใหนครับ เดิมผมใช้
Range. Service CurrentID ( >=A13,<=A22)

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#12

by kuaduang » Sun Nov 04, 2012 10:45 am

code ได้ตามเป้าประสงค์ครับ แต่เวลา เคลียร์บิลไม่ต้องการมัน Errer 13
i = Application.Match(id, .Range("A:A"), 0) ต้องเปลี่ยนตัวใหนด้วยดรับ

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#11

by kuaduang » Sun Nov 04, 2012 10:26 am

ขอบคุณครับ แจ้งลบไฟล์แนบให้ด้วยครับ

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#10

by snasui » Fri Nov 02, 2012 10:00 am

kuaduang wrote: เช่น เลือกแถว A13-A22 มันจะไปถึง
A23 ด้วย ในโปรแกรมผมลักไก่คือ ตั้งไว้ที่ A13-A21 จะได้ A22 ด้วย
ช่วยแจ้ง Procedure ด้วยครับว่าชื่ออะไร จะได้เข้าถึงข้อมูลได้โดยไวครับ

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#9

by kuaduang » Fri Nov 02, 2012 9:02 am

ขอขอบพระคุณมากๆ ที่ให้ตรงตามเป้าประสงค์ครับ อีกนิดหนึ่ง เวลาเลือกแถวใน sheet มันล้นไปหนึ่งแถว เช่น เลือกแถว A13-A22 มันจะไปถึง
A23 ด้วย ในโปรแกรมผมลักไก่คือ ตั้งไว้ที่ A13-A21 จะได้ A22 ด้วย ขอคุณมากๆครับ

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#8

by snasui » Thu Nov 01, 2012 2:42 pm

:D ในโอกาสหน้าก็ควรจะเขียนอธิบายเช่นที่เขียนมานี้ ไม่ใช่ให้เดาเอาเองครับ :mrgreen:

ลองปรับ Code เป็นตามด้านล่าง

Code: Select all

Private Sub Worksheet_Change(ByVal Target As Range)
    Select Case Target.Address
        Case "$E$7"
            Call AddVal
            Range("E7").Select
            'reset qty after add id
            If Range("G7").Value > 1 Then Range("G7").Value = 1
        Case "$G$7"
            If Target.Value < 1 Then Target.Value = 1
        Case Else:
            If Left(Target.Address, 6) = "$F$" Then
                If Target.Row >= 13 And Target.Row <= 22 Then
                    If IsEmpty(Target.Value) Then
                        Range("F" & Target.Row).ClearContents
                    End If
                End If
            End If
            'Debug.Print "x " & Target.Address
    End Select
End Sub
และเพิ่ม Code ตามด้านล่าง

Code: Select all

Sub AddVal()
    Dim i As Integer, rCheck As Range
    Dim rAll As Range, rsAll As Range
    Dim id As String, l As Long
    With Sheets("DATA_ITEM")
        Set rsAll = .Range("C:C")
    End With
    With Sheets("Service Invoice")
        Set rCheck = .Range("E7")
        If Application.CountIf(rsAll, rCheck) > 0 Then
            l = Application.Match(rCheck, rsAll, 0)
            id = Sheets("DATA_ITEM").Range("B" & l)
        Else
            Call addNewItem(rCheck.Value)
        End If
        If Application.CountIf(.Range("A:A"), id) > 0 Then
            i = Application.Match(id, .Range("A:A"), 0)
            .Range("F" & i) = .Range("F" & i) + 1
        Else
            Call addNewItem(rCheck.Value)
        End If
    End With
End Sub

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#7

by kuaduang » Thu Nov 01, 2012 1:02 pm

ที่แก้ไขนั้นก็ดีแล้ว แต่ที่ต้องการคือ เมื่อเลือกชิ่อสินค้าซ้ำ จำนวนสินค้าจะเพิ่มเอง สมมุติซื้อเบียร์ลีโอแคน 1 กระป๋อง ต้องการเพิ่มอีก 1 กระป๋อง
โดยเลือกที่ E7 เป็นชื่อเบียร์ลีโอแคน ส่วนจำนวนจะเพิ่มเองคือ 1 กระป๋อง(อัตโนมัติ เพราะตั้งจำนวนไว้แล้วคือ 1 ) โปรแกรมตั้งไว้จำนวน 1 ทุกชื่อสินค้าเมื่อไม่ระบุจำนวน ใน qty จะเป็น 1 เสมอ ขอขอบคุณที่เพิ่มเติม code ให้

Re: code vba excel หาจำนวนสินค้า เมื่อรหัสสินค้าซ้ำ

#6

by snasui » Wed Oct 31, 2012 9:14 am

:lol: ด้านล่างนี้ ปรับแล้วไม่เหมือนเดิม


Top