Page 1 of 1

อยากให้เด้งข้อความที่ถูกต้อง ต่อให้เราพิมพ์ยังไม่หมดครับ

Posted: Tue Nov 29, 2022 3:58 pm
by lydiaintro
ขอสอบถามหน่อยครับ
หากเราต้องที่จะให้ข้อความมันเด้งอัตโนมัติ ต่อให้เราพิมไม่ครบ โดยที่ไม่สนใจว่าเราจะพิมพ์ข้างหน้าหรือส่วนไหนก่อนก็ได้


ตัวอย่าง

B1 พิมพ์ "a01a01" ให้มีข้อความแบบ B2 มาให้เลือกครับ โดยอ้างอิงจากคอลัมน์ C:C

Image

Re: อยากให้เด้งข้อความที่ถูกต้อง ต่อให้เราพิมพ์ยังไม่หมดครับ

Posted: Tue Nov 29, 2022 8:04 pm
by snasui
:D การทำเช่นนั้นต้องอาศัย VBA จึงจะสะดวก ลองเขียนมาเองก่อน ติดตรงไหนค่อยถามกันต่อครับ

Re: อยากให้เด้งข้อความที่ถูกต้อง ต่อให้เราพิมพ์ยังไม่หมดครับ

Posted: Wed Nov 30, 2022 1:09 pm
by lydiaintro
snasui wrote: Tue Nov 29, 2022 8:04 pm :D การทำเช่นนั้นต้องอาศัย VBA จึงจะสะดวก ลองเขียนมาเองก่อน ติดตรงไหนค่อยถามกันต่อครับ

รับทราบครับ ว่าแต่ผมอยากทราบว่าทำสั่งมันเรียกว่าอะไรครับผมจะได้ศึกษาถูก

Re: อยากให้เด้งข้อความที่ถูกต้อง ต่อให้เราพิมพ์ยังไม่หมดครับ

Posted: Wed Nov 30, 2022 1:32 pm
by snasui
:D ลองศึกษาดูครับ

https://www.youtube.com/results?search_ ... +down+list

Re: อยากให้เด้งข้อความที่ถูกต้อง ต่อให้เราพิมพ์ยังไม่หมดครับ

Posted: Sat Dec 03, 2022 12:05 pm
by lydiaintro
snasui wrote: Wed Nov 30, 2022 1:32 pm :D ลองศึกษาดูครับ

https://www.youtube.com/results?search_ ... +down+list

สวัสดีครับอาจารย์ ผมลองแต่ยังติดตรงที่มันsearchให้แค่ในช่องComboBoxที่เราสร้องขึ้นครับ
ผมอยากให้ Row B4 เป็นแบบในช่องComboBoxด้วยครับ


ตัวอย่าง

Code: Select all

Private Comb_Arrow As Boolean
Private Sub ComboBox1_Change()
Dim i As Long
        If Not Comb_Arrow Then
        With Me.ComboBox1
            .List = Worksheets("Name List").Range("A2", Worksheets("Name List").Cells(Rows.Count, "A").End(xlUp)).Value
            .ListRows = Application.WorksheetFunction.Min(4, .ListCount)
            .DropDown
               If Len(.Text) Then
                    For i = .ListCount - 1 To 0 Step -1
                       If InStr(1, .List(i), .Text, vbTextCompare) = 0 Then .RemoveItem i
                         Next
                          .DropDown
                           End If
         End With
         End If
 End Sub
 Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Comb_Arrow = (KeyCode = vbKeyUp) Or (KeyCode = vbKeyDown)
    If KeyCode = vbKeyReturn Then Me.ComboBox1.List = Worksheets("Name List").Range _
    ("A2", Worksheets("Name List").Cells(Rows.Count, "A").End(xlUp)).Value
End Sub

Re: อยากให้เด้งข้อความที่ถูกต้อง ต่อให้เราพิมพ์ยังไม่หมดครับ

