Page 2 of 2

Re: แสดงค่าซ้ำใน Range

Posted: Sun May 22, 2016 4:29 pm
by chom_poona
คำตอบที่ต้องการให้แสดงอยู่ในไฟลน์แนบค่ะ

ขอบคุณค่ะ

Re: แสดงค่าซ้ำใน Range

Posted: Sun May 22, 2016 4:35 pm
by snasui
:D ตัวอย่าง Code มีการปรับเปลี่ยน Range เล็กน้อยและต้องใส่ .Apply ครับ

Code: Select all

ActiveWorkbook.Worksheets("test").sort.SortFields.Clear
ActiveWorkbook.Worksheets("test").sort.SortFields.Add Key:=Range("k6:K17"), _
    SortOn:=xlSortOnValues, Order:=xlDescending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("test").sort
    .SetRange Range("J5:K16")
    .Header = xlGuess
    .MatchCase = False
    .Orientation = xlTopToBottom
    .SortMethod = xlPinYin
    .Apply
End With

Re: แสดงค่าซ้ำใน Range

Posted: Sun May 22, 2016 4:48 pm
by chom_poona
ขอบคุณนะค่ะ

Sort ได้แล้วค่ะ

ขอถามเพิ่มเติมนะค่ะ ถ้าเราจะเอาค่า Range ต้องการเอาค่าใน Range"b19:e24"
เปรียบเทียบค่ากับ B3:E5 ว่ามีตัวไหนซ้ำบ้าง จะเปรียบเทียบค่าระหว่าง range ได้อย่างไรบ้างค่ะ เพราะว่า
มีตารางทั้งหมด 7 ตาราง ที่ใช้หาค่าซ้ำ

ขอบคุณมากนะค่ะ

Re: แสดงค่าซ้ำใน Range

Posted: Sun May 22, 2016 5:52 pm
by snasui
:D เขียนหรือปรับ Code มาเองก่อน ติดตรงไหนค่อยถามกันต่อครับ

Re: แสดงค่าซ้ำใน Range

Posted: Sun May 22, 2016 6:24 pm
by chom_poona
ได้แล้วค่ะ

เพิ่ม Range เข้าไป Set rAll = .Range("b19:e24", "b3:E5")

เส้นผมบังภูเขาแท้ๆๆ

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

Re: แสดงค่าซ้ำใน Range

Posted: Sun May 22, 2016 6:32 pm
by chom_poona
มีปัญหา อีกแล้วค่ะ

ค่าไม่ sort จากมากไปหาน้อยค่ะ

แล้วก็ เพิ่มค่า range เข้าไป ระบุว่า มากกว่า 1 ค่า แต่ ค่าซ้ำที่มีค่า = 1 ก็ออกมาด้วยค่ะ

ช่วยดู สูตรให้หน่อยค่ะ

ขอบคุณค่ะ

Re: แสดงค่าซ้ำใน Range

Posted: Sun May 22, 2016 6:51 pm
by snasui
:D ตัวอย่าง Code เติมค่าในคอลัมน์ J และ O

Code: Select all

Dim rall As Range, icount As Long
Dim r1 As Range, r2 As Range
Dim c As New Collection, item As Variant
With ActiveSheet
    Set rall = Union(.[b3:e5], .[b19:e24])
    .Range("j6:j1000,o6:o1000").ClearContents
    For Each r1 In rall
        icount = 0
        For Each r2 In rall
            If r1.Value = r2.Value Then
                icount = icount + 1
            End If
        Next r2
        On Error Resume Next
        If icount > 1 Then
            c.Add CStr(r1.Value), CStr(r1.Value)
        End If
        On Error GoTo 0
    Next r1
    For Each item In c
        If CLng(item) <= .[j2] Then
            .Range("j" & .Rows.Count).End(xlUp) _
                .Offset(1, 0).Value = CLng(item)
        Else
            .Range("o" & .Rows.Count).End(xlUp) _
                .Offset(1, 0).Value = CLng(item)
        End If
    Next item
End With
ส่วนคอลัมน์ K:M ให้ Loop ด้วย Code แทนการเขียนสูตร เนื่องจากสูตรเป็นอุปสรรคต่อการจัดเรียงครับ

Re: แสดงค่าซ้ำใน Range

Posted: Sun May 22, 2016 7:36 pm
by chom_poona
เอา code มาใส่แล้ว ลอง run ดู

error ค่ะ ตรง with activesheet

Re: แสดงค่าซ้ำใน Range

