:D snasui.com ยินดีต้อนรับ :D
ยินดีต้อนรับสู่กระดานถามตอบ Excel and VBA และอื่น ๆ ที่เป็นมิตรกับทุกท่าน มีไฟล์แนบมหาศาล ช่วยให้ท่านค้นหาและติดตามศึกษาได้โดยง่าย :thup: สมาชิกท่านใดที่ยังไม่ได้ระบุ Version ของ Excel ที่ใช้งานจริง สามารถทำตาม Link นี้เพื่อจะได้รับคำตอบที่ตรงกับ Version ของท่านครับ :arrow: ระบุ Version ของ Excel
:!: โปรดทราบ :!:
  1. กรุณาอ่านกฎการใช้บอร์ด (Forum rules) ในตำแหน่งด้านบนของแต่ละบอร์ด
  2. การสมัครสมาชิก การ Login การกู้คืนรหัสผ่าน
    1. สมัครสมาชิกดูขั้นตอนได้ที่ :arrow: สมัครสมาชิก
    2. Login เข้าระบบโดยคลิกปุ่ม Login ตรงมุมขวาบนของหน้านี้ :roll:
    3. การ Login ผ่าน Facebook ดูวิธีที่ :arrow: Login ผ่าน Facebook
    4. ลืมรหัสผ่านสามารถรับรหัสใหม่ได้ที่ :arrow: Reset รหัสผ่าน
  3. มีปัญหาการใช้งาน แจ้งผู้ดูแลระบบได้ที่ :arrow: ติดต่อผู้ดูแลระบบ
  4. กำหนดการตั้งค่าส่วนตัว เช่นตั้งค่าภาษาเป็นไทยหรืออังกฤษดูได้ที่ :arrow: ตั้งค่าส่วนตัว
  5. การตั้งและตอบกระทู้ดูได้ที่ :arrow: วิธีการตั้งและตอบกระทู้
  6. การจัดรูปแบบตัวอักษรด้วย bbcode ในช่องแสดงความคิดเห็นดูได้ที่ :arrow: จัดรูปแบบตัวอักษร
  7. กำหนดขนาดตัวอักษรใน Browser ดูได้ที่ :arrow: กำหนดขนาดตัวอักษรใน Browser

แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

Forum rules
  1. ไม่อนุญาตให้ใช้ภาษาแชทในการถามและตอบปัญหา ไม่ใช้คำว่า "คับ" หรือ "อ่ะครับ" แทนคำว่า "ครับ" ไม่ใช้คำว่า "เด๋ว" แทนคำว่า "เดี๋ยว" เป็นต้น เนื่องจากเมื่อแปลเป็นภาษาต่างประเทศแล้วจะให้ความหมายผิดไปจากที่ควรจะเป็น
  2. ห้ามถามโดยระบุชื่อผู้ตอบและต้องตั้งชื่อกระทู้ให้สื่อถึงปัญหาที่จะถาม ไม่ตั้งชื่อว่า ช่วยด้วยครับ, มีปัญหามาปรึกษาครับ เป็นต้น
  3. กรุณาอธิบายปัญหาและระบุคำตอบที่ต้องการมาในกระทู้ด้วยเสมอถึงแม้จะอธิบายไว้ในไฟล์แนบแล้วก็ตาม ทั้งนี้เพื่ออำนวยความสะดวกแก่เพื่อนสมาชิกในการค้นหาข้อมูล
  4. กรุณาแนบไฟล์ตัวอย่างพร้อมแสดงคำตอบที่ถูกต้องมาในไฟล์ด้วยเพื่อให้ง่ายต่อการทำความเข้าใจและสะดวกต่อการตอบคำถาม (ขนาดไฟล์ไม่เกิน 500Kb ขนาดภาพไม่เกิน 800*600 Pixel) ไม่แนบเป็น Link มาจากแหล่งอื่นที่อาจจะถูกลบทิ้งไปโดยต้นทางในภายหลัง นอกจากนี้ไม่ควรแนบไฟล์ที่มีข้อมูลสำคัญอันก่อให้เกิดความเสียหายกับตนเองและผู้อื่น
  5. กรณีเป็นคำถามเกี่ยวกับ Programming เช่น VBA, VB.Net, C#, SQL ฯลฯ ต้องลองเขียนมาเองก่อนเสมอ ถามเฉพาะที่ติดปัญหา ระบุ Module, Procedure ที่ติดปัญหาให้ชัดเจน กรุณาโพสต์ Code ให้แสดงเป็น Code คือเปิดด้วย [code] และปิดด้วย [/code] ตัวอย่างเช่น [code]dim r as range[/code] เพื่อให้แตกต่างจากข้อความทั่วไป สะดวกในการอ่านและทดสอบ (คลิกเพื่อดูตัวอย่าง)
  6. กรุณาแจ้งผลการใช้งานเมื่อได้รับคำตอบว่าตรงกับความต้องการหรือไม่

