: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 VBA Drop down list (indirect(Substitute))

ฟอรัมถาม-ตอบปัญหาการใช้งาน MS Excel and 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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
jaturon
Member
Member
Posts: 12
Joined: Tue May 30, 2017 10:43 am

สอบถามเกี่ยวกับ Code VBA Drop down list (indirect(Substitute))

#1

Post by jaturon »

พอดีผมทำ Drop Down list ขึ้นมา 2 ชั้นครับ =indirect(A1) โดยสูตรนี้ใช้กับ Drop Down list ครับ แต่รายการเลือกของ Drop Down list มันเล็กเกินไปไม่สามารถปรับขนาดตัวอักษรได้ ผมเลยเอา Combo Box เข้ามาช่วยครับ โดยใช้ Code VBA ให้ Combobox ทับ Drop Down list ทุกอันและใช้ข้อมูลจาก Drop Down list ครับ (ซึ่ง Code VBA นี้ผมก็ไปเอามาจากเว็ปเว็ปหนึ่งครับ ลองไปมั่วๆก็ใช้ได้เลยลองใช้ดู)

Code: Select all

Private Sub Worksheet_BeforeDoubleClick _
  (ByVal Target As Range, _
    Cancel As Boolean)
Dim str As String
Dim cboTemp As OLEObject
Dim WS As Worksheet
Set WS = ActiveSheet

Set cboTemp = WS.OLEObjects("TempCombo")
  On Error Resume Next
  With cboTemp
  'clear and hide the combo box
    .ListFillRange = ""
    .LinkedCell = ""
    .Visible = False
  End With
On Error GoTo errHandler
  If Target.Validation.Type = 3 Then
    'if the cell contains
      'a data validation list
    Cancel = True
    Application.EnableEvents = False
    str = Target.Validation.Formula1
    str = Right(str, Len(str) - 1)
    
     'for simple INDIRECT function (English)
    ' e.g. =INDIRECT
    'will create dependent list of items
    If Left(str, 8) = "INDIRECT)" Then
      lSplit = InStr(1, str, "(")
      str = Right(str, Len(str) - lSplit)
      str = Left(str, Len(str) - 1)
      str = Range(str).Value
      
    End If
    With cboTemp
      'show the combobox with the list
      .Visible = True
      .Left = Target.Left
      .Top = Target.Top
      .Width = Target.Width + 5
      .Height = Target.Height + 5
      .ListFillRange = str
      .LinkedCell = Target.Address
    End With
    cboTemp.Activate
    'open the drop down list automatically
    Me.tempcombo.DropDown
  End If
  
errHandler:
  Application.EnableEvents = True
  Exit Sub

End Sub
'=========================================
Private Sub TempCombo_LostFocus()
  With Me.tempcombo
    .Top = 10
    .Left = 10
    .Width = 0
    .ListFillRange = ""
    .LinkedCell = ""
    .Visible = False
    .Value = ""
  End With
End Sub
'====================================

ปัญหา คือ
แต่เมื่อผมอยากให้ Drop Down list สามารถเว้นวรรคได้ เลยใช้ Substitute เข้ามาช่วย เมื่อมีการเว้นวรรคอยู่ด้วย =indirect(substitute(A1," ","_")) แต่ Code VBA ต้องมีการเปลี่ยนแปลงในเรื่องของ INDIRECT ที่ใช้ ผมลองเขียน VBA แบบเท่าที่เขียนได้ก็ไม่สามารถใช้ได้เลยครับ เลยต้องถามผู้รู้ให้ผู้รู้ช่วยทีครับ
You do not have the required permissions to view the files attached to this post.
Last edited by jaturon on Sat Jun 24, 2017 6:17 pm, edited 3 times in total.
User avatar
snasui
Site Admin
Site Admin
Posts: 30760
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: สอบถามเกี่ยวกับ Code VBA Drop down list (indirect(Substitute))

#2

Post by snasui »

:D กรุณาโพสต์ Code ให้แสดงเป็น Code ตามกฎการใช้บอร์ดข้อ 5 ด้านบนครับ :roll:
jaturon
Member
Member
Posts: 12
Joined: Tue May 30, 2017 10:43 am

Re: สอบถามเกี่ยวกับ Code VBA Drop down list (indirect(Substitute))

#3

Post by jaturon »

snasui wrote::D กรุณาโพสต์ Code ให้แสดงเป็น Code ตามกฎการใช้บอร์ดข้อ 5 ด้านบนครับ :roll:
ขอบคุณมากๆนะครับ ที่ให้คำแนะนำ
User avatar
snasui
Site Admin
Site Admin
Posts: 30760
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: สอบถามเกี่ยวกับ Code VBA Drop down list (indirect(Substitute))

#4

Post by snasui »

:D ตัวอย่าง Code ครับ

Code: Select all