Posted: Sun May 22, 2016 7:51 pm
by chom_poona
On Error Resume Next ---> คืออะไรค่ะ
If icount > 1 Then
c.Add CStr(r1.Value), CStr(r1.Value)
End If
On Error GoTo 0
Next r1
For Each item In c
If CLng(item) <= .[j2] Then --> CLng คืออะไรค่ะ ตัวแปรหรือ คำสั่งค่ะ
.Range("j" & .Rows.Count).End(xlUp) _
.Offset(1, 0).Value = CLng(item)
Else
.Range("o" & .Rows.Count).End(xlUp) _
.Offset(1, 0).Value = CLng(item)
End If
Next item
End With

รบกวน อธิบาย code ส่วนนี้ให้ฟังหน่อยค่ะ

Re: แสดงค่าซ้ำใน Range

Posted: Sun May 22, 2016 8:13 pm
by chom_poona
ไม่ error แล้วค่ะ แต่ไม่เข้าใจสูตรอยู่ค่ะ [j2] มาจากไหนค่ะ คือตัวแปร Array แต่เราไม่ได้ประกาศตัวแปรเป็น Array เลยนะค่ะ

Re: แสดงค่าซ้ำใน Range

Posted: Sun May 22, 2016 8:18 pm
by snasui
chom_poona wrote:On Error Resume Next ---> คืออะไรค่ะ
:D หมายถึง ถ้าผิดพลาดก็ให้ Run ต่อเนื่องไป ไม่ต้องแสดง Error ที่เขียนไว้เช่นนี้จำเป็นต้องทราบนะครับว่าบรรทัดต่อจากบรรทัดนี้จะเกิด Error ลักษณะใด ไม่ใช่ว่าใช้ในทุกกรณี
chom_poona wrote:If CLng(item) <= .[j2] Then --> CLng คืออะไรค่ะ ตัวแปรหรือ คำสั่งค่ะ
คำสั่งนี้ใช้แปลง item ให้มี Variable Type เป็น Long
chom_poona wrote:เอา code มาใส่แล้ว ลอง run ดู

error ค่ะ ตรง with activesheet
ในเครื่องผมไม่เกิด Error ครับ

Re: แสดงค่าซ้ำใน Range

Posted: Sun May 22, 2016 8:26 pm
by chom_poona
ขอบคุณมากเลยนะค่ะ

ตัวแปร Collection คืออะไรหรอค่ะ

Re: แสดงค่าซ้ำใน Range

Posted: Sun May 22, 2016 8:32 pm
by chom_poona
c.Add CStr(r1.Value), CStr(r1.Value) คำสั่งนี้ คืออะไรหรอค่ะ

อยากมองสูตรเป็นจังค่ะ อยากเก่งๆบ้าง

Re: แสดงค่าซ้ำใน Range

Posted: Sun May 22, 2016 8:43 pm
by snasui
chom_poona wrote:ตัวแปร Collection คืออะไรหรอค่ะ
chom_poona wrote:c.Add CStr(r1.Value), CStr(r1.Value) คำสั่งนี้ คืออะไรหรอค่ะ
:D แปลอย่างง่าย Collection เปรียบเหมือนกล่อง เป็นตัวแปรที่ใช้เก็บตัวแปรอื่น เหมือน Workbooks ที่มีหลาย Workbook เหมือน Worksheets ที่มีหลาย Worksheet เช่นนี้เป็นต้น

c.Add CStr(r1.Value), CStr(r1.Value) คือการเพิ่มค่าสมาชิกให้กับ Collection ที่ชื่อ c ครับ

ควรหาหนังสือเกี่ยวกับ Excel VBA มาอ่านเช่นของ John Walkenbach จะได้เข้าใจเรื่องของ Object Oriented Programming ของ Excel แต่หากจะใช้ VBA ทำงานจริงจัง คงต้องอ่านหลายเล่มและฝึกฝนค่อนข้างหนักและต่อเนื่อง ต้องใช้ความอดทนสูงครับ :mrgreen:

การโพสต์พยายามให้อยู่ในโพสต์เดียวกัน ยกเว้นจะมีการตอบแทรกเข้ามาก่อนครับ

อ่อ...ลักษณะนี้ไม่เรียกว่าสูตร แต่มันคือ Code VBA ครับ

Re: แสดงค่าซ้ำใน Range

Posted: Sun May 22, 2016 8:46 pm
by chom_poona
ขอบคุณมากเลยนะค่ะ ที่สละเวลามาช่วยดู code ให้ และจะพยายามฝึกให้มากๆค่ะ สำหรับกระทู้นี้ ขอจบคำถามไว้แค่นี้ค่ะ

ในโอกาสหน้าอาจต้องรบกวนอาจารย์อีกนะค่ะ

ขอบพระคุณอย่างสูงค่ะ