: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
🪷 คำแสดงเจตนา
ขอผลแห่งการให้ความรู้นี้ จงกลับไปยังผู้ที่เป็นเจ้าของเดิม แม้ข้าพเจ้าจะไม่รู้จักท่านก็ตาม ขอให้แสงแห่งปัญญาที่ท่านเคยจุดไว้ ได้กลับไปเติมเต็มชีวิตของท่านอีกครั้ง และขอให้เจตนาของข้าพเจ้าเป็นการคืนความดีอย่างสงบ

ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

ฟอรัมถาม-ตอบปัญหาการใช้งาน 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. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
10idlnw
Member
Member
Posts: 88
Joined: Sat Apr 30, 2022 12:17 am
Excel Ver: 2019

ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#1

Post by 10idlnw »

1.ผมมี Range Names หลายตัวมาก เลยจะใช้วิธีวนลูปเอา จะได้สั้นลง ผมตั้งปรับโค้ดอย่างไรครับ
2.กรณีวนลูป Range Names สามารถเลือกเอาเฉพาะกลุ่มที่ต้องการได้ไหมครับ เช่น วนเฉพาะกลุ่มที่ขึ้นต้นด้วยตัว A* หรือเฉพาะกลุ่มที่ขึ้นต้นด้วยตัว B* เป็นต้นครับ

Code: Select all

    If Target.Address = Range("AI_Model").Address Then
            msgbox [AI_Model]
    End If
    
    If Target.Address = Range("AI_CarID").Address Then
            msgbox [AI_CarID]
    End If
    
    If Target.Address = Range("BI_CaseIns").Address Then
            msgbox [BI_CaseIns]
    End If
        
    If Target.Address = Range("BI_FC").Address Then
            msgbox [BI_FC]
    End If
User avatar
snasui
Site Admin
Site Admin
Posts: 31176
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#2

Post by snasui »

:D ตัวอย่างการใช้ If...Eleif...EndIf ครับ

Code: Select all

If Target.Address = Range("AI_Model").Address Then
     MsgBox [AI_Model]
ElseIf Target.Address = Range("AI_CarID").Address Then
     MsgBox [AI_CarID]
ElseIf Target.Address = Range("BI_CaseIns").Address Then
     MsgBox [BI_CaseIns]
ElseIf Target.Address = Range("BI_FC").Address Then
     MsgBox [BI_FC]
End If
ตัวอย่างการใช้ Select Case...End Select ครับ

Code: Select all

Select Case Target.Address
    Case Range("AI_Model").Address
         MsgBox [AI_Model]
    Case Range("AI_CarID").Address
         MsgBox [AI_CarID]
    Case Range("BI_CaseIns").Address
         MsgBox [BI_CaseIns]
    Case Range("BI_FC").Address
         MsgBox [BI_FC]
    Case Else
        'Last case
End Select
ศึกษาเรื่องเหล่านี้เพิ่มเติมได้จากที่นี่ครับ https://snasui.com/wordpress/if-then-else/, https://snasui.com/wordpress/select-case/

ศึกษาเรื่องอื่น ๆ ที่จำเป็นต้องทราบได้ในโพสต์นี้ตั้งแต่ลำดับรายการที่ 208 เป็นต้นไป :arrow: https://snasui.com/viewtopic.php?t=411
10idlnw
Member
Member
Posts: 88
Joined: Sat Apr 30, 2022 12:17 am
Excel Ver: 2019

Re: ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#3

Post by 10idlnw »

ขอบคุณครับ แล้วถ้าเกิดผมมี Range Names เยอะๆหล่ะครับประมาณเกือบ 30ตัวเลย คิดว่า if else มันก็ยังยาวอยู่ดี ความจริงๆสิ่งที่ผมต้องการคือ ให้แต่ละแถวทำงานตรงตามชื่อของมันเองครับ เช่นดังนี้ครับ
Ex.A
If Target.Address = Range("AI_Model").Address Then
[BI_Model] = [AI_Model]
End If
ผมไปเจอตัวอย่างที่ loop หา Range Name ทั้งหมดมา แต่จะยัด Ex.A ใส่ใน Ex.B ยังไงให้เงื่อนไข(Range(AI_Model))และคำสั่ง[BI_Model] = [AI_Model] ตรงกัน โดยให้โค้ดสั้นที่สุดตามตัวอย่างใน Ex.B ครับ

Ex.B

Code: Select all

