Page 1 of 1
รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Thu Feb 18, 2016 2:24 pm
by janesit
รบกวนแนะนำด้วยค่ะ มือใหม่ทดลองใช้มาโครค่ะ
ได้บันทึกมาโคร การแทนที่ .(จุด) ด้วยความว่าง
แล้วเอามาต่อมาโครที่รันไว้ ทำไม..... คำสั่งแทนที่จุดด้วยความว่าง ใช้ไม่ได้ผลคะ
ขอบคุณค่ะ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Thu Feb 18, 2016 2:42 pm
by DhitiBank
ถ้าแนบไฟล์ตัวอย่างมาด้วยจะดีมากเลยครับ จะได้ทดสอบโค้ดได้สะดวก
สำหรับการแทนที่จุดในช่วงข้อมูลที่เลือกด้วยค่าว่าง ลองแบบนี้ครับ
Code: Select all
Sub Macro2()
Dim r As Range
For Each r In Selection
r.Value = Replace(r.Value, ".", "")
Next r
End Sub
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Fri Feb 19, 2016 1:06 pm
by janesit
คุณ "DhitiBank " ที่แนะนำให้นั้น ใช้ได้นะคะ เพียงแต่ มันค้างนานมากและโปรแกรมก็ขึ้น not responding
แนบไฟลมาให้พิจารณาค่ะ MACRO NAME --VWdata ค่ะ ** วางข้อมูลแล้ว สามารถรันต่อได้เลยค่ะ
ขอบคุณค่ะ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Fri Feb 19, 2016 2:49 pm
by DhitiBank
janesit wrote:มันค้างนานมากและโปรแกรมก็ขึ้น not responding
ก่อนรันมาโครจะต้องเลือกช่วงเซลล์ที่ต้องการจะแทนที่ก่อนครับ เพราะผมเดาเอาจากภาพที่คุณ janesit แนบมาด้านบนแล้วก็เลยเขียนโค้ดไปแบบนั้น คือเลือกก่อนแล้วค่อยรันมาโคร เช่น
สมมติข้อมูลอยู่ในช่วง A1:A10 -> คลุม A1:A10 -> รันมาโคร
มองไม่เห็นไฟล์แนบ ลองแนบมาใหม่ครับ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Fri Feb 19, 2016 3:08 pm
by janesit
DhitiBank wrote:janesit wrote:มันค้างนานมากและโปรแกรมก็ขึ้น not responding
มองไม่เห็นไฟล์แนบ ลองแนบมาใหม่ครับ
ไม่ทราบต้องแก้อย่างไรคะ เพราะทุกวันนี้ยังแกะ code จากการบันทึกมาโครได้แค่บางตัวเองค่ะ
และตอนบันทึกมาโครนั้น ก็เลือก COLUMN A:A แล้วรันมาโครเลย
ส่วนคำสั่งที่แนะนำมานั้น ก็เพียงแต่ COPY แล้วมาวางต่อเลยค่ะ
***ไฟล์แนบมาแล้วนะคะ** ขอบคุณค่ะ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Fri Feb 19, 2016 4:05 pm
by DhitiBank
janesit wrote:
ไม่ทราบต้องแก้อย่างไรคะ เพราะทุกวันนี้ยังแกะ code จากการบันทึกมาโครได้แค่บางตัวเองค่ะ
และตอนบันทึกมาโครนั้น ก็เลือก COLUMN A:A แล้วรันมาโครเลย
ส่วนคำสั่งที่แนะนำมานั้น ก็เพียงแต่ COPY แล้วมาวางต่อเลยค่ะ
***ไฟล์แนบมาแล้วนะคะ** ขอบคุณค่ะ
ข้อมูลในชีท ExpVW คือข้อมูลดิบที่ยังไม่ได้ทำอะไรใช่ไหมครับ
หากใช่ รบกวนบอกสิ่งที่ต้องการทำหน่อยครับ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Fri Feb 19, 2016 5:27 pm
by janesit
เป็นข้อมูลดิบค่ะ รันมาโครได้เลยค่ะ
:
Select A:A จากนั้น รันมาโคร ชื่อ VWdata ได้เลยค่ะ
ที่เพิ่มมาจากคำแนะนำของคุณ CODE อยู่ด้านล่างสุดเลยค่ะ
รันแล้ว เครื่องค้าง ถึงน็อค จนต้องรีสตาร์ท เครื่องค่ะ
ขอบคุณค่ะ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Fri Feb 19, 2016 6:23 pm
by DhitiBank
ลองปรับโค้ดเป็นแบบนี้ดูครับ
Code: Select all
Public Sub test()
Dim lRow As Long, rAll As Range, r As Range, iCount As Long, _
sDocCode As String
With Application
.ScreenUpdating = False
.Calculation = xlCalculationManual
End With
With ActiveSheet
iCount = 0
lRow = .Range("a" & .Rows.Count).End(xlUp).Row
Set rAll = .Range("a1:a" & lRow)
For Each r In rAll
If InStr(1, r.Value, "VW") Then
sDocCode = Trim(Mid(r.Value, InStr(1, r.Value, "VW")))
End If
If IsNumeric(Trim(Mid(r.Value, 1, 5))) And Len(r.Value) = 118 Then
.Cells(iCount + 1, "b") = sDocCode
.Cells(iCount + 1, "c") = Trim(Mid(r.Value, 7, 13))
.Cells(iCount + 1, "d") = Trim(Mid(r.Value, 21, 39))
.Cells(iCount + 1, "e") = Trim(Mid(r.Value, 66, 8))
iCount = iCount + 1
End If
Next r
.Columns("a").Delete Shift:=xlLeft
.Columns("a:d").AutoFit
Set rAll = .Range("a1").CurrentRegion
rAll.RemoveDuplicates Columns:=3, Header:=xlNo
End With
With Application
.Calculation = xlCalculationAutomatic
.ScreenUpdating = True
End With
End Sub
เอาไปวางไว้ที่โมดูลไหนก็ได้ครับ
ปล. หากเจอกรณีเครื่องค้างเพราะโค้ดยังรันไม่จบ ผมใช้วิธีกด Esc ค้างไว้ครับ แล้วคำสั่งจะหยุด แต่โค้ดด้านบนนี้คงไม่ค้างแล้วครับ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Fri Feb 19, 2016 6:58 pm
by janesit
อ่านแล้วเข้าใจแค่ a: delete shift xlleft กับ a:d Autofit 5555+
...... คงได้ปรับอีกทีก็วันจันทร์เลย.....ขอบคุณค่ะ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Sat Feb 20, 2016 10:43 am
by DhitiBank
ไม่เข้าใจตรงไหนก็ถามได้ครับ
การจัดการข้อมูลที่นำออกมาจากโปรแกรมสำเร็จรูป (เช่น Express หรืออื่นๆ) เราอาจใช้เพียงสูตรก็ได้ครับ เพราะข้อมูลพวกนี้มักจะมีจำนวนอักขระตายตัวในแต่ละบรรทัด และแบ่งคอลัมน์ไว้ให้อยู่แล้ว (เช่นตัวอย่างของคุณ janesit รายละเอียดในบิลแต่ละรายการจะมี 118 อักขระ และข้อมูลแต่ละประเภทก็จะเริ่มในตำแหน่งเดียวกันตลอด) ทำให้สามารถสร้างสูตรไว้ล่วงหน้าอีกชีทหนึ่งได้ เวลาใช้งานก็แค่เอาข้อมูลดิบมาวางครับ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Mon Feb 22, 2016 11:41 am
by janesit
ขอบคุณคำแนะนำค่ะ ข้อมูลชุดนี้มีการจัดการข้อมูลก่อนหน้านั้น 1 ชุด และต่อจากนี้อีกชุดค่ะ
ตั้งแต่การเคลียรข้อมูลที่ได้รับจากลูกค้า ซึ่งติดปัญหาเยอะมากจากไฟล์ลูกค้า
ต้องทำหลายขั้นค่ะ กว่าจะนำมาแมทกันได้ เลยแยกไว้ 3 ชีท ค่ะ
ปัญหา คือผู้ใช้งานต่อจากตรงนี้ ขาดความรู้ด้านเอกเซลตั้งแต่เบื้องต้นเลยค่ะ
เลยต้องหาวิธีทำงานให้เขาสามารถทำต่อได้ค่ะ......ตอนนี้ก็พอใจระดับหนึ่งแล้วค่ะ
ขอบคุณค่ะ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Mon Feb 22, 2016 2:30 pm
by janesit
DhitiBank wrote: ไม่เข้าใจตรงไหนก็ถามได้ครับ
การจัดการข้อมูลที่นำออกมาจากโปรแกรมสำเร็จรูป (เช่น Express หรืออื่นๆ) เราอาจใช้เพียงสูตรก็ได้ครับ เพราะข้อมูลพวกนี้มักจะมีจำนวนอักขระตายตัวในแต่ละบรรทัด และแบ่งคอลัมน์ไว้ให้อยู่แล้ว (เช่นตัวอย่างของคุณ janesit รายละเอียดในบิลแต่ละรายการจะมี 118 อักขระ และข้อมูลแต่ละประเภทก็จะเริ่มในตำแหน่งเดียวกันตลอด) ทำให้สามารถสร้างสูตรไว้ล่วงหน้าอีกชีทหนึ่งได้ เวลาใช้งานก็แค่เอาข้อมูลดิบมาวางครับ
เรื่องสูตร ไม่ถนัดเลยค่ะ อยากรู้สูตรที่คุณธิติ กล่าวมาในเคสนี้น่ะค่ะ ....
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Mon Feb 22, 2016 2:37 pm
by snasui
อ่านแล้วผมยังไม่ทราบว่าต้องการจะทำอะไร ลองอธิบายขั้นตอนทั้งหมดมาพอสังเขป สำหรับการเปลี่ยน จุดเป็นค่าว่างด้วย Code สามารถใช้ Replace ได้ตามที่คุณ Dhitibank ตอบไปแล้วครับ
ส่วนด้วยสูตรสามารถใช้การ Substitute เข้ามาช่วยได้ เช่น
=Substitute(A1,".","")
เป็นต้น
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Mon Feb 22, 2016 2:47 pm
by janesit
อ่อ....เข้าใจผิดค่ะอาจารย์นึกไปว่าคุณธิติ บอกให้ใช้สูตรแทนการบันทึกมาโครทั้งหมด ทุกขั้นตอนค่ะ
เลยคิดว่าทั้งหมดนั้น สามารถใช้สูตรแทนการบันทึกมาโครค่ะอาจารย์ เลยขอให้แสดงวิธีทั้งหมดแทนการบันทึกมาโครค่ะ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Mon Feb 22, 2016 2:53 pm
by snasui
การจะใช้สูตรแทน Macro ได้หรือไม่นั้นจะต้องทราบสิ่งที่ทำทุกขั้นตอนก่อนครับ
โดยปกติแล้วงานส่วนใหญ่ เราสามารถใช้สูตรเข้ามาช่วยในการจัดการได้ ซึ่งก็แล้วแต่ว่าเป็นงานลักษณะใด ยกเว้นงานที่ต้องทำด้วยการเขียน Code โดยเฉพาะ เช่นดึงข้อมูล ดึงภาพ จาก Drive, การเขียน Text File, การติดต่อ Database เช่นนี้เป็นต้น
แต่หากเป็นการแยกข้อมูลที่อยู่ในเซลล์เดียวให้เป็นหลายเซลล์ การรวมข้อมูลจากหลายเซลล์เป็นเซลล์เดียวในระดับที่ไม่มีเงื่อนไขซับซ้อนนัก การนำข้อมูลมาแสดงตามเงื่อนไข หรือการสรุปข้อมูลในแบบต่าง ๆ เช่นนี้ เราสามารถใช้สูตรมาช่วยได้ครับ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Mon Feb 22, 2016 3:04 pm
by janesit
[quote="snasui"]
การจะใช้สูตรแทน Macro ได้หรือไม่นั้นจะต้องทราบสิ่งที่ทำทุกขั้นตอนก่อนครับ
ขอเรียงลำดับขั้นตอนก่อนแป๊บหนึ่งค่ะ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Mon Feb 22, 2016 4:56 pm
by janesit
แนบไฟล์มาให้แล้ว เพื่อขอศึกษาจากสูตรที่จะแนะนำมาให้นะคะ
ขอบคุณค่ะ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Mon Feb 22, 2016 5:18 pm
by snasui
ควรแจ้งขั้นตอนของการทำงานครับ ไม่ใช่แจ้งลำดับการบันทึก Macro
เมื่องแจ้งขั้นตอนการทำงานมาแล้วผู้ตอบจะบอกได้เองว่าใช้ Code หรือสูตร หรือทั้งสองอย่าง ตัวอย่างการทำงานเช่น
- คัดลอกข้อมูลจากโปรแกรม Express มาวาง
- ตัดข้อมูลให้เหลือ รหัส คำอธิบาย และตัวเลข (ตัวเลขไหนสังเกตจากอะไรก็แจ้งมาด้วย)
- ลบค่าซ้ำโดยพิจารณาจากรหัสดูตัวอย่างจากชีตผลลัพธ์
- ฯลฯ
สำหรับชีทผลลัพธ์ค่าในคอลัมน์ D คือค่าใด พิจารณาจากอะไรครับ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Tue Feb 23, 2016 1:33 pm
by janesit
ไม่เป็นไรค่ะอาจารย์
ในขณะที่จะเรียบเรียงคำอธิบายอีกครั้ง อยู่ ๆ ก็นึกวิธีที่ต้องการแบบสั้น ๆ ได้มาขณะนี้เองค่ะ ...
จากการพิจารณาคำแนะนำของคุณธิติ อีกครั้งค่ะ ....
ขอบคุณค่ะ
Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ
Posted: Fri Feb 26, 2016 12:49 pm
by DhitiBank
หากต้องการใช้สูตรตัดข้อความแทนการใช้มาโคร ลองทำแบบนี้ครับ
1. B1, B2, C1, C2, D1, D2 คีย์ 7, 13, 21, 38, 66, 8 ตามลำดับ (เป็นตำแหน่งอักขระและจำนวนอักขระที่จะตัดจากข้อมูลดิบในแต่ละบรรทัดที่ได้ตามเงื่อนไข ตัวเลขชุดนี้จะเอาไปใช้สูตรข้อ 3 ครับ ผมดูด้วยโปรแกรม Notpad++ แล้วใช้ font พวก monospace หากทำงานกับไฟล์ที่ export จาก express บ่อยๆ ลองหามาใช้ดูครับ ฟรี)
Notepad++.png
2. หาเลข Invoice
2.1 F1 คีย์
=INDEX('DATA EXPRESS'!$A$1:$A$1000,LOOKUP(1,1/ISNUMBER(SEARCH($G$2,'DATA EXPRESS'!$A$1:$A$1000)),ROW('DATA EXPRESS'!$A$1:$A$1000)))
Enter
2.2 G2 คีย์ VW (อักษรนำ invoice ที่ไม่คีย์ลงไปในสูตร 2.1 เพราะเผื่อมีตัวย่ออื่นๆ ครับ)
2.3 F3 คีย์
=MID(F1,SEARCH(G2,F1),9)
Enter
3. หารายละเอียดใน Invoice ที่เข้าเงื่อนไข
3.1 H1 คีย์
=IF(ISNUMBER(--MID('DATA EXPRESS'!$A1,1,5)),IF(ISNUMBER(--MID('DATA EXPRESS'!$A1,B$1,B$2)),--MID('DATA EXPRESS'!$A1,B$1,B$2),TRIM(MID('DATA EXPRESS'!$A1,B$1,B$2))),"")
Enter -> คัดลอกไปถึง J1
3.2 K1 คีย์
=IF(OR(H1="",COUNTIFS(H$1:H1,H1,I$1:I1,I1,J$1:J1,J1)>1),"",ROWS(J$1:J1))
Enter
3.3 คัดลอกสูตร 3.1, 3.2 ลงล่างเผื่อเอาไว้เลยครับ
4. รวมรายการที่ไม่ซ้ำ
4.1 A4 คีย์
=IF(B4<>"",$F$3,"")
Enter
4.2 B4 คีย์
=IFERROR(INDEX(H$1:H$250,SMALL($K$1:$K$250,ROWS(B$4:B4))),"")
Enter -> คัดลอกไป D4 -> คัดลอกสูตร 4.1 และ 4.2 ลงล่างครับ
กรณีนี้จะใช้ได้เมื่อข้อมูลดิบที่เอามาวางมีเพียง Invoice เดียว แต่หากมีมากกว่านี้ก็ต้องปรับสูตรครับ