Posted: Sat Dec 03, 2022 2:29 pm
by snasui
:D ในเซลล์ไม่มีความสามารถที่จะทำเช่นนั้นได้ ปกติก็จะใช้ VBA ควบคุม ComboBox เข้ามาช่วย

ตัวอย่างการปรับ Code ตามด้านล่างครับ

ใน Sheet5 นำ Code นี้ไปใช้

Code: Select all

Private Sub Worksheet_Selectionchange(ByVal Target As Range)
    Dim c As Integer
    If Target.Count > 1 Then Exit Sub
    If Target.Address(0, 0) = "B4" Then
        Call ListDropdown(Target)
    Else
        Me.OLEObjects("ComboBox1").Visible = False
    End If
End Sub
จากนั้นเข้าเมนู Insert > Module เพื่อสร้าง Module จะได้ชื่อเป็น Module1 ให้นำ Code ด้านล่างไปใช้

Code: Select all

Public Sub ListDropdown(ByVal Target)
    Dim xStr As String
    Dim xCombox As OLEObject
    Application.EnableEvents = False
    Set xCombox = Worksheets("Sheet5").OLEObjects("ComboBox1")
    With xCombox
        .ListFillRange = ""
        .LinkedCell = ""
        .Visible = False
        .Top = Target.Top
    End With
    
    With Worksheets("Name List")
        xStr = .Name & "!" & .Range("A2", .Range("A" & .Rows.Count).End(xlUp)) _
                    .Address(0, 0)
    End With
    
    With xCombox
        .Visible = True
        .Left = Target.Left
        .Top = Target.Top - 5
        .Width = Target.Width ' + 5
        .Height = Target.Height + 5
        .ListFillRange = xStr
        .LinkedCell = Target.Address
        .Activate
    End With
    Application.EnableEvents = True
End Sub

Re: อยากให้เด้งข้อความที่ถูกต้อง ต่อให้เราพิมพ์ยังไม่หมดครับ

Posted: Sat Dec 03, 2022 6:08 pm
by lydiaintro
เหมือนจะยังไม่ตอบโจท์ครับอาจารย์ พอดีผมได้ลองอีกวิธีครับ โดยการใช้ Form เข้ามาช่วย

แต่ผมติดตรงที่เวลาผมกดปุ่ม ยืนยัน ผมอยากให้ข้อมูลที่เคยกรอกใช้ช่อง ComboBox และ TextBox เคลียออกไปด้วยครับ
แล้วให้เคอร์เซอร์ที่กระพริบไปอยู่ที่ ComboBox แรกครับ


Code: Select all

Private Comb_Arrow As Boolean
Private Sub ComboBox1_Change()
Dim i As Long
        If Not Comb_Arrow Then
        With Me.ComboBox1
            .List = Worksheets("Name List").Range("A2", Worksheets("Name List").Cells(Rows.Count, "A").End(xlUp)).Value
            .ListRows = Application.WorksheetFunction.Min(4, .ListCount)
            .DropDown
               If Len(.Text) Then
                    For i = .ListCount - 1 To 0 Step -1
                       If InStr(1, .List(i), .Text, vbTextCompare) = 0 Then .RemoveItem i
                         Next
                          .DropDown
                           End If
         End With
         End If
 End Sub
 Private Sub ComboBox1_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    Comb_Arrow = (KeyCode = vbKeyUp) Or (KeyCode = vbKeyDown)
    If KeyCode = vbKeyReturn Then Me.ComboBox1.List = Worksheets("Name List").Range _
    ("A2", Worksheets("Name List").Cells(Rows.Count, "A").End(xlUp)).Value
End Sub
Private Sub CommandButton1_Click()
emptyRow = WorksheetFunction.CountA(Range("B:B")) + 1
Cells(emptyRow, 1).Value = ComboBox1.Value
Cells(emptyRow, 2).Value = TextBox2.Value
End Sub
Private Sub CommandButton2_Click()
Unload Me
End Sub
Private Sub userform_initialize()
ComboBox1.Value = ""
TextBox2.Value = ""
End Sub

