Page 1 of 1

ต้องการให้ listbox ใน excel vba ไม่สามารถเลือกข้อมูลที่ซ้ำกันได้ครับ

Posted: Thu Jun 10, 2021 3:38 pm
by firstboodza555
ผมกำลังใช้ vba ในการทำฟอร์ม เพื่อเพิ่มข้อมูลสถานที่ท่องเที่ยวเพื่อบันทึกไปเป็น .csv ครับ เเล้วผมใช้ listbox เพื่อให้มาเเสดงข้อมูลเเละ ผมจะเลือกข้อมูลจาก listbox ได้ทีละหลายๆ อันพร้อมกัน เเละกดบันทึกลงในตาราง excel ที่ผมกำหนด
ผมจะสอบถามว่า พอจะมีวิธีที่จะทำให้ ข้อมูลที่ผมได้เลือกใน listbox ไปเเล้วหายไป หรือว่า มีการเเจ้งเตือนว่าข้อมูลนี้ได้ถูกเลือกไปเเล้วเเละไม่สามารถเลือกได้เพราะมีข้อมูลนี้อยู่เเล้วเลือกซ้ำไม่ได้
***ขอบคุณล่วงหน้าครับผม***

Re: ต้องการให้ listbox ใน excel vba ไม่สามารถเลือกข้อมูลที่ซ้ำกันได้ครับ

Posted: Thu Jun 10, 2021 7:36 pm
by snasui
:D ตัวอย่างการวางข้อมูลและการปรับ Code ครับ

Code: Select all

'Other code
If formprogram.ListBox1.Selected(i) Then
    nrange.Offset(0, 0) = formprogram.ListBox1.List(i, 0)
    nrange.Offset(0, 1) = formprogram.ListBox1.List(i, 1)
    nrange.Offset(0, 2) = formprogram.ListBox1.List(i, 2)
    nrange.Offset(0, 3) = formprogram.ListBox1.List(i, 3)
    nrange.Offset(0, 4) = formprogram.ListBox1.List(i, 4)
    nrange.Offset(0, 5) = formprogram.ListBox1.List(i, 5)
    With Worksheets("dataplace")
        .Range("a2").Offset(i, 0).Resize(1, 6).Delete shift:=xlUp
    End With
    Set nrange = nrange.Offset(1, 0)
End If
'Other code
ซึ่งข้อมูลในชีต dataplace จะถูกลบออกไปด้วยครับ

Re: ต้องการให้ listbox ใน excel vba ไม่สามารถเลือกข้อมูลที่ซ้ำกันได้ครับ

Posted: Thu Jun 10, 2021 8:10 pm
by firstboodza555
:flw: อาจารย์พอจะมีวิธีที่ไม่ให้เลือกข้อมูลได้ซ้ำโดยไม่ต้องให้ข้อมูลใน data place หายมั่งมั้ยครับ เพราะว่าข้อมูลนั่นต้องเอาไว้อ้างอิงในตอนเพิ่มข้อมูล เเล้วเดี๋ยวผมต้องทำปุ่มเพื่อเพิ่มข้อมูล ใน หน้า dataplace ด้วยครับ ขอคำเเนะนำด้วยครับ (ถ้าเเบบว่าพอจะเพิ่มข้อมูลที่มีในตารางเเล้วให้ เตือนว่ามีข้อมูลสถานที่นี้เเล้วเเละเพิ่มไม่ได้ประมาณนี้พอจะเป็นไปได้มั้ยครับ)

Re: ต้องการให้ listbox ใน excel vba ไม่สามารถเลือกข้อมูลที่ซ้ำกันได้ครับ

Posted: Thu Jun 10, 2021 8:27 pm
by snasui
:D สามารถออกแบบได้หลายวิธีครับ

กรณีที่ไม่ต้องการปรับ Code ให้ยุ่งยากมากสามารถทำได้ง่าย ๆ ด้วยการคัดลอกข้อมูลไปไว้ยังพื้นที่อื่นก่อน ซึ่งจริง ๆ ข้อมูลควรมาจากพื้นที่อื่น ก่อนนำมาวางในชีต dataplace คอลัมน์ A:F และเมื่อจะทำงานนี้ค่อยนำข้อมูลนั้นมาวางเพื่อใช้เป็น DataSource ให้กับ ListBox ลักษณะการทำงานเช่นนี้ข้อมูลต้นทางก็จะยังมีอยู่ตลอดเวลา

ปกติข้อมูลจะต้องมีต้นทาง ไม่ว่าจะอยู่ใน Database อื่น อยู่ในไฟล์อื่น อยู่ในชีตอื่น หรืออยู่ชีตเดียวกันแต่คนละพื้นที่

การนำมาใช้จะดึงข้อมูลจากต้นทางเข้ามาวางยังพื้นที่ใด ๆ ก่อนจะนำเข้าไปยัง ListBox สำหรับตัวอย่างนี้ก็เช่นกันจะต้องมีที่มาของข้อมูล ดังนั้นข้อมูลคอลัมน์ A:F ของชีต dataplace จะถือว่าไม่ใช่ Source แต่นำข้อมูลจาก Source มาวางอีกที เช่นนี้เป็นต้น

