Page 1 of 1

ต้องการ run macro หลังจากกด Enter

Posted: Wed Nov 08, 2023 6:13 pm
by neziices
Book4.xlsx
รบกวนสอบถามค่ะ
1.ต้องการ run macro หลังจากกด Enter โดยไม่สร้างปุ่มสามารถทำได้มั้ยคะ
2.ถ้าต้องการเพิ่มชื่อจาก column C6 เขียนแบบนี้ถูกมั้ยคะ

Code: Select all

Sub test()
    Dim WS As Worksheet
    Set WS = ActiveSheet
    WS.Name = WS.Range("I6").Value & " " & ActiveSheet.Rang("C6").Value
    
End Sub

Re: ต้องการ run macro หลังจากกด Enter

Posted: Wed Nov 08, 2023 8:13 pm
by snasui
:D กรุณาแนบไฟล์มาใหม่เป็นนามสกุล .xlsm โดยต้องมี Code ไว้ในไฟล์นั้นเรียบร้อยแล้วจะได้ตอบต่อไปจากนั้นครับ

Re: ต้องการ run macro หลังจากกด Enter

Posted: Thu Nov 09, 2023 9:40 am
by neziices
ขออภัยค่ะ

Re: ต้องการ run macro หลังจากกด Enter

Posted: Thu Nov 09, 2023 1:46 pm
by snasui
:D ตัวอย่าง Code สั่งให้รันเมื่อคีย์ค่าลงในเซลล์ใด ๆ แล้ว Enter ครับ

Code: Select all

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim WS As Worksheet
    Set WS = ActiveSheet
    WS.Name = WS.Range("I6").Value & " " & WS.Range("C6").Value
End Sub
ควรอธิบายขั้นตอนการทำงานมาอย่างละเอียดว่าการ Enter ที่กล่าวถึงนั้น ต้องทำงานไหน กับชีตใด เซลล์ได อย่างไร ก่อนหรือไม่ ไม่เช่นนั้นจะไม่ได้คำตอบที่เฉพาะเจาะจงครับ

Re: ต้องการ run macro หลังจากกด Enter

Posted: Thu Nov 09, 2023 2:31 pm
by neziices
ิสิ่งที่ต้องการคือเมื่อมีการแก้ไขในเซลล์ I6 หลังจากกด enter ชื่อ Sheet1 เปลี่ยนตามค่ะ

Re: ต้องการ run macro หลังจากกด Enter

Posted: Thu Nov 09, 2023 8:28 pm
by snasui
:D แนบไฟล์ล่าสุดหลังจากปรับปรุง Code มาแล้ว แจ้งมาด้วยว่า I6 ของชีตใด ชื่อชีตจะเปลี่ยนเป็นค่าใด จะได้ดูต่อไปจากนั้นครับ

Re: ต้องการ run macro หลังจากกด Enter

Posted: Fri Nov 10, 2023 9:46 am
by neziices
I6 ของ Sheet1 ค่ะ ชื่อชีตจะเปลี่ยนเป็น PV2312001 Social Security Office


ลองทดสอบโค้ดแล้วมีป้อปอัพขึ้นค่ะ

Re: ต้องการ run macro หลังจากกด Enter

Posted: Fri Nov 10, 2023 10:02 am
by snasui
:D ตัวอย่างการปรับ Code ครับ

Code: Select all

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim WS As Worksheet
    Set WS = ActiveSheet
    If Sh.Name = Sheets(1).Name Then
        If Target.Address(0, 0) = "I6" Then
            WS.Name = VBA.Left(WS.Range("I6").Value & " " & WS.Range("C6").Value, 31)
        End If
    End If
End Sub
Code นี้จะทำงานเมื่อมีการเปลี่ยนค่าใน Sheet1 เซลล์ I6 เท่านั้น

เดิมที่เกิดปัญหาเพราะว่ากำหนดให้ชื่อชีตมีจำนวนมากกว่า 31 อักขระซึ่งมากกว่าข้อกำหนดของชื่อชีต Code ด้านบนได้ตัดให้เหลือเพียง 31 อักขระเรียบร้อยแล้วครับ