'...other code
 Cancel = True
    Application.EnableEvents = False
      
    If InStr(Target.Offset(0, -1).Value, " ") Then
        str = Replace(Target.Offset(0, -1).Value, " ", "_")
    Else
        str = Target.Offset(0, -1).Value
    End If
    
    With cboTemp
      'show the combobox with the list
      .Visible = True
      .Left = Target.Left
      .Top = Target.Top
      .Width = Target.Width + 5
      .Height = Target.Height + 5
      .ListFillRange = str
      .LinkedCell = Target.Address
    End With
    cboTemp.Activate
    'open the drop down list automatically
    Me.tempcombo.DropDown
  End If
'...other code
jaturon
Member
Member
Posts: 12
Joined: Tue May 30, 2017 10:43 am

Re: สอบถามเกี่ยวกับ Code VBA Drop down list (indirect(Substitute))

#5

Post by jaturon »

snasui wrote::D ตัวอย่าง Code ครับ

Code: Select all

'...other code
 Cancel = True
    Application.EnableEvents = False
      
    If InStr(Target.Offset(0, -1).Value, " ") Then
        str = Replace(Target.Offset(0, -1).Value, " ", "_")
    Else
        str = Target.Offset(0, -1).Value
    End If
    
    With cboTemp
      'show the combobox with the list
      .Visible = True
      .Left = Target.Left
      .Top = Target.Top
      .Width = Target.Width + 5
      .Height = Target.Height + 5
      .ListFillRange = str
      .LinkedCell = Target.Address
    End With
    cboTemp.Activate
    'open the drop down list automatically
    Me.tempcombo.DropDown
  End If
'...other code

ผมสามารถใช้ได้แล้วครับ ขอบคุณมากๆเลยนะครับ ขอบคุณจริงๆ ผมดีใจสุดๆไปเลยครับ น้ำตาแทบไหล หาวิธีมาตั้งนานครับ ขอบคุณอีกครั้งนะครับ
jaturon
Member
Member
Posts: 12
Joined: Tue May 30, 2017 10:43 am

Re: สอบถามเกี่ยวกับ Code VBA Drop down list (indirect(Substitute))

#6

Post by jaturon »

snasui wrote::D ตัวอย่าง Code ครับ

Code: Select all

'...other code
 Cancel = True
    Application.EnableEvents = False
      
    If InStr(Target.Offset(0, -1).Value, " ") Then
        str = Replace(Target.Offset(0, -1).Value, " ", "_")
    Else
        str = Target.Offset(0, -1).Value
    End If
    
    With cboTemp
      'show the combobox with the list
      .Visible = True
      .Left = Target.Left
      .Top = Target.Top
      .Width = Target.Width + 5
      .Height = Target.Height + 5
      .ListFillRange = str
      .LinkedCell = Target.Address
    End With
    cboTemp.Activate
    'open the drop down list automatically
    Me.tempcombo.DropDown
  End If
'...other code
ขอโทษนะครับ Code นี้ผมลองใช้แล้วครับ แต่มันสามารถใช้ได้แค่เฉพาะช่อง B11 ช่องเดียวเองครับ ผมลอง Copy ไปวางช่องอื่นก็ไม่สามารถใช้ได้เลยครับ ขอวิธีแนะนำหน่อยครับว่าผมต้องทำยังไง TT
User avatar
snasui
Site Admin
Site Admin
Posts: 30760
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: สอบถามเกี่ยวกับ Code VBA Drop down list (indirect(Substitute))

#7

Post by snasui »

:lol: Code นั้นสามารถใช้ได้กับทุกเซลล์ที่มีสภาพเหมือนกับตัวอย่างที่ทำมา

กรณีนำไปใช้กับเซลล์อื่นให้แนบไฟล์พร้อม Code ที่ปรับปรุงแล้วมาใหม่ ชี้ให้เห็นว่าต้องการใช้กับเซลล์ใด การใช้สีตัวอักษร ให้เน้นสีเท่าที่จำเป็น อย่าใช้สีเดียวกันหมดทุกข้อความจะสะดวกในการอ่านมากกว่าครับ
jaturon
Member
Member
Posts: 12
Joined: Tue May 30, 2017 10:43 am

Re: สอบถามเกี่ยวกับ Code VBA Drop down list (indirect(Substitute))

#8

Post by jaturon »

snasui wrote::lol: Code นั้นสามารถใช้ได้กับทุกเซลล์ที่มีสภาพเหมือนกับตัวอย่างที่ทำมา

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

Code: Select all

  Private Sub Worksheet_BeforeDoubleClick _
  (ByVal Target As Range, _
    Cancel As Boolean)
Dim str As String
Dim cboTemp As OLEObject
Dim WS As Worksheet
Set WS = ActiveSheet

Set cboTemp = WS.OLEObjects("TempCombo")
  On Error Resume Next
  With cboTemp
  'clear and hide the combo box
    .ListFillRange = ""
    .LinkedCell = ""
    .Visible = False
  End With