อีกวิธีจะยุ่งยากกว่านี้คือแทนที่จะกำหนด DataSource ให้กับ ListBox แต่เป็นการ Loop ข้อมูลจากชีต dataplace เข้าไปใน ListBox แทน และลบออกจาก ListBox ตามรายการที่วางในพื้นที่เป้าหมายแล้ว ในกรณีนี้สามารถจะใช้ข้อมูลที่ชีต dataplace เป็นต้นทางได้โดยตรงเพราะไม่มีการลบออกไปแต่อย่างใด

อีกวิธีที่พอทำได้คือ หากวางแล้วจะไม่สามารถเลือกรายการนั้นใน ListBox ได้ จะต้องเขียน Code ให้ Loop ไปตรวจสอบเมื่อมีคลิกรายการใน ListฺBox ว่ามีข้อมูลที่ปลายทางแล้วหรือไม่ ในการทำงานจริงย่อมไม่สะดวกแก่ผู้ใช้ การที่ไม่มีรายการให้เลือกจะสะดวกต่อการทำงานมากกว่าครับ

Re: ต้องการให้ listbox ใน excel vba ไม่สามารถเลือกข้อมูลที่ซ้ำกันได้ครับ

Posted: Thu Jun 10, 2021 8:56 pm
by firstboodza555
อีกวิธีจะยุ่งยากกว่านี้คือแทนที่จะกำหนด DataSource ให้กับ ListBox แต่เป็นการ Loop ข้อมูลจากชีต dataplace เข้าไปใน ListBox แทน และลบออกจาก ListBox ตามรายการที่วางในพื้นที่เป้าหมายแล้ว ในกรณีนี้สามารถจะใช้ข้อมูลที่ชีต dataplace เป็นต้นทางได้โดยตรงเพราะไม่มีการลบออกไปแต่อย่างใด
***
ถ้าเป็นวิธีนี้อาจารย์พอจะมีเเนะนำการเเก้ code ให้ได้มั้ยครับ วิธีนี้น่าจะไม่มีผลในตอนที่ผมต้องการเพิ่มข้อมูลสถานที่ใหม่ลงตารางครับ

Re: ต้องการให้ listbox ใน excel vba ไม่สามารถเลือกข้อมูลที่ซ้ำกันได้ครับ

Posted: Thu Jun 10, 2021 9:08 pm
by snasui
:D ดูที่นี่เป็นตัวอย่างครับ viewtopic.php?t=11862#p73311

Re: ต้องการให้ listbox ใน excel vba ไม่สามารถเลือกข้อมูลที่ซ้ำกันได้ครับ

Posted: Thu Jun 10, 2021 9:09 pm
by firstboodza555
:D ขอบคุณมากๆครับอาจารย์

Re: ต้องการให้ listbox ใน excel vba ไม่สามารถเลือกข้อมูลที่ซ้ำกันได้ครับ

Posted: Thu Jun 10, 2021 10:24 pm
by firstboodza555
ในส่วนโค้ดนี้ถ้าต้องการให้เปลี่ยนเป็นลบข้อมูลใน listbox เเบบที่อาจารย์สอนเเทนต้องเปลี่ยนเป็นยังไงบ้างครับผม
With Worksheets("dataplace")
.Range("a2").Offset(i, 0).Resize(1, 6).Delete shift:=xlUp



**อันนี้ผมปรับเเก้มาจากที่อาจารย์เเนะนำไปก่อนหน้านี้เเล้วครับ

Code: Select all

Private Sub UserForm_Initialize()
Dim r As Range, i As Byte
    With Worksheets("dataplace")
        For Each r In .Range("a2", .Range("a" & .Rows.Count).End(xlUp))
            Me.ListBox1.AddItem
            Me.ListBox1.List(i, 0) = r.Value
            Me.ListBox1.List(i, 1) = r.Offset(0, 1).Value
            Me.ListBox1.List(i, 2) = r.Offset(0, 2).Value
            Me.ListBox1.List(i, 3) = r.Offset(0, 3).Value
            Me.ListBox1.List(i, 4) = r.Offset(0, 4).Value
            Me.ListBox1.List(i, 5) = r.Offset(0, 5).Value
            i = i + 1
        Next r
    End With
    ListBox1.ColumnCount = 6
    ListBox1.BoundColumn = 0
End Sub

Re: ต้องการให้ listbox ใน excel vba ไม่สามารถเลือกข้อมูลที่ซ้ำกันได้ครับ

Posted: Fri Jun 11, 2021 6:37 am
by snasui
:D การลบรายการก็มีอยู่แล้วที่โพสต์ #4 ของกระทู้ที่ผมส่ง Link ไป ลองเขียนมาเองดูก่อน ติดตรงไหนค่อยถามกันต่อ

ควรแนบไฟล์พร้อม Code ล่าสุดมาด้วยเสมอจะได้สะดวกในการตอบของเพื่อนสมาชิกครับ