Post a reply


This question is a means of preventing automated form submissions by spambots.
Smilies
:D :thup: :cp: :flw: :rz: :sg: :tt: :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :arrow: :ard: :arl: :aru: :| :mrgreen: :geek: :ugeek:

BBCode is ON
[img] is ON
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#22

by p_d » Tue Sep 13, 2016 10:18 am

เรียน คุณ snasui
หลังจากรันแล้ว พบว่าสลับค่าแสดงผลกันค่ะ แต่แก้ไขได้แล้วค่ะ เปลี่ยนจาก pd เป็น dd ได้ผลลัพธ์ออกมาถูกต้องค่ะ

Code: Select all

 If pd <= dd Then
                .Range("b4").Offset(l, dd).Value = "R/D"
            Else
ขอบคุณมาก ๆ ค่ะ
p_d

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#21

by snasui » Mon Sep 12, 2016 8:43 pm

:D ตัวอย่างการปรับ Code ครับ

Code: Select all

Dim l As Long, tg As Range
Dim source As Range, r As Range
Dim dd As Byte, pd As Byte
With Sheets("data")
    Set source = .Range("a2", .Range("a" & .Rows.Count).End(xlUp))
    l = source.Count
    With .Parent.Sheets("schedule")
        .Range("a4").Resize(.UsedRange.Rows.Count, .UsedRange.Columns.Count) _
            .ClearContents
        With .Range("a4").Resize(l)
            .Value = source.Value
            .RemoveDuplicates Columns:=1, Header:=xlNo
        End With
        Set tg = .Range("a4", .Range("a" & .Rows.Count).End(xlUp))
        For Each r In source
            l = Application.Match(r, tg, 0) - 1
            dd = Left(r.Offset(0, 5), 2)
            pd = Left(r.Offset(0, 6), 2)
            If pd <= dd Then
                .Range("b4").Offset(l, pd).Value = "R/D"
            Else
                .Range("b4").Offset(l, dd).Value = "R"
                .Range("b4").Offset(l, pd).Value = "D"
            End If
        Next r
    End With
End With

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#20

by p_d » Mon Sep 12, 2016 9:46 am

เรียน คุณ snasui

ยังไม่เข้าใจว่าจะทำอย่างไรให้ลบ partcode ที่ซ้ำกันแต่ค่า R และ D ที่แสดงในช่องวันที่ ยังอยู่ครบเหมือนเดิม เพราะเมื่อใช้ Code vb เพิ่มเข้าไปก็จะไปลบทั้งแถวทันที รบกวนชี้แนะด้วยค่ะ :P

Code: Select all

 Sub DeleteDups()
     
    Dim x               As Long
    Dim LastRow         As Long
     
    LastRow = Range("A65536").End(xlUp).Row
    For x = LastRow To 1 Step -1
        If Application.WorksheetFunction.CountIf(Range("A1:A" & x), Range("A" & x).Text) > 1 Then
            Range("A" & x).EntireRow.Delete
        End If
    Next x
     
End Sub
ขอบคุณค่ะ
p_d

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#19

by snasui » Fri Sep 09, 2016 6:58 pm

:D ได้ปรับปรุง Code มาแล้วยังครับ

หากยังให้ปรับมาก่อน ติดตรงไหนค่อยถามกันต่อครับ

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#18

by p_d » Fri Sep 09, 2016 3:25 pm