On Error GoTo errHandler
  If Target.Validation.Type = 3 Then
    'if the cell contains
      'a data validation list
    '...other code
 Cancel = True
    Application.EnableEvents = False
      
    If InStr(Target.Offset(0, -1).Value, " ") Then
        str = Replace(Target.Offset(0, -1).Value, " ", "_")
    Else
        str = Target.Offset(0, -1).Value
    End If
    
    With cboTemp
      'show the combobox with the list
      .Visible = True
      .Left = Target.Left
      .Top = Target.Top
      .Width = Target.Width + 5
      .Height = Target.Height + 5
      .ListFillRange = str
      .LinkedCell = Target.Address
    End With
    cboTemp.Activate
    'open the drop down list automatically
    Me.tempcombo.DropDown
  End If
'...other code

  
errHandler:
  Application.EnableEvents = True
  Exit Sub

End Sub
'=========================================
Private Sub TempCombo_LostFocus()
  With Me.tempcombo
    .Top = 10
    .Left = 10
    .Width = 0
    .ListFillRange = ""
    .LinkedCell = ""
    .Visible = False
    .Value = ""
  End With
End Sub
'====================================
You do not have the required permissions to view the files attached to this post.
jaturon
Member
Member
Posts: 12
Joined: Tue May 30, 2017 10:43 am

Re: สอบถามเกี่ยวกับ Code VBA Drop down list (indirect(Substitute))

#9

Post by jaturon »

snasui wrote::lol: Code นั้นสามารถใช้ได้กับทุกเซลล์ที่มีสภาพเหมือนกับตัวอย่างที่ทำมา

กรณีนำไปใช้กับเซลล์อื่นให้แนบไฟล์พร้อม Code ที่ปรับปรุงแล้วมาใหม่ ชี้ให้เห็นว่าต้องการใช้กับเซลล์ใด การใช้สีตัวอักษร ให้เน้นสีเท่าที่จำเป็น อย่าใช้สีเดียวกันหมดทุกข้อความจะสะดวกในการอ่านมากกว่าครับ
ขอโทษนะครับ ตอนนี้ผมรู้เหตุผลแล้วว่าทำไมถึงใช้ Combo Box ที่ซ้อนทับ Drop Down list ไม่ได้ เนื่องจากผมต้องมีหัวข้อที่จะเลือกอยู่ด้านซ้ายมือก่อนหน้า Cell ที่ต้องการจะทำการ Drop down list ถ้าผมไม่ต้องการ Show ให้เห็นก็แค่ hide Column นั้น แต่ถ้าอยากให้สมบูรณ์จริงๆเลย โดยที่ผมไม่ต้องใส่หัวข้อที่จะเลือกเลยผมจะต้องเพิ่ม Code ยังไงครับ ขอบคุณมากๆนะครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 30760
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: สอบถามเกี่ยวกับ Code VBA Drop down list (indirect(Substitute))

#10

Post by snasui »

:D Code นี้จะต้องมีเซลล์หลักในการใช้ตัดสินใจเพื่อที่จะแสดง Drop down หากว่าใช้งานได้ก็ไม่จำเป็นต้องหาวิธีอื่น

การปรับ Code ในทุกความต้องการจำเป็นต้องเขียนมาเองก่อนเสมอ ติดปัญหาแล้วค่อยมาถามกันครับ
jaturon
Member
Member
Posts: 12
Joined: Tue May 30, 2017 10:43 am

Re: สอบถามเกี่ยวกับ Code VBA Drop down list (indirect(Substitute))

#11

Post by jaturon »

snasui wrote::D Code นี้จะต้องมีเซลล์หลักในการใช้ตัดสินใจเพื่อที่จะแสดง Drop down หากว่าใช้งานได้ก็ไม่จำเป็นต้องหาวิธีอื่น

การปรับ Code ในทุกความต้องการจำเป็นต้องเขียนมาเองก่อนเสมอ ติดปัญหาแล้วค่อยมาถามกันครับ
ขอบคุณมากๆนะครับ สำหรับการช่วยเหลือในการพัฒนา Code VBA แค่นี้ก็ถือว่าช่วยผมได้เยอะมากๆ เลยครับ แต่ผมเขียน Code ไม่เป็นเลยครับ ก็แค่ปรับ Code เท่าที่มีให้ใช้งานได้ครับ แต่ถ้าเป็นไปได้ก็อยากให้สามารถใช้ได้แบบสมบูรณ์เลยครับ เพราะผมต้องใช้ Drop Down List ทั้ง Sheet เลยครับ ขอบคุณอีกครั้งนะครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 30760
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:

Re: สอบถามเกี่ยวกับ Code VBA Drop down list (indirect(Substitute))

#12

Post by snasui »

:D การช่วยปรับ Code จะเป็นไปได้ก็ต่อเมื่อมีการปรับมาเองก่อนเท่านั้น เป็นกฎข้อ 5 ของฟอรั่มที่ผมเขียนขึ้นมาเอง จะละเมิดเสียเองไม่ได้ครับ :flw:
Post Reply