Sub NameRange()
Dim TargetNameRange As Name
For Each TargetNameRange In ActiveWorkbook.Names
' เอาใส่ตรงนี้ไหมครับ แล้วถ้าใส่แล้ว ต้องปรับสูตรยังไงให้เงื่อนไขและการทำงานมันตรงกันเหมือนตัวอย่างด้านบน(Ex.A)
If Target.Address = Range("AI_Model").Address Then
            [BI_Model] = [AI_Model] ' <---  ตรงนี้ก็อยากให้มัน(เช่น AI_Model) 
            			'วิ่งหากันเองจนเจอกันบรรทัดก่อนหน้า(Range("AI_Model").Address)
            			'ประมาณนี้ครับ
End If
Next TargetNameRange
End Sub
ต้องแก้อย่างไร ถึงจะลงตัวครับ
User avatar
snasui
Site Admin
Site Admin
Posts: 31176
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#4

Post by snasui »

:D กรุณาแนบไฟล์ตัวอย่างมาเสมอจะได้สะดวกในการตอบของเพื่อนสมาชิก ลดเวลาการทำตัวอย่างขึ้นมาเองใหม่ครับ
10idlnw
Member
Member
Posts: 88
Joined: Sat Apr 30, 2022 12:17 am
Excel Ver: 2019

Re: ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#5

Post by 10idlnw »

ตัวอย่างตามนี้ครับ
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 31176
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#6

Post by snasui »

:D ตัวอย่าง Code ลองประยุกต์ใช้ดูครับ

Code: Select all

'Other code
Dim TargetNameRange As Name
For Each TargetNameRange In Names
    If InStr(TargetNameRange.Name, "AI_") Then
        Range(TargetNameRange.RefersTo).Value = _
            Range(Names("BI_" & VBA.Mid(TargetNameRange.Name, 4)).RefersTo).Value
    End If
Next TargetNameRange
'Other code
10idlnw
Member
Member
Posts: 88
Joined: Sat Apr 30, 2022 12:17 am
Excel Ver: 2019

Re: ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#7

Post by 10idlnw »

ขอบคุณครับ ผมทดสอบแล้วทำงานได้ตามปกติเวลารันด้วย sub module ครับ แต่ผมอยากให้มันรันใน worksheets_changed โดยเปลี่ยนแปลงทันทีที่เปลี่ยนข้อความในเซลล์ต้องปรับโค้ดอย่างไรครับ ข้างล่าง ผมลองแทรก Target.Address ดูก็ไม่มีอะไรเกิดขึ้นครับ ต้องทำยังไงครับ

Code: Select all

Dim TargetNameRange As Name
For Each TargetNameRange In Names
    If InStr(TargetNameRange.Name, "BI_") Then
        If Target.Address = Range(Names("AI_" & VBA.Mid(TargetNameRange.Name, 4)).RefersTo).Address Then '<----
            Range(TargetNameRange.RefersTo).Value = _
            			Range(Names("AI_" & VBA.Mid(TargetNameRange.Name, 4)).RefersTo).Value
        End If
    End If
Next TargetNameRange
User avatar
snasui
Site Admin
Site Admin
Posts: 31176
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#8

Post by snasui »

:D กรุณาแนบไฟล์ล่าสุดพร้อม Code ที่ปรับปรุงมาเองแล้วจะได้ดูต่อไปจากนั้นครับ

สำหรับการใช้ Change Event ไม่ทราบว่าต้องการให้ทำงานลักษณะใด Code ข้างต้นเป็นการเปลี่ยนทุกเซลล์ให้เป็นไปตามต้นทาง แต่หากต้องการเปลี่ยนแบบเซลล์ต่อเซลล์ไม่จำเป็นต้อง Loop ด้วย For เพียงแต่ดักจับว่าต้นทางคือ Named range ตัวใด แล้วไปเปลี่ยนยังปลายทางที่สัมพันธ์กับ Named range ตัวนั้นเท่านั้น กรุณาอธิบายส่วนนี้เพิ่มเติมมาด้วยครับ
10idlnw
Member
Member
Posts: 88
Joined: Sat Apr 30, 2022 12:17 am
Excel Ver: 2019

Re: ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#9

Post by 10idlnw »

ไฟล์ตัวอย่างครับ
You do not have the required permissions to view the files attached to this post.
User avatar
snasui
Site Admin
Site Admin
Posts: 31176
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#10

Post by snasui »

snasui wrote: Mon Jul 11, 2022 4:26 pm สำหรับการใช้ Change Event ไม่ทราบว่าต้องการให้ทำงานลักษณะใด Code ข้างต้นเป็นการเปลี่ยนทุกเซลล์ให้เป็นไปตามต้นทาง แต่หากต้องการเปลี่ยนแบบเซลล์ต่อเซลล์ไม่จำเป็นต้อง Loop ด้วย For เพียงแต่ดักจับว่าต้นทางคือ Named range ตัวใด แล้วไปเปลี่ยนยังปลายทางที่สัมพันธ์กับ Named range ตัวนั้นเท่านั้น กรุณาอธิบายส่วนนี้เพิ่มเติมมาด้วยครับ
:D กรุณาขยายความตามที่ผมถามไปในข้อความด้านบนด้วยครับ :roll:
10idlnw
Member
Member
Posts: 88
Joined: Sat Apr 30, 2022 12:17 am
Excel Ver: 2019

