: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

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

ฟอรัมถาม-ตอบปัญหาการใช้งาน 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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
firstboodza555
Member
Member
Posts: 5
Joined: Thu Jun 10, 2021 3:28 pm
Excel Ver: professional plus 2016

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

#1

Post by firstboodza555 »

ผมกำลังใช้ vba ในการทำฟอร์ม เพื่อเพิ่มข้อมูลสถานที่ท่องเที่ยวเพื่อบันทึกไปเป็น .csv ครับ เเล้วผมใช้ listbox เพื่อให้มาเเสดงข้อมูลเเละ ผมจะเลือกข้อมูลจาก listbox ได้ทีละหลายๆ อันพร้อมกัน เเละกดบันทึกลงในตาราง excel ที่ผมกำหนด
ผมจะสอบถามว่า พอจะมีวิธีที่จะทำให้ ข้อมูลที่ผมได้เลือกใน listbox ไปเเล้วหายไป หรือว่า มีการเเจ้งเตือนว่าข้อมูลนี้ได้ถูกเลือกไปเเล้วเเละไม่สามารถเลือกได้เพราะมีข้อมูลนี้อยู่เเล้วเลือกซ้ำไม่ได้
***ขอบคุณล่วงหน้าครับผม***
Attachments
1.png
1.png (134 KiB) Viewed 113 times
โปรเเกรมเพิ่มข้อมูลสถานที่.xlsm
(39.01 KiB) Downloaded 7 times
User avatar
snasui
Site Admin
Site Admin
Posts: 31205
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

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

#2

Post 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 จะถูกลบออกไปด้วยครับ
firstboodza555
Member
Member
Posts: 5
Joined: Thu Jun 10, 2021 3:28 pm
Excel Ver: professional plus 2016

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

#3

Post by firstboodza555 »

:flw: อาจารย์พอจะมีวิธีที่ไม่ให้เลือกข้อมูลได้ซ้ำโดยไม่ต้องให้ข้อมูลใน data place หายมั่งมั้ยครับ เพราะว่าข้อมูลนั่นต้องเอาไว้อ้างอิงในตอนเพิ่มข้อมูล เเล้วเดี๋ยวผมต้องทำปุ่มเพื่อเพิ่มข้อมูล ใน หน้า dataplace ด้วยครับ ขอคำเเนะนำด้วยครับ (ถ้าเเบบว่าพอจะเพิ่มข้อมูลที่มีในตารางเเล้วให้ เตือนว่ามีข้อมูลสถานที่นี้เเล้วเเละเพิ่มไม่ได้ประมาณนี้พอจะเป็นไปได้มั้ยครับ)
User avatar
snasui
Site Admin
Site Admin
Posts: 31205
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

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

#4

Post 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 ว่ามีข้อมูลที่ปลายทางแล้วหรือไม่ ในการทำงานจริงย่อมไม่สะดวกแก่ผู้ใช้ การที่ไม่มีรายการให้เลือกจะสะดวกต่อการทำงานมากกว่าครับ
firstboodza555
Member
Member
Posts: 5
Joined: Thu Jun 10, 2021 3:28 pm
Excel Ver: professional plus 2016

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

#5

Post by firstboodza555 »

อีกวิธีจะยุ่งยากกว่านี้คือแทนที่จะกำหนด DataSource ให้กับ ListBox แต่เป็นการ Loop ข้อมูลจากชีต dataplace เข้าไปใน ListBox แทน และลบออกจาก ListBox ตามรายการที่วางในพื้นที่เป้าหมายแล้ว ในกรณีนี้สามารถจะใช้ข้อมูลที่ชีต dataplace เป็นต้นทางได้โดยตรงเพราะไม่มีการลบออกไปแต่อย่างใด
***
ถ้าเป็นวิธีนี้อาจารย์พอจะมีเเนะนำการเเก้ code ให้ได้มั้ยครับ วิธีนี้น่าจะไม่มีผลในตอนที่ผมต้องการเพิ่มข้อมูลสถานที่ใหม่ลงตารางครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 31205
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

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

#6

Post by snasui »

:D ดูที่นี่เป็นตัวอย่างครับ viewtopic.php?t=11862#p73311
firstboodza555
Member
Member
Posts: 5
Joined: Thu Jun 10, 2021 3:28 pm
Excel Ver: professional plus 2016

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

#7

Post by firstboodza555 »

:D ขอบคุณมากๆครับอาจารย์
firstboodza555
Member
Member
Posts: 5
Joined: Thu Jun 10, 2021 3:28 pm
Excel Ver: professional plus 2016

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

#8

Post 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
User avatar
snasui
Site Admin
Site Admin
Posts: 31205
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

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

#9

Post by snasui »

:D การลบรายการก็มีอยู่แล้วที่โพสต์ #4 ของกระทู้ที่ผมส่ง Link ไป ลองเขียนมาเองดูก่อน ติดตรงไหนค่อยถามกันต่อ

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