Re: อยากให้เด้งข้อความที่ถูกต้อง ต่อให้เราพิมพ์ยังไม่หมดครับ

Posted: Sat Dec 03, 2022 6:23 pm
by snasui
:D ตัวอย่างการปรับ Code บาง Procedure ตามด้านล่างครับ

Code: Select all

Private Sub userform_initialize()
    ComboBox1.Value = ""
    TextBox2.Value = ""
    ComboBox1.SetFocus
End Sub

Private Sub CommandButton1_Click()
    emptyRow = WorksheetFunction.CountA(Range("B:B")) + 1
    Cells(emptyRow, 1).Value = ComboBox1.Value
    Cells(emptyRow, 2).Value = TextBox2.Value
    ComboBox1.Value = ""
    TextBox2.Value = ""
    ComboBox1.SetFocus
End Sub

Private Sub ComboBox1_Change()
    Dim i As Long
    If Not Comb_Arrow Then
        With Me.ComboBox1
            .List = Worksheets("Name List").Range("A2", Worksheets("Name List").Cells(Rows.Count, "A").End(xlUp)).Value
            .ListRows = Application.WorksheetFunction.Min(4, .ListCount)
            If Len(.Text) Then
                .DropDown
            End If
            If Len(.Text) Then
                For i = .ListCount - 1 To 0 Step -1
                   If InStr(1, .List(i), .Text, vbTextCompare) = 0 Then .RemoveItem i
                Next
                .DropDown
            End If
         End With
    End If
 End Sub

Re: อยากให้เด้งข้อความที่ถูกต้อง ต่อให้เราพิมพ์ยังไม่หมดครับ

Posted: Sat Dec 03, 2022 6:39 pm
by lydiaintro
ได้ผลตามที่ต้องการเลยครับ

แต่ไม่ค่อยทราบวิธีการสักเท่าไหร่ว่าใช้คำสั่งอะไรนอกจาก SetFocus พอดีผมพึ่งเริ่มหัดเขียด VBA ด้วยครับ แฮ่ะ ๆ

Re: อยากให้เด้งข้อความที่ถูกต้อง ต่อให้เราพิมพ์ยังไม่หมดครับ

Posted: Mon Aug 14, 2023 3:14 pm
by SuminO
สวัสดีครับ
อยากให้ List ลากลงมาทุกเซล์ ยังไงครับ

Re: อยากให้เด้งข้อความที่ถูกต้อง ต่อให้เราพิมพ์ยังไม่หมดครับ

Posted: Mon Aug 14, 2023 3:45 pm
by snasui
:D ตัวอย่างการปรับ Code ครับ

ที่ Procedure Worksheet_Selectionchange

เปลี่ยน If Target.Address(0, 0) = "B4" Then เป็น If Target.Column = 2 Then

Re: อยากให้เด้งข้อความที่ถูกต้อง ต่อให้เราพิมพ์ยังไม่หมดครับ

Posted: Mon Aug 14, 2023 4:14 pm
by SuminO
การทำงานค้นหาในลักษณะนี้
มีวิธีอื่นที่ง่ายกว่านี้ไหมครับ อาจารย์

Re: อยากให้เด้งข้อความที่ถูกต้อง ต่อให้เราพิมพ์ยังไม่หมดครับ

Posted: Mon Aug 14, 2023 5:16 pm
by snasui
:D หัวข้อนี้คือให้แสดงรายการขณะที่พิมพ์ยังไม่ครบ

ปัจจุบันไม่มีวิธีอื่นที่สามารถทำเช่นนี้ได้ ต้องใช้ VBA เข้ามาช่วย และเมื่อต้องใช้ VBA คิดว่าไม่มีวิธีที่ง่ายครับ