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

กรุณาแนบไฟล์มาใหม่เป็นนามสกุล .xls
m โดยต้องมี 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

ตัวอย่าง 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

แนบไฟล์ล่าสุดหลังจากปรับปรุง 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

ตัวอย่างการปรับ 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 ถูกมั้ยคะ

กรณีเช่นนี้
ไม่จำเป็นต้องมีบรรทัดนี้ สามารถลบทิ้งหรือทำให้เป็น 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

ตัวอย่าง Code เฉพาะที่ต้องปรับครับ
WS.Name = WS.Range("I6").Value & " " & VBA.Left(WS.Range("C6").Value, InStr(WS.Range("C6").Value, " "))
ในโอกาสถัดไปจำเป็นจะต้องปรับ Code ตามความต้องการมาเองก่อน ติดปัญหาแล้วค่อยถามกัน ปรับได้เท่าไรก็เท่านั้น ถือว่าได้ปรับมาเองก่อนแล้วตามกฎการใช้บอร์ดข้อ 5 ด้านบน

ครับ
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, " ")

แปลว่าให้หาว่าค่าวรรคอยู่ในลำดับที่เท่าไรของ
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 ช่องว่างครับ
จะได้ค่าเป็น
แล้วมา Left ที่ตำแหน่ง มากกว่า 99 หรือ 99*2 ก็ได้ครับ
แล้วได้ค่าแล้วมา Trim เอาค่าว่างออกครับจะได้ The Revenue
ประมาณนี้ครับ
Re: ต้องการ run macro หลังจากกด Enter
Posted: Mon Nov 13, 2023 3:51 pm
by neziices
ขอบคุณอาจารย์ Santipong และคุณ puriwutpokin มากๆค่ะ สูตรที่ให้มาใช้ได้ตามความต้องการค่ะ