: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 เรียงตามวันที่ก่อนหลังและเรียงตามลำดับเลขที่ค่ะ

ฟอรัมถาม-ตอบปัญหาการใช้งาน Macro และ VBA
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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
User avatar
suka
Silver
Silver
Posts: 920
Joined: Tue Nov 16, 2010 7:38 pm
Excel Ver: 2007,2021

Code เรียงตามวันที่ก่อนหลังและเรียงตามลำดับเลขที่ค่ะ

#1

Post by suka »

เรียนอาจารย์และท่านผู้รู้ค่ะ

ไฟล์แนบ PO.xlsm ชีท Form เมื่อกดปุ่ม Record ให้นำข้อมูลไปวางที่ไฟล์ DB.xlsx ชีท Sheet1 โดยเรียงตามวันที่เรียงก่อนหลังที่คอลัมน์ A และเรียงตามลำดับเลขที่เอกสารที่คอลัมน์ D

ติดที่โค๊ดนี้ยังแก้ไม่ได้ค่ะ ยังติดปัญหาทีไฟล์ DB.xlsx ชีท Sheet1 ระบายสีแดงไว้ และที่ต้องการได้ระบายสีเหลืองไว้ค่ะ

Code: Select all

With wbShare
       Set shRange = .Sheets("Sheet1").Range("A1", .Range("Z" & Rows.Count).End(xlUp))
       shRange.Borders.LineStyle = xlContinuous
       shRange.Sort Key1:=.Sheets("Sheet1").Range("D2"), Order1:=xlAscending, Header:=xlGuess
End With
นำมาใช้กับโค๊ดชุดนี้ค่ะ

Code: Select all

Sub PasteData()
        Dim wbShare As Workbook
        Dim formBook As Workbook
        Dim rTarget As Range
        Dim i As Integer
        Dim E As Long
        Dim rs As Range
        Dim rt As Range
        Dim rd As Range
        Dim shRange As Range

        Set formBook = ThisWorkbook
        Set wbShare = Workbooks("DB.xlsx")
        On Error Resume Next
        wbShare.Sheets("Sheet1").ShowAllData
        With wbShare
                E = .Sheets("Sheet1").Range("f" & Rows.Count).End(xlUp).Value + 1
                Select Case formBook.Sheets("Form").Range("o2").Value
                        Case "ใบกำกับภาษี"
                            E = formBook.Sheets("Sheet1").Range("c2")
                        Case "ใบส่งสินค้าชั่วคราว"
                            E = formBook.Sheets("Sheet1").Range("c3")
                End Select
                formBook.Worksheets("Form").Range("m2").Value = E
        End With
       
         wbShare.Save
       
        With formBook
                i = .Worksheets("Form").Range("C225").Value
        End With
        With formBook.Worksheets("Template")
                Set rs = .Range(.Range("A2"), .Range("Z" & i + 1))
        End With
                Set rt = wbShare.Sheets("Sheet1").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
                        If formBook.Worksheets("Form").Range("C225") = True Then
                        End If
            With wbShare
                    Set shRange = .Sheets("Sheet1").Range("A1", .Range("Z" & Rows.Count).End(xlUp))
                    shRange.Borders.LineStyle = xlContinuous
                    shRange.Sort Key1:=.Sheets("Sheet1").Range("D2"), Order1:=xlAscending, Header:=xlGuess
           End With
      
        If formBook.Worksheets("Form").Range("B204") = "" Then
                MsgBox "Your data is empty. Fill your data and click record button again."
            Exit Sub
        End If
             rs.Copy: rt.PasteSpecial xlPasteValues
            formBook.Save
            formBook.Activate
            formBook.Sheets("Form").Range("D2,B204:B220,D204:D220,D222, E204:F220,O204,N204:N220").ClearContents
End Sub
Attachments
PO.xlsm
(95.87 KiB) Downloaded 13 times
DB.xlsx
(14.1 KiB) Downloaded 14 times
User avatar
DhitiBank
Gold
Gold
Posts: 1676
Joined: Mon Oct 15, 2012 12:07 am

Re: Code เรียงตามวันที่ก่อนหลังและเรียงตามลำดับเลขที่ค่ะ

#2

Post by DhitiBank »

ลองปรับแบบนี้ครับ

Code: Select all

With wbShare
       Set shRange = .Sheets("Sheet1").Range("A1", .Range("Z" & Rows.Count).End(xlUp))
       shRange.Borders.LineStyle = xlContinuous
       .Soft.SortFields.Clear