รบกวนอีกรอบนะคะ ถ้าเราต้องการเพิ่มเงื่อนไข โดยให้ part code ซ้ำกันรวมเป็นแถวเดียว โดยมีเงื่อนไขดังนี้
1.ถ้าได้รับงานก่อนวัน Del date (หรือวันที่เดียวกัน) จะแสดงผลเป็น R/D ในช่องวัน Del date
2.ถ้าได้รับงานหลังวัน Del date จะแสดงผลเป็น R ในช่อง Del date และ D ในช่อง Posts date (เงื่อนไขเก่า)

เงื่อนไขตามชีท data test
ผลลัพธ์ที่ต้องการตามชีท result ค่ะ
พอจะมีวิธีไหมคะ รบกวนแนะนำด้วยค่ะ ปวดสมองจริง ๆ :roll:

ขอบคุณค่ะ
p_d
Attachments
5F1_RD.xlsm
(164.06 KiB) Downloaded 19 times

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#17

by p_d » Fri Sep 09, 2016 1:09 pm

เรียนคุณ niwat2811

ถูกต้องเลยค่ะ รันเร็วมาก ขอบคุณสำหรับความรู้เรื่อง Code VB ยอมแพ้เรื่อง Next , Loop จริง ๆ ค่ะ งงไปหมด (T T)

ขอบคุณมาก ๆ ค่ะ
p_d

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#16

by niwat2811 » Fri Sep 09, 2016 10:44 am

คงหมายถึง Run Code จากชีท Data ลองแบบนี้ดูครับ

Code: Select all

Sub test()
Dim lr As Long, r As Range
Dim i As Integer, j As Integer
Application.ScreenUpdating = False
With Sheets("Data")
    lr = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("H1").Value = "R"
    .Range("I1").Value = "D"
    For Each r In .Range("F2:F" & lr)
        If r.Value <> "" Then
            r.Offset(0, 2).Value = Left(r, 2)
        End If
    Next r
    For Each r In .Range("G2:G" & lr)
        If r.Value <> "" Then
            r.Offset(0, 2).Value = Left(r, 2)
        End If
    Next r
    .Range("A2:A" & lr).Copy Sheets("Schedule").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
    .Range("H1:I" & lr).Copy Sheets("Schedule").Range("AH3")
    .Columns("H:I").ClearContents
End With
Sheets("schedule").Activate
lr = Range("A" & Rows.Count).End(xlUp).Row
lc = Cells(3, Columns.Count).End(xlToLeft).Column - 2
For i = 4 To lr
    For j = 3 To lc
        If Cells(i, 34) = Cells(2, j) Then
            Cells(i, j).Value = "R"
        End If
    Next j
Next i
For i = 4 To lr
    For j = 3 To lc
        If Cells(i, 35) = Cells(2, j) Then
            Cells(i, j).Value = "D"
        End If
    Next j
Next i
Columns("AH:AI").ClearContents
Application.ScreenUpdating = True
End Sub

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#15

by p_d » Fri Sep 09, 2016 10:28 am

เรียน คุณ niwat2811

ขอบคุณสำหรับ code ที่ให้มาค่ะ แต่ยังไม่ตรงตามวัตถุประสงค์ที่จะใช้งาน เพราะต้องการใส่ในรูปแบบ schedule เพื่อง่ายต่อการมองช่วงเวลาระยะห่างทั้ง 2 ตัวแปรนี้ ถ้ารันตามโค้ดที่คุณ niwat2811 จะได้ผลลัพธ์เหมือนการใช้ Text to column ค่ะ

ขอบคุณค่ะ
p_d

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#14

by niwat2811 » Thu Sep 08, 2016 3:57 pm

Code: Select all

Sub test()
Dim lr As Long, r As Range
Dim i As Integer, j As Integer
Application.ScreenUpdating = False
With Sheets("Data")
    lr = .Range("A" & Rows.Count).End(xlUp).Row
    .Range("H1").Value = "R"
    .Range("I1").Value = "D"
    For Each r In .Range("F2:F" & lr)
        If r.Value <> "" Then
            r.Offset(0, 2).Value = Left(r, 2)
        End If
    Next r
    For Each r In .Range("G2:G" & lr)
        If r.Value <> "" Then
            r.Offset(0, 2).Value = Left(r, 2)
        End If
    Next r
    .Range("A2:A" & lr).Copy Sheets("Schedule").Range("A" & Rows.Count).End(xlUp).Offset(1, 0)
    .Range("H1:I" & lr).Copy Sheets("Schedule").Range("AH3")
    .Columns("H:I").ClearContents
