snasui.com ยินดีต้อนรับ
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ ระบุ Version ของ Excel
ฟอรัมถาม-ตอบปัญหาการใช้งาน MS Excel and VBA
Forum rules
ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code]
และปิดด้วย [/code]
ตัวอย่างเช่น [code]dim r as range[/code]
เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่
sc201105
Member
Posts: 26 Joined: Fri May 13, 2011 7:28 am
#1
Post
by sc201105 » Fri May 27, 2011 7:28 am
เรียนอาจารย์ ที่เคราพ
ผมต้องรบกวนอย่างช่วยผมเกี่ยวกับการหาค่า location code และ location area จาก b_code ตามเอกสารแนบ ผมไม่รู้ว่าจะทำอย่างไร ผมได้อธิบายไว้ใน File แล้ว ประกอบด้วย File ข้อมูลจาก อยู่ที่ sheet source และข้อมูลอ้างอิง location code และ location area จะอยู่ที่ sheet location data ผมไม่รู้ว่าเขียนอย่างไรให้มันเช็ค digit ข้อมูลลดหลั่นตัวเลขของเพื่อให้ได้ข้อมูลตามที่บอกไว้ใน file
รบกวนด้วยครับ ไม่รู้จะทำอย่างไรจริงๆครับที่ให้มันทำงานและได้ผลลัพธ์อย่างที่ต้องการ
ขอบคุณมากๆ ครับผม
You do not have the required permissions to view the files attached to this post.
snasui
Site Admin
Posts: 30919 Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:
#2
Post
by snasui » Fri May 27, 2011 10:33 am
ดูตามไฟล์แนบครับ
ผมเพิ่มคอลัมน์ G:I มาเพื่อกระจายสูตรออกมาให้ทำความเข้าใจง่ายขึ้น สูตรใน G:H สามารถเขียนในเซลล์เดียวกันเพื่อหา Location_Code ได้
โดยมีขั้นตอนดังนี้
1. ที่เซลล์ G2 คีย์สูตรเพื่อหาค่าที่ต้องการตัดมามีกี่จำนวน
=7-MOD(ROWS(G$2:G2)-1,6)
Enter > Copy ลงด้านล่าง
2. ที่เซลล์ H2 คีย์สูตรเพื่อตัดค่าในคอลัมน์ B เริ่มจากตำแหน่งที่ 3 ของอักขระ มาเท่าจำนวนที่ได้ตามข้อ 1. ด้านบน
=MID(B2,3,G2)+0
Enter > Copy ลงด้านล่าง สังเกตการบวกด้วย 0 ก็เพื่อต้องการทำให้เป็นตัวเลข เนื่องจากค่าจากการตัดข้อความจะเป็นตัวอักษรเสมอ
3. ที่เซลล์ I2 คีย์สูตรเพื่อหาค่า Location_Area
=VLOOKUP(H2,'Location Data'!$A$2:$B$19,2,0)
Enter > Copy ลงด้านล่าง หากไม่พบจะแสดงผลลัพธ์เป็น #N/A
You do not have the required permissions to view the files attached to this post.
sc201105
Member
Posts: 26 Joined: Fri May 13, 2011 7:28 am
#3
Post
by sc201105 » Fri May 27, 2011 12:01 pm
เรียนท่านอาจารย์
ผมรบกวนอีกครั้งครับ มันไม่ได้อย่างที่ต้องการ เนื่องจากข้อมูลที่เป็นของจริงนั้นมันจะปะปนกันมาไม่เีรียงตามลำดับในการตัดว่า row แรก ต้อง 7 digits row ถัดมาของข้อมูลเป็น 6 digits ครับ ซึ่งผมทดลองนำข้อมูลมาคละกันสร้างเป็น sheets
source(2) และนำcopy สูตรของอาจารย์ไปวางไว้มันจะไม่ได้คำตอบที่ต้องการ
โดยจริงๆ แล้วต้องดูที่ b_code ทุกตัวเป็น 7 digits หมดก่อนแล้ว vlookup เพื่อให้ได้ค่าว่าพบกี่ row แล้ว row ที่ไม่พบนั้นให้นำกลับไปหาใหม่โดยให้ลดจำนวน digit b_code ลงเหลือ 6 digits แล้วทำการ lookup หาข้อมูลอีก แล้วนำตัวที่ไม่เจอนั้นมาหาใหม่ โดยลดจำนวน digit b_code ลงเหลือ 5 digits และ 4 digits ......ไปเลยๆ จนกระทั่งหาไม่พบจาก sheet location_data ซึ่งผมไม่รู้ว่าจะเขียน loop ให้มันแสดงค่าผลลัพธ์ที่ต้องการไว้ใน column เดียวกันได้อย่างไร คือที่ column H และ Column I ที่อาจารย์ช่วยทำขึ้นมาให้ครับผม
รบกวนอาจารย์ช่วยอีกครั้งครับ
ขอบคุณพระคุณครับผม
You do not have the required permissions to view the files attached to this post.
snasui
Site Admin
Posts: 30919 Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:
#4
Post
by snasui » Fri May 27, 2011 12:31 pm
สามารถใช้สูตร Array ได้ครับแต่สูตรจะยากมาก ลองดูตามไฟล์แนบครับ
ที่เซลล์ E2 คีย์
=INDEX('Location Data'!$A$2:$A$19,SMALL(IF(ISNUMBER(MATCH('Location Data'!$A$2:$A$19,--MID(B2,3,8-ROW(INDIRECT("1:6"))),0)),ROW('Location Data'!$A$2:$A$19)-ROW('Location Data'!$A$2)+1),1))
Ctrl+Shift+Enter > Copy ลงด้านล่าง สำหรับค่าไหนที่ไม่มีในชีท Location Data จะแสดงค่า #Num!
You do not have the required permissions to view the files attached to this post.
sc201105
Member
Posts: 26 Joined: Fri May 13, 2011 7:28 am
#5
Post
by sc201105 » Fri May 27, 2011 1:04 pm
ขอบคุณครับท่านอาจารย์ ได้แล้วครับ มีคำถามเพิ่มเติมว่า
1. มัน run นานมากหากข้อมูลของผมมีขนาดเป็น หมื่นๆ แถว
ทำอย่างไรให้มันเร็วได้บ้างหรือเปล่าครับ
2. แล้วหาก copy สูตรเลยข้อมูลที่มีอยู่จะให้มันแสดงค่าเป็น
Null จะต้องเพิ่มเติมอย่างไรในสูตรบ้างครับ
3. แล้วหากเขียนเป็น VBA ผมจะเขียน code ตรงนี้ได้อย่างไร
บ้างครับผม
รบกวนอาจารย์เพิ่มอีกครั้งครับผม
ขอบพระคุณอาจารย์มาอีกครั้งครับผม
snasui
Site Admin
Posts: 30919 Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:
#6
Post
by snasui » Fri May 27, 2011 1:18 pm
1. เนื่องจากเป็นสูตร Array ข้อมูลเป็นหมื่นแถวก็จะใช้เวลาคำนวณนานครับ จะให้เร็วเครื่องต้องแรงครับ
2. กรณีไม่ต้องการให้แสดงค่าผิดพลาดก็ให้เขียนสูตร If ครอบเข้าไปอีกชั้น ยกตัวอย่างเช่น
=If(iserr(...)),"",...)
เครื่องหมาย ... คือสูตรเดิมและจะใช้ได้กับ Version 2007 ขึ้นไปเนื่องจากซ้อนสูตรเกิน 7 ชั้นจึงไม่สามารถทำได้ใน 2003
อีกทางเลือกให้เพิ่มคอลัมน์เข้ามาช่วย ยกตัวอย่างจากไฟล์เดิมที่เซลล์ G2 คีย์สูตรเพื่อแปลงค่า Location_Code ที่ผิดพลาดเป็นค่าว่าง
=If(Iserr(E2),"",E2)
Enter
3. กรณีต้องการใช้ VBA ให้เขียนมาก่อนครับ ติดตรงไหนก็มาถามกันต่อครับ
sc201105
Member
Posts: 26 Joined: Fri May 13, 2011 7:28 am
#7
Post
by sc201105 » Fri May 27, 2011 1:56 pm
ขอบคุณครับอาจารย์ สำหรับคำตอบ ส่วนเรื่อง vba นั้นผมไม่รู้จริงๆ เลย เลยไม่รู้จะขึ้นต้นเขียนอย่างไร จะกำหนดตัวแปรอย่างไร เพียงแต่ผมลองนำสูตรที่อาจารย์ทำให้ แล้วทดลอง record marco จะได้สูตรอย่างนี้ แล้วหากผมจะเขียนเป็นตัวแปรพอจะแนะเป็นจุดเริ่มต้นได้หรือเปล่าว่าจะขึ้นอย่างไรก่อนดี
Sub add_location_code()
Range("E2").Select
Selection.FormulaArray = _
"=INDEX('Location Data'!R2C1:R19C1,SMALL(IF(ISNUMBER(MATCH('Location Data'!R2C1:R19C1,--MID(RC[-3],3,8-ROW(INDIRECT(""1:6""))),0)),ROW('Location Data'!R2C1:R19C1)-ROW('Location Data'!R2C1)+1),1))"
Selection.Copy
Range("E3:E20").Select
ActiveSheet.Paste
Application.CutCopyMode = False
Range("F2").Select
ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-1],'Location Data'!R2C1:R19C2,2,FALSE)"
Selection.Copy
Range("F3:F20").Select
ActiveSheet.Paste
Application.CutCopyMode = False
End Sub
ขอบพระคุณครับผม
snasui
Site Admin
Posts: 30919 Joined: Sun Jan 24, 2010 12:33 pm
Location: Songkhla, Thailand
Excel Ver: 2010, 365
Contact:
#8
Post
by snasui » Fri May 27, 2011 2:28 pm
ดูการประยุกต์ใช้ Code ตามด้านล่างกับสูตร Array ตามไฟล์แนบครับ
Code: Select all
Sub Test0()
Dim r As Range, rs As Range, rt As Range
With Worksheets("Source")
Set rs = .Range("B2", .Range("B" & Rows.Count).End(xlUp))
End With
Set rt = Worksheets("Template").Range("B2")
For Each r In rs
rt = r
r.Offset(0, 3) = rt.Offset(0, 3)
r.Offset(0, 4) = rt.Offset(0, 4)
Next
End Sub
You do not have the required permissions to view the files attached to this post.
sc201105
Member
Posts: 26 Joined: Fri May 13, 2011 7:28 am
#9
Post
by sc201105 » Fri May 27, 2011 3:01 pm
ขอบคุณครับอาจารย์ ผมขอไปศึกษาก่อนครับ เพื่อประยุกต์ใช้กับงานหน้าต่อไปด้วย หากติดขัดประการใดจะเรียนรบกวนสอบถามเพิ่มเติมอีกครั้งต่อไป
ขอบพระคุณอย่างสูงอีกครั้งครับผม