Re: ต้องการ run macro หลังจากกด Enter

Posted: Fri Nov 10, 2023 11:49 am
by neziices
อาจารย์คะ แล้วถ้าในกรณีที่ชื่อชีทไม่ใช่ Sheet1 ตัวอย่างเช่นเดิมป็นชื่อ PV2312001 Social Security Office
โค้ด If Sh.Name = Sheets(1).Name Then จะต้องเปลี่ยนเป็น If Sh.Name = " ".Name Then ถูกมั้ยคะ
แล้วแล้วในกรณีที่มีหลายชีทถ้าอยากจะกำหนดให้ในการแก้ไขเซลล์ I6 กับ C6 สามารถเปลี่ยนทุกชีท ไม่ใช่เฉพาะ sheet1 จะเพิ่มโค้ดอย่างไรคะ


Code: Select all

Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range)
    Dim WS As Worksheet
    Set WS = ActiveSheet
    If Sh.Name = " ".Name Then
        If Target.Address(0, 0) = "I6" Then
            WS.Name = VBA.Left(WS.Range("I6").Value & " " & WS.Range("C6").Value, 31)
        End If
    End If
End Sub

Re: ต้องการ run macro หลังจากกด Enter

Posted: Fri Nov 10, 2023 2:11 pm
by snasui
neziices wrote: Fri Nov 10, 2023 11:49 am ถ้าในกรณีที่ชื่อชีทไม่ใช่ Sheet1 ตัวอย่างเช่นเดิมป็นชื่อ PV2312001 Social Security Office
โค้ด If Sh.Name = Sheets(1).Name Then จะต้องเปลี่ยนเป็น If Sh.Name = " ".Name Then ถูกมั้ยคะ
:D กรณีเช่นนี้ไม่จำเป็นต้องมีบรรทัดนี้ สามารถลบทิ้งหรือทำให้เป็น Comment รวมถึงลบหรือทำ End If ที่สัมพันธ์กับ If ตัวนี้ให้เป็น Comment เสียด้วยครับ

Re: ต้องการ run macro หลังจากกด Enter

Posted: Fri Nov 10, 2023 2:50 pm
by neziices
ทำได้แล้วค่ะอาจารย์ ขอบคุณมากค่ะ

เพิ่มเติมอีกนิดค่ะ ถ้าอยากจะให้ข้อความสั้นลงแก้ไขตรงเลข 31 จากโค้ด .Value, 31 ถูกมั้ยคะ
แล้วถ้าเราต้องการเพิ่มสูตรตัดข้อความจาก spacebar ในโค้ด ต้องใช้สูตรไหนคะ
เพราะลองใช้สูตร =trim กับ =left แล้วจะต้องกำหนดจำนวนตัวอักษร
ตัวอย่างเช่น ค่าที่ต้องการคือ PV2312001 Social

Re: ต้องการ run macro หลังจากกด Enter

Posted: Fri Nov 10, 2023 3:27 pm
by snasui
:D ตัวอย่าง Code เฉพาะที่ต้องปรับครับ

WS.Name = WS.Range("I6").Value & " " & VBA.Left(WS.Range("C6").Value, InStr(WS.Range("C6").Value, " "))

ในโอกาสถัดไปจำเป็นจะต้องปรับ Code ตามความต้องการมาเองก่อน ติดปัญหาแล้วค่อยถามกัน ปรับได้เท่าไรก็เท่านั้น ถือว่าได้ปรับมาเองก่อนแล้วตามกฎการใช้บอร์ดข้อ 5 ด้านบน :roll: ครับ

Re: ต้องการ run macro หลังจากกด Enter

Posted: Fri Nov 10, 2023 4:42 pm
by neziices
snasui wrote: Fri Nov 10, 2023 3:27 pm WS.Name = WS.Range("I6").Value & " " & VBA.Left(WS.Range("C6").Value, InStr(WS.Range("C6").Value, " "))
รบกวนอาจารย์ช่วยอธิบายโค้ดนี้หน่อยได้มั้ยคะ