End With
lr = Range("A" & Rows.Count).End(xlUp).Row
lc = Cells(3, Columns.Count).End(xlToLeft).Column - 2
For i = 4 To lr
    For j = 3 To lc
        If Cells(i, 34) = Cells(2, j) Then
            Cells(i, j).Value = "R"
        End If
    Next j
Next i
For i = 4 To lr
    For j = 3 To lc
        If Cells(i, 35) = Cells(2, j) Then
            Cells(i, j).Value = "D"
        End If
    Next j
Next i
Columns("AH:AI").ClearContents
Application.ScreenUpdating = True
End Sub
ลองแบบนี้ดูว่าได้ตามต้องการไหมครับ

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#13

by p_d » Thu Sep 08, 2016 2:17 pm

ลืมแนบไฟล์ตัวอย่างค่ะ

ขอบคุณค่ะ
p_d
Attachments
5F1.xlsm
(294.48 KiB) Downloaded 25 times

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#12

by p_d » Thu Sep 08, 2016 10:15 am

เรียน คุณ snasui
ใช้งานได้ถูกต้องแล้วค่ะ ขอบคุณมากเลยนะคะ แต่ขอสอบถามเพิ่มเติมค่ะ กรณีที่มีข้อมูลมาก ๆ หลายพันแถว ปรากฎว่ามันขึ้น not responding แล้วค้างนานมาก จึงปิดโปรแกรมไป (น่าจะเกิดจากข้อมูลที่วนลูปมาก ๆ ) จึงทดสอบรันประมาณ 500 แถว ก็รอประมาณ 2-3 นาที แบบนี้พอจะมีวิธีแก้ไขไหมคะ

ขอบคุณค่ะ
p_d

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#11

by snasui » Wed Sep 07, 2016 6:45 pm

:D ผมลืมแก้ไขตัวแปร a เป็น r ไปสองบรรทัด ตัวอย่าง Code เฉพาะที่ต้องแก้ไขครับ

Code: Select all

'Other code
tvalue = Left(r.Value, 2)
If IsEmpty(tvalue) Then Exit For
nvalue = Left(r.Offset(0, -1).Value, 2)
'Other code

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#10

by p_d » Wed Sep 07, 2016 9:06 am

เรียน คุณ snasui

เพื่อให้เห็นภาพผลลัพธ์ที่ต้องการดิฉันแนบไฟล์มาให้อีกครั้งค่ะ รบกวนด้วยนะคะ(ชีท Ex.result) เพราะ part code เยอะมาต้องมานั่ง manual ใส่ตารางช้าละตาลายมากค่ะ :)

ขอบคุณค่ะ
p_d
Attachments
vendor_RD_Test.xlsm
(41.28 KiB) Downloaded 21 times

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#9

by p_d » Wed Sep 07, 2016 8:28 am

เรียน คุณ snasui
หลังจากรันมาโครแล้วผลลัพธ์ยังไม่ถูกต้องนะคะ ทำไมมันถึงมี R และ D ซ้ำกันหลายครั้งใน part code เดียวกัน ซึ่งจริง ๆ แล้วต้องมีแค่อย่างละ 1 ตัวค่ะ จากตารางข้อมูลตัวอย่าง
เช่น CBDGD0002QS24 ก็จะแสดงค่า R ในช่องวันที่ 17 และ D ในช่องวันที่ 11 เท่านั้น แต่โค้ดที่อาจารย์ให้มารันแล้วพบว่า มี R และ D ในทุกช่องที่อยู่ในช่วงวันที่ของข้อมูลในชีท Data ควรแก้ไขให้ถูกต้องอย่างไรคะ

รบกวนด้วยค่ะ
ขอบคุณค่ะ
p_d

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#8

by snasui » Tue Sep 06, 2016 7:02 pm

:D ตัวอย่าง Code ตามด้านล่างครับ

Code: Select all