Re: ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#11

Post by 10idlnw »

ที่ผมต้องการใช้ Change Event คือ ผมต้องการดักจับ Name Range ที่ต้องการ ไม่ว่าจะพิมพ์เล็ก-ใหญ่ ก็ให้เป็นพิมพ์ใหญ่ทันทีที่พิมพ์ใน Name Range นั้นเสร็จ ซึ่งมีหลายสิบตัวในหนึ่งหน้าที่ขึ้นต้นด้วย AI_ เลยอยากใช้ Loop เพื่อให้โค้ดมันสั้นลง เขียนสั้นๆทีเดียวแล้วให้มัน uCase ให้เองน่ะครับอาจารย์
User avatar
snasui
Site Admin
Site Admin
Posts: 31176
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#12

Post by snasui »

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

Code: Select all

'Other code
Dim nm As String

Application.EnableEvents = False
On Error Resume Next
nm = Target.Name.Name
If nm = "" Then Exit Sub
If InStr(nm, "BI_") Then Exit Sub
Range("BI_" & Mid(nm, 4)).Value = UCase(Target.Value)
On Error GoTo 0
Application.EnableEvents = True
'Other code
10idlnw
Member
Member
Posts: 88
Joined: Sat Apr 30, 2022 12:17 am
Excel Ver: 2019

Re: ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#13

Post by 10idlnw »

💖💖💖 ขอบคุณมากครับอาจารย์ ตรงกับความต้องการ 100% เต็มเป๊ะเลยครับ 💖💖💖
10idlnw
Member
Member
Posts: 88
Joined: Sat Apr 30, 2022 12:17 am
Excel Ver: 2019

Re: ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#14

Post by 10idlnw »

ขอสอบถามอาจารย์เพิ่มอีกนิดครับว่า ถ้าต่าง sheets กัน ต้องปรับแก้เพิ่มเติมตรงไหนครับ (สมมติ BI_ อยู่ sheets2 นอกนั้น(AI_)อยู่ sheets1 ครับอาจารย์)

Code: Select all

'Other code
Dim nm As String

Application.EnableEvents = False
On Error Resume Next
nm = Target.Name.Name
If nm = "" Then Exit Sub
If InStr(nm, "BI_") Then Exit Sub
Range("BI_" & Mid(nm, 4)).Value = UCase(Target.Value)
On Error GoTo 0
Application.EnableEvents = True
'Other code
User avatar
snasui
Site Admin
Site Admin
Posts: 31176
Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 2019
Contact:

Re: ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#15

Post by snasui »

:D กรุณาปรับปรุงมาเองก่อน ดูตัวอย่าง Code ตามโพสต์ด้านล่างนี้ ติดตรงไหนแนบไฟล์พร้อม Code ล่าสุดที่ปรับปรุงแล้วมาถามกันต่อครับ
snasui wrote: Mon Jul 11, 2022 12:09 pm :D ตัวอย่าง Code ลองประยุกต์ใช้ดูครับ

Code: Select all

'Other code
Dim TargetNameRange As Name
For Each TargetNameRange In Names
    If InStr(TargetNameRange.Name, "AI_") Then
        Range(TargetNameRange.RefersTo).Value = _
            Range(Names("BI_" & VBA.Mid(TargetNameRange.Name, 4)).RefersTo).Value
    End If
Next TargetNameRange
'Other code
10idlnw
Member
Member
Posts: 88
Joined: Sat Apr 30, 2022 12:17 am
Excel Ver: 2019

Re: ผมต้องการ loop range name ให้สั้นลง ผมต้องปรับโค้ดยังไงครับ

#16

Post by 10idlnw »

ลองปรับโค้ดนี้แล้ว ปรากฎว่า ใช้ได้แล้วครับ ขอบคุณอาจารย์มากครับ

Code: Select all

Sub test1()
Application.EnableEvents = False
Dim TargetNameRange As Name
For Each TargetNameRange In Names
    If InStr(TargetNameRange.Name, "BI_") Then
        Range(TargetNameRange.RefersTo).Value = _
            UCase(Range(Names("AI_" & VBA.Mid(TargetNameRange.Name, 4)).RefersTo).Value)
        Range(Names("AI_" & VBA.Mid(TargetNameRange.Name, 4)).RefersTo).Value = _
            UCase(Range(TargetNameRange.RefersTo).Value)
    End If
Next TargetNameRange
Application.EnableEvents = True
End Sub
Post Reply