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 จากการบันทึกมาโครได้แค่บางตัวเองค่ะ :lol:
และตอนบันทึกมาโครนั้น ก็เลือก COLUMN A:A แล้วรันมาโครเลย
ส่วนคำสั่งที่แนะนำมานั้น ก็เพียงแต่ COPY แล้วมาวางต่อเลยค่ะ

***ไฟล์แนบมาแล้วนะคะ** ขอบคุณค่ะ

Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ

Posted: Fri Feb 19, 2016 4:05 pm
by DhitiBank
janesit wrote: ไม่ทราบต้องแก้อย่างไรคะ เพราะทุกวันนี้ยังแกะ code จากการบันทึกมาโครได้แค่บางตัวเองค่ะ :lol:
และตอนบันทึกมาโครนั้น ก็เลือก 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+ :lol:

...... คงได้ปรับอีกทีก็วันจันทร์เลย.....ขอบคุณค่ะ

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

ขอบคุณค่ะ :D

Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ

Posted: Mon Feb 22, 2016 2:30 pm
by janesit
DhitiBank wrote::) ไม่เข้าใจตรงไหนก็ถามได้ครับ

การจัดการข้อมูลที่นำออกมาจากโปรแกรมสำเร็จรูป (เช่น Express หรืออื่นๆ) เราอาจใช้เพียงสูตรก็ได้ครับ เพราะข้อมูลพวกนี้มักจะมีจำนวนอักขระตายตัวในแต่ละบรรทัด และแบ่งคอลัมน์ไว้ให้อยู่แล้ว (เช่นตัวอย่างของคุณ janesit รายละเอียดในบิลแต่ละรายการจะมี 118 อักขระ และข้อมูลแต่ละประเภทก็จะเริ่มในตำแหน่งเดียวกันตลอด) ทำให้สามารถสร้างสูตรไว้ล่วงหน้าอีกชีทหนึ่งได้ เวลาใช้งานก็แค่เอาข้อมูลดิบมาวางครับ

เรื่องสูตร ไม่ถนัดเลยค่ะ อยากรู้สูตรที่คุณธิติ กล่าวมาในเคสนี้น่ะค่ะ .... :tt:

Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ

Posted: Mon Feb 22, 2016 2:37 pm
by snasui
:D อ่านแล้วผมยังไม่ทราบว่าต้องการจะทำอะไร ลองอธิบายขั้นตอนทั้งหมดมาพอสังเขป สำหรับการเปลี่ยน จุดเป็นค่าว่างด้วย Code สามารถใช้ Replace ได้ตามที่คุณ Dhitibank ตอบไปแล้วครับ

ส่วนด้วยสูตรสามารถใช้การ Substitute เข้ามาช่วยได้ เช่น

=Substitute(A1,".","")

เป็นต้น

Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ

Posted: Mon Feb 22, 2016 2:47 pm
by janesit
อ่อ....เข้าใจผิดค่ะอาจารย์นึกไปว่าคุณธิติ บอกให้ใช้สูตรแทนการบันทึกมาโครทั้งหมด ทุกขั้นตอนค่ะ
เลยคิดว่าทั้งหมดนั้น สามารถใช้สูตรแทนการบันทึกมาโครค่ะอาจารย์ เลยขอให้แสดงวิธีทั้งหมดแทนการบันทึกมาโครค่ะ :lol:

Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ

Posted: Mon Feb 22, 2016 2:53 pm
by snasui
:D การจะใช้สูตรแทน Macro ได้หรือไม่นั้นจะต้องทราบสิ่งที่ทำทุกขั้นตอนก่อนครับ

โดยปกติแล้วงานส่วนใหญ่ เราสามารถใช้สูตรเข้ามาช่วยในการจัดการได้ ซึ่งก็แล้วแต่ว่าเป็นงานลักษณะใด ยกเว้นงานที่ต้องทำด้วยการเขียน Code โดยเฉพาะ เช่นดึงข้อมูล ดึงภาพ จาก Drive, การเขียน Text File, การติดต่อ Database เช่นนี้เป็นต้น

แต่หากเป็นการแยกข้อมูลที่อยู่ในเซลล์เดียวให้เป็นหลายเซลล์ การรวมข้อมูลจากหลายเซลล์เป็นเซลล์เดียวในระดับที่ไม่มีเงื่อนไขซับซ้อนนัก การนำข้อมูลมาแสดงตามเงื่อนไข หรือการสรุปข้อมูลในแบบต่าง ๆ เช่นนี้ เราสามารถใช้สูตรมาช่วยได้ครับ

Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ

Posted: Mon Feb 22, 2016 3:04 pm
by janesit
[quote="snasui"]:D การจะใช้สูตรแทน 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
:D ควรแจ้งขั้นตอนของการทำงานครับ ไม่ใช่แจ้งลำดับการบันทึก Macro

เมื่องแจ้งขั้นตอนการทำงานมาแล้วผู้ตอบจะบอกได้เองว่าใช้ Code หรือสูตร หรือทั้งสองอย่าง ตัวอย่างการทำงานเช่น
  1. คัดลอกข้อมูลจากโปรแกรม Express มาวาง
  2. ตัดข้อมูลให้เหลือ รหัส คำอธิบาย และตัวเลข (ตัวเลขไหนสังเกตจากอะไรก็แจ้งมาด้วย)
  3. ลบค่าซ้ำโดยพิจารณาจากรหัสดูตัวอย่างจากชีตผลลัพธ์
  4. ฯลฯ
สำหรับชีทผลลัพธ์ค่าในคอลัมน์ D คือค่าใด พิจารณาจากอะไรครับ :?:

Re: รบกวนแนะนำการแก้ CODE มาโครค่ะ

Posted: Tue Feb 23, 2016 1:33 pm
by janesit
ไม่เป็นไรค่ะอาจารย์
ในขณะที่จะเรียบเรียงคำอธิบายอีกครั้ง อยู่ ๆ ก็นึกวิธีที่ต้องการแบบสั้น ๆ ได้มาขณะนี้เองค่ะ ... :D
จากการพิจารณาคำแนะนำของคุณธิติ อีกครั้งค่ะ .... :thup: :cp:


ขอบคุณค่ะ

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 เดียว แต่หากมีมากกว่านี้ก็ต้องปรับสูตรครับ