Sub CopyPartCode()
    Dim nvalue As Integer
    Dim arange As Range
    Dim r As Range
    Dim tvalue As Integer
    Application.ScreenUpdating = False
    nrow = 4
    With Sheets("data")
        Set arange = .Range("a2", .Range("a" & .Rows.Count).End(xlUp)).Offset(0, 6)
    End With
    For Each r In arange
            If Len(r.Offset(0, -6).Value) = 13 Then
                    Sheets("schedule").Cells(nrow, 1).Value = r.Offset(0, -6).Value
                    For Each a In arange
                            tvalue = Left(a.Value, 2)
                            If IsEmpty(tvalue) Then Exit For
                            nvalue = Left(a.Offset(0, -1).Value, 2)
                            For Each b In Sheets("schedule").Range("c2:ag2")
                                    If tvalue = b.Value Then
                                        Sheets("schedule").Cells(nrow, b.Column).Value = "D"
                                    ElseIf nvalue = b.Value Then
                                        Sheets("schedule").Cells(nrow, b.Column).Value = "R"
                                    End If
                            Next b
                    Next a
                    nrow = nrow + 1
            End If
    Next r
    Application.ScreenUpdating = True
     MsgBox ("Process Completed!")
     Sheets("schedule").Select
End Sub

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#7

by p_d » Tue Sep 06, 2016 8:24 am

เรียน คุณ snasui
แนบไฟล์คำตอบที่ต้องการมาให้แล้วค่ะ
ขอบคุณค่ะ
p_d
Attachments
vendor_RD.xlsm
(20.97 KiB) Downloaded 24 times

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#6

by snasui » Mon Sep 05, 2016 7:36 pm

:D จากไฟล์ที่แนบมาล่าสุดช่วยเติมข้อมูลในชีต Shedule ด้วยว่าต้องการให้เซลล์ใดเป็นเท่าใด พิจารณาอย่างไรจึงเป็นค่านั้น จะได้สะดวกในการทำความเข้าใจครับ

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#5

by p_d » Mon Sep 05, 2016 8:18 am

เรียนคุณ snasui

แนบไฟล์ใหม่ให้แล้วค่ะ รบกวนแนะนำด้วยค่ะ

ขอบคุณค่ะ
p_d
Attachments
vendor_RD.xlsm
(23.23 KiB) Downloaded 19 times

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#4

by snasui » Fri Sep 02, 2016 6:02 pm

:D แนบ Code มาในไฟล์ด้วยจะได้ช่วยทดสอบให้ได้ ไฟล์ที่จะแนบ Code ได้ต้องมีนามสกุลเป็น .xlsm เป็นอย่างน้อยครับ

Re: แนะนำการเขียน code VB การในข้อมูลมาใส่ตารางที่มี

#3

by p_d » Fri Sep 02, 2016 9:32 am

คุณ snasui

ขอโทษค่ะที่ผิดกฎ :| ดิฉันได้ลองค้นหา code และนำมาประยุกต์ใช้กับงานนี้ แต่ผลที่ได้คือ ถ้าตรงกับวันที่ใดมันก็จะใส่ให้กับทุก part code เลยค่ะ
รบกวนช่วยดู code ตามนี้ค่ะ

Code: Select all

Sub CopyPartCode()
    Dim nvalue As Long
    Application.ScreenUpdating = False
    Range("A1").Select
    nrow = 4
    Do Until ActiveCell.Offset(1, 0).Value = ""
            With ActiveCell
                    If Len(ActiveCell.Value) = 13 Then
                            Sheets("schedule").Cells(nrow, 1).Value = .Value
                            Set arange = Range(ActiveCell.Offset(1, 6), ActiveCell.Offset(1, 6).End(xlDown))
                            For Each a In arange
                                    tvalue = Left(a.Value, 2)
                                    If tvalue = "" Then Exit For
                                    nvalue = Left(a.Value, 2)
                                    For Each b In Sheets("schedule").Range("c2:ag2")
                                            If nvalue = b.Value Then
                                                Sheets("schedule").Cells(nrow, nvalue + 2).Value = "D"
                                                Exit For
                                            End If
                                    Next b
                            Next a
                            ActiveCell.Offset(1, 0).Select
                            nrow = nrow + 1
                        Else
                            ActiveCell.Offset(1, 0).Select
                    End If
            End With
    Loop
     MsgBox ("Process Completed!")
     Sheets("schedule").Select
End Sub
Attachments
vendor_RD.xlsx
(15.43 KiB) Downloaded 24 times

Top