Page 1 of 1
separate ข้อมูล โดย VB
Posted: Fri Jul 15, 2011 2:08 pm
by dannyb
เรียนคุณคนควนครับ
ขอรบกวนเขียน code VB แยกข้อมูลจากไฟล์ excel โดยต้องการให้อยู่ไฟล์เดิม แต่แยก sheet ตาม w/h ลองดู post ก่อนๆ ที่คนอื่นๆปรึกษา
แล้วลองปรับ range ดู แต่ข้อมูลไม่ขึ้นตามที่ต้องการ (ผมไม่มีความรู้เรื่อง VB เลย) และถ้าต้องการแก้ไข range ข้อมูล พอแนะนำได้ไหมครับ
ว่าควรปรับตรงไหนครับ
ข้อมูลตามไฟล์แนบครับขอบคุณล่วงหน้าครับ
Re: separate ข้อมูล โดย VB
Posted: Fri Jul 15, 2011 3:40 pm
by snasui
ไม่พบ Code ในไฟล์แนบครับ
กรณีต้องการทำรายงานแยกชีทตาม w/h สามารถใช้ PivotTable มาช่วยได้ครับ
ดูตัวอย่างที่นี่ครับ
http://www.snasui.com/viewtopic.php?p=7205#p7205
Re: separate ข้อมูล โดย VB
Posted: Fri Jul 15, 2011 9:09 pm
by dannyb
ส่งไฟล์มาให้ใหม่แล้วครับ...ที่ไม่ทำ pivot เนื่องจากข้อมูลที่ให้เป็นข้อมูลดิบ ที่ต้องเอาไปทำงานต่อ..
ข้อมูลที่ export ออกมาจะปนๆกัน ต้องเสียเวลาในการ sort, filter, copy ซึ่งมีประมาณ 100 w/h
และข้อมูลที่แยกออกมาจะต้องนำไปคำนวณต่อ ซึ่งทำ pivot แล้วก็ต้องเสียเวลาในการ copy อยู่ดีครับ
รบกวนด้วย... code ที่ใส่มา copy มาจากกระทู้อื่น..ซึ่งลองปรับแล้วมันไม่มีอะไรเกิดขึ้นเลย
ขอบคุณครับ
Re: separate ข้อมูล โดย VB
Posted: Fri Jul 15, 2011 9:10 pm
by dannyb
ลืมส่งไฟล์
Re: separate ข้อมูล โดย VB
Posted: Fri Jul 15, 2011 10:23 pm
by snasui
ลองดู Code ตามด้านล่าง
Code: Select all
Sub SeparateData()
Dim a() As Variant, rAllrange As Range
Dim rAll As Range, rp As Range, rf As Range
Dim r As Range, count As Long
Dim lng As Long, i As Integer
On Error Resume Next
Application.DisplayAlerts = False
Application.ScreenUpdating = False
With Worksheets("Sheet1")
Set rAll = .Range("A3", .Range("A" & Rows.count).End(xlUp))
Set rp = .Range("A3")
Set rAllrange = .Range("A2", .Range("F" & Rows.count).End(xlUp))
Set rf = .Range("H2")
End With
For Each r In rAll
count = count + 1
Set rp = rp.Resize(count, 1)
If Application.CountIf(rp, r) = 1 Then
ReDim Preserve a(lng)
a(lng) = r
lng = lng + 1
End If
Next r
For i = LBound(a) To UBound(a)
rf = a(i)
rAllrange.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range _
("H1:H2")
rAllrange.SpecialCells(xlCellTypeVisible).Copy
Sheets.Add After:=Sheets(Sheets.count)
Sheets(Sheets.count).Name = a(i)
If Err <> 0 Then
MsgBox "Check your sheet's name"
ActiveSheet.Delete
Sheets("Sheet1").ShowAllData
Exit Sub
End If
ActiveSheet.Range("A1").PasteSpecial xlPasteValues
Sheets("Sheet1").Activate
Next i
Sheets("Sheet1").ShowAllData
Application.CutCopyMode = False
Application.ScreenUpdating = True
MsgBox "Finish"
End Sub
ดูไฟล์แนบประกอบครับ
Re: separate ข้อมูล โดย VB
Posted: Sat Jul 16, 2011 11:01 am
by dannyb
กราบขอบพระคุณงามๆครับ...
พอจะอธิบาย code ให้ผมเข้าใจแบบง่ายๆได้ไหมครับ..
Re: separate ข้อมูล โดย VB
Posted: Sat Jul 16, 2011 11:08 am
by snasui
dannyb wrote:กราบขอบพระคุณงามๆครับ...
พอจะอธิบาย code ให้ผมเข้าใจแบบง่ายๆได้ไหมครับ..
อธิบายหลักการแทนนะครับ
1. ต้องหาก่อนว่าในคอลัมน์ A มีกี่ค่าที่ต่างกัน เก็บค่านั้นไว้ก่อน
2. นำค่าที่เก็บนั้นมาทำการ Filter จากข้อมูลใน Sheet1
3. หลังจากได้ข้อมูลจากข้อ 2 แล้วก็ให้เพิ่มชีท โดยใช้ชื่อชีทตามค่าในข้อ 1
4. นำข้อมูลที่ได้ในข้อ 3 ไปวาง
5. ทำแบบนี้ไปเรื่อย ๆ จนครบทุกค่าที่เก็บไว้ตามข้อ 1
6. เมื่อทำครบแล้วให้แสดงข้อความ Finish
7. กรณีพบว่ามีชื่อชีทอยู่แล้วให้แสดงข้อความว่าให้ตรวจสอบชื่อชีท
Re: separate ข้อมูล โดย VB
Posted: Tue Jul 19, 2011 10:05 pm
by dannyb
คุณคนควนครับ...
มีปัญหาอีกแล้วครับ...ข้อมูลที่ต้องการอยู่ในไฟล์แนบครับ...
กราบขอบพระคุณล่วงหน้างามๆครับ..
Re: separate ข้อมูล โดย VB
Posted: Tue Jul 19, 2011 10:25 pm
by snasui
โอกาสหน้าการทำตัวอย่างควรเป็นตัวแทนของข้อมูลจริงครับ เว้นเสียจากว่าเข้าใจ Code VBA สามารถปรับแก้เองได้ สำหรับมือใหม่แล้ว Code พวกนี้เข้าใจไม่ง่ายนัก ซึ่งผมต้องขออภัยที่ไม่สามารถอธิบายอย่างละเอียด เนื่องจากไม่มีเวลาขนาดนั้นครับ
กรณีมีคำถามเพิ่มหรือคำอธิบายเพิ่มเติม ช่วยเขียนหรือ Copy ลงมาในฟอรัมนี้พอสังเขปด้วยครับว่าต้องการทำอะไร อย่างไร ส่วนรายละเอียดเขียนไว้ในไฟล์นั้นถูกต้องแล้วครับ การเขียนไว้ในฟอรัมด้วยจะอำนวยประโยชน์ในการ Search ของเพื่อน ๆ ครับ
คำถาม
1. กรณีไม่ลบชีท หากมีการ Update จะให้ข้อมูลต่อจากข้อมูลเดิมหรือแสดงอย่างไรครับ
2. กรณีต้องการ Clean Data วันที่ จะมีรูปแบบข้อความอยู่ในวงเล็บเสมอไปและต้องการลบข้อความรวมทั้งวงเล็บทิ้งไปใช่หรือไม่ครับ
Re: separate ข้อมูล โดย VB
Posted: Wed Jul 20, 2011 9:37 am
by dannyb
1. ข้อมูลจะถูกวางทับที่เดิมครับ..เพียงแต่ว่ามีข้อมูลเพิ่มขึ้น row เพิ่ม
แต่ column ไม่เพิ่ม
2. format วันที่ไม่รบกวนละนะครับ
Re: separate ข้อมูล โดย VB
Posted: Wed Jul 20, 2011 7:28 pm
by snasui
ผมปรับ Code มาให้ใหม่ตามด้านล่าง
Code: Select all
Sub SeparateData()
Dim a() As Variant, rAllrange As Range
Dim rAll As Range, rp As Range, rf As Range
Dim r As Range, count As Long
Dim lng As Long, i As Integer, j As Integer
Dim wh As Worksheet
Application.DisplayAlerts = False
Application.ScreenUpdating = False
ClearAllSheets
SortCashData
With Worksheets("cash")
Set rAll = .Range("B3", .Range("B" & Rows.count).End(xlUp))
Set rp = .Range("B3")
Set rAllrange = .Range("A2", .Range("F" & Rows.count).End(xlUp))
Set rf = .Range("I3")
End With
For Each r In rAll
count = count + 1
Set rp = rp.Resize(count, 1)
If Application.CountIf(rp, r) = 1 Then
ReDim Preserve a(lng)
a(lng) = r
lng = lng + 1
End If
Next r
For i = LBound(a) To UBound(a)
rf = a(i)
For Each wh In Worksheets
If wh.Name = a(i) Then
j = j + 1
End If
Next wh
If j = 0 Then
Sheets.Add After:=Sheets(Sheets.count)
Sheets(Sheets.count).Name = a(i)
End If
Sheets("cash").Activate
rAllrange.AdvancedFilter Action:=xlFilterInPlace, CriteriaRange:=Range _
("I2:I3")
rAllrange.SpecialCells(xlCellTypeVisible).Copy
Worksheets(a(i)).Range("A1").PasteSpecial xlPasteValues
Sheets("cash").Activate
j = 0
Next i
Sheets("cash").ShowAllData
Application.CutCopyMode = False
Application.ScreenUpdating = True
MsgBox "Finish"
End Sub
Sub SortCashData()
Dim r As Range
Set r = Worksheets("cash").Range("A2").CurrentRegion
With r
.Sort Key1:=.Range("B1"), Order1:=xlAscending, Key2:=.Range("C1") _
, Order2:=xlAscending, Key3:=.Range("A1"), Order3:=xlAscending, Header:= _
xlGuess
End With
End Sub
Sub ClearAllSheets()
Dim wh As Worksheet
For Each wh In Worksheets
If wh.Name <> "cash" Then
wh.Cells.Clear
End If
Next wh
End Sub
ดูไฟล์แนบประกอบครับ