'เกณฑ์ที่สำคัญอันดับ 1
       .Sort.SortFields.Add Key:=.Range("a1") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
'เกณฑ์ที่สำคัญอันดับ 2
       .Sort.SortFields.Add Key:=.Range("d1") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
       With .Sort
           .SetRange shRange
           .Header = xlYes
           .SortMethod = xlPinYin
           .MatchCase = False
           .Apply
       End With
End With
User avatar
suka
Silver
Silver
Posts: 920
Joined: Tue Nov 16, 2010 7:38 pm
Excel Ver: 2007,2021

Re: Code เรียงตามวันที่ก่อนหลังและเรียงตามลำดับเลขที่ค่ะ

#3

Post by suka »

ขอบคุณค่ะคุณ DhitiBank

ขออภัยค่ะ โพสต์ก่อนหน้านี้อธิบายปัญหาให้ไม่เคลียร์ ขออนุญาตอธิบายอีกรอบค่ะ

สิ่งที่ต้องการ
หากข้อมูลที่มีในไฟล์ DB.xlsx ชีท Sheet1 คอลัมน์ A เป็นวันที่เดียวกันที่คอลัมน์ D ให้เรียงลำดับตามเลขที่น้อยไปมาก หากข้อมูลที่มีในไฟล์ DB.xlsx ชีท Sheet1 คอลัมน์ A มีวันที่ต่างกันให้เรียงลำดับตามวันที่แทนค่ะ
User avatar
DhitiBank
Gold
Gold
Posts: 1676
Joined: Mon Oct 15, 2012 12:07 am

Re: Code เรียงตามวันที่ก่อนหลังและเรียงตามลำดับเลขที่ค่ะ

#4

Post by DhitiBank »

โค้ดตามด้านบนนั่นเป็นการเรียงลำดับตามที่คุณ suka บอกเลยครับ ผมลองทดสอบแล้ว ไม่ทราบว่าคุณ suka ลองทดสอบโค้ดหรือยังครับ