Re: ต้องการ run macro หลังจากกด Enter

Posted: Fri Nov 10, 2023 7:57 pm
by snasui
neziices wrote: Fri Nov 10, 2023 4:42 pm InStr(WS.Range("C6").Value, " ")
:D แปลว่าให้หาว่าค่าวรรคอยู่ในลำดับที่เท่าไรของ WS.Range("C6").Value สมมุติว่าผลลัพธ์คือ 20 เมื่อแทนค่านี้ลงใน Code ที่ครอบอยู่ด้านนอกเป็น

VBA.Left(WS.Range("C6").Value, 20) แปลว่าให้ตัดอักขระด้านซ้ายของ WS.Range("C6").Value มา 20 อักขระครับ

Re: ต้องการ run macro หลังจากกด Enter

Posted: Mon Nov 13, 2023 10:17 am
by neziices
ขอบคุณมากค่ะอาจารย์

สอบถามเพิ่มเติมค่ะถ้าจะต้องการหาค่าเว้นวรรคสองค่า
เพื่อให้ได้ค่าที่ต้องการ ตัวอย่างเช่น PV2312003 Social Security
ตรงโค้ดเราจะเพิ่มเงื่อนไข

Code: Select all

WS.Name = WS.Range("I6").Value & " " & VBA.Left(WS.Range("C6").Value, InStr(WS.Range("C6").Value, " "&" "))
ได้มั้ยคะ หรือจะต้องกำหนดจำนวนอักขระเท่านั้นคะ

Re: ต้องการ run macro หลังจากกด Enter

Posted: Mon Nov 13, 2023 12:28 pm
by puriwutpokin
ลองปรับส่วนนี้ดูครับ

Code: Select all

WS.Name = WS.Range("I6").Value & " " & Application.Trim(Left(Application.Substitute(WS.Range("C6").Value, " ", Application.Rept(" ", 99)), 150))

Re: ต้องการ run macro หลังจากกด Enter

Posted: Mon Nov 13, 2023 1:26 pm
by neziices
puriwutpokin wrote: Mon Nov 13, 2023 12:28 pm ลองปรับส่วนนี้ดูครับ

Code: Select all

WS.Name = WS.Range("I6").Value & " " & Application.Trim(Left(Application.Substitute(WS.Range("C6").Value, " ", Application.Rept(" ", 99)), 150))
ขอบคุณมากค่ะคุณ puriwutpokin
ช่วยอธิบายโค้ดนี้หน่อยได้มั้ยคะ

Re: ต้องการ run macro หลังจากกด Enter

Posted: Mon Nov 13, 2023 2:12 pm
by puriwutpokin
neziices wrote: Mon Nov 13, 2023 1:26 pm
puriwutpokin wrote: Mon Nov 13, 2023 12:28 pm ลองปรับส่วนนี้ดูครับ

Code: Select all

WS.Name = WS.Range("I6").Value & " " & Application.Trim(Left(Application.Substitute(WS.Range("C6").Value, " ", Application.Rept(" ", 99)), 150))
ขอบคุณมากค่ะคุณ puriwutpokin
ช่วยอธิบายโค้ดนี้หน่อยได้มั้ยคะ
Application.Substitute(WS.Range("C6").Value, " ", Application.Rept(" ", 99)) ตรงนี้ เป็นการเพิ่มช่องว่างเข้าไป99 ช่องว่างครับ
จะได้ค่าเป็น

Code: Select all

The                                                                                                   Revenue                                                                                                   Department
แล้วมา Left ที่ตำแหน่ง มากกว่า 99 หรือ 99*2 ก็ได้ครับ
แล้วได้ค่าแล้วมา Trim เอาค่าว่างออกครับจะได้ The Revenue
ประมาณนี้ครับ

Re: ต้องการ run macro หลังจากกด Enter

Posted: Mon Nov 13, 2023 3:51 pm
by neziices
ขอบคุณอาจารย์ Santipong และคุณ puriwutpokin มากๆค่ะ สูตรที่ให้มาใช้ได้ตามความต้องการค่ะ