พอดีขอปรับตรง .[color=#FF0040]Soft[/color].SortFields.Clear ให้เป็น .[color=#0000FF]Sort[/color].SortFields.Clear ครับ สงสัยตอนคัดลอกมามือไปโดนอะไรสักอย่าง

Code: Select all

   With wbShare.Sheets(1)
        Set shRange = .Range("a1", .Range("z" & .Rows.Count).End(xlUp))
        shRange.Borders.LineStyle = xlContinuous
       .Sort.SortFields.Clear
'เกณฑ์ที่สำคัญอันดับ 1
       .Sort.SortFields.Add Key:=.Range("a1") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
'เกณฑ์ที่สำคัญอันดับ 2
       .Sort.SortFields.Add Key:=.Range("d1") _
        , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
       With .Sort
           .SetRange shRange
           .Header = xlYes
           .SortMethod = xlPinYin
           .MatchCase = False
           .Apply
       End With
    End With
User avatar
suka
Silver
Silver
Posts: 920
Joined: Tue Nov 16, 2010 7:38 pm
Excel Ver: 2007,2021

Re: Code เรียงตามวันที่ก่อนหลังและเรียงตามลำดับเลขที่ค่ะ

#5

Post by suka »

DhitiBank wrote:พอดีขอปรับตรง .Soft.SortFields.Clear ให้เป็น .Sort.SortFields.Clear ครับ สงสัยตอนคัดลอกมามือไปโดนอะไรสักอย่าง
ได้ปรับโค๊ดแล้วรันยังไม่ได้ค่ะ ยังได้ตามรูปแนบค่ะ
Attachments
3 (Small).JPG
3 (Small).JPG (33.1 KiB) Viewed 140 times
User avatar
DhitiBank
Gold
Gold
Posts: 1676
Joined: Mon Oct 15, 2012 12:07 am

Re: Code เรียงตามวันที่ก่อนหลังและเรียงตามลำดับเลขที่ค่ะ

#6

Post by DhitiBank »

แปลกจริงครับ ผมลองรันดูก็ได้ตามรูปด้านล่างนี้ครับ
2015-10-13_154331.png
2015-10-13_154331.png (11.04 KiB) Viewed 139 times
Attachments
Copy of PO.xlsm
(106.97 KiB) Downloaded 6 times
User avatar
suka
Silver
Silver
Posts: 920
Joined: Tue Nov 16, 2010 7:38 pm
Excel Ver: 2007,2021

Re: Code เรียงตามวันที่ก่อนหลังและเรียงตามลำดับเลขที่ค่ะ

#7

Post by suka »

ได้นำโค๊ดล่าสุดของคุณ DhitiBank มาปรับใช้กับไฟล์ใช้งานจริง ที่คอลัมน์ F เลขที่เรียงลำดับได้แล้วค่ะ

แต่ยังติดที่คอลัมน์ B วันที่ ดูตัวอย่างจากรูปแนบค่ะ เซลล์ B33036 วันที่10 ต.ค.58 ยังต่อท้ายวันที่ 13 ต.ค.58 ค่ะ ต้องการให้เซลล์ B33036 ซึ่งเป็นวันที่10 ต.ค.58 ไปเรียงเข้ากลุ่มวันที่10 ต.ค.58 ด้วยค่ะ

Code: Select all

With wbShare.Sheets(1)
                Set shRange = .Range("b1", .Range("ad" & .Rows.Count).End(xlUp))
                shRange.Borders.LineStyle = xlContinuous
               .Sort.SortFields.Clear
        'เกณฑ์ที่สำคัญอันดับ 1
               .Sort.SortFields.Add Key:=.Range("b1") _
                , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        'เกณฑ์ที่สำคัญอันดับ 2
               .Sort.SortFields.Add Key:=.Range("f1") _
                , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
               With .Sort
                   .SetRange shRange
                   .Header = xlYes
                   .SortMethod = xlPinYin
                   .MatchCase = False
                   .Apply
               End With
            End With
Attachments
BF (Small).JPG
BF (Small).JPG (51.84 KiB) Viewed 137 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31253
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: Code เรียงตามวันที่ก่อนหลังและเรียงตามลำดับเลขที่ค่ะ

#8

Post by snasui »

:D จาก Code ที่นำไปปรับใช้ Set shRange = .Range("b1", .Range("[color=#FF0000]ad[/color]" & .Rows.Count).End(xlUp)) พบว่าอ้างอิงถึงคอลัมน์ AD ไม่ทราบว่าข้อมูลจริงมีเท่าไรครับ

หากจะให้แน่นอน ควรนับคอลัมน์ B ว่าบรรทัดสุดท้ายคือบรรทัดใดแล้วกำหนดบรรทัดสุดท้ายนั้นให้กับคอลัมน์ AD

ยกตัวอย่าง Code

Code: Select all

'...
dim lastRow as long
with sheets(1)
    lastRow = .range("b" & .rows.count).end(xlup).row
    Set shRange = .Range("b1:ad" & lastRow)
end with
'...
User avatar
suka
Silver
Silver
Posts: 920
Joined: Tue Nov 16, 2010 7:38 pm
Excel Ver: 2007,2021

Re: Code เรียงตามวันที่ก่อนหลังและเรียงตามลำดับเลขที่ค่ะ

#9

Post by suka »

ปรับโค๊ดให้เรียงข้อมูลได้ตามต้องการแล้วค่ะอาจารย์

ยังติดที่โค๊ดด้านล่างนี้ไม่ต้องการใช้เส้นขอบ ควรปรับไรคะ

Code: Select all

With wbShare.Sheets(1)
                lastRow = .Range("b" & .Rows.Count).End(xlUp).Row
                Set shRange = .Range("b1:ad" & lastRow)
                shRange.Borders.LineStyle = xlContinuous
               .Sort.SortFields.Clear
        'เกณฑ์ที่สำคัญอันดับ 1
               .Sort.SortFields.Add Key:=.Range("b1") _
                , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
        'เกณฑ์ที่สำคัญอันดับ 2
               .Sort.SortFields.Add Key:=.Range("f1") _
                , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
               With .Sort
                   .SetRange shRange
                   .Header = xlYes
                   .SortMethod = xlPinYin
                   .MatchCase = False
                   .Apply
               End With
            End With
User avatar
suka
Silver
Silver
Posts: 920
Joined: Tue Nov 16, 2010 7:38 pm
Excel Ver: 2007,2021

Re: Code เรียงตามวันที่ก่อนหลังและเรียงตามลำดับเลขที่ค่ะ

#10

Post by suka »

ขอบคุณอาจารย์มากค่ะ ช่วยให้ผ่านปัญหาได้มากมาย ได้ตรงตามต้องการแล้วค่ะอาจารย์
ขอบคุณคุณ DhitiBank ด้วยค่ะ

ปรับ Code นี้

Code: Select all

shRange.Borders.LineStyle = xlContinuous 
เป็น

Code: Select all

shRange.Borders.LineStyle = xlNone
Post Reply