Cho mình hỏi thêm là cột số 3 (Cột So) là cột chứa text hay là số vậy bạn ?Dear All
Mình có một bảng có 3 cột: cột thứ nhất là tên, cột thứ hai là loại cột thứ 3 là nội dung
Mình muốn chuyển thành một bảng có cột thứ nhất là tên các cột tiếp theo là lần lượt các loại
Các bác giúp giùm minh nha
Hỏi lại:Dear All
Mình có một bảng có 3 cột: cột thứ nhất là tên, cột thứ hai là loại cột thứ 3 là nội dung
Mình muốn chuyển thành một bảng có cột thứ nhất là tên các cột tiếp theo là lần lượt các loại
Các bác giúp giùm minh nha
Nếu cùng tên thì sẽ không có loại trùng nhauHỏi lại:
- Có trường hợp nào trùng TÊN và LOẠI hay không?
- Nếu có trường hợp này thì số lượng có được cộng dồn hay không?
Ẹc... Ẹc... Doom hỏi vậy chắc định dùng PivotTable đây (nếu cột D toàn Number)Cho mình hỏi thêm là cột số 3 (Cột So) là cột chứa text hay là số vậy bạn ?
Làm thử cho bạn bằng công thức đây!Nếu cùng tên thì sẽ không có loại trùng nhau
Ẹc... Ẹc... Doom hỏi vậy chắc định dùng PivotTable đây (nếu cột D toàn Number)
---------------------------------
Làm thử cho bạn bằng công thức đây!
Xem file
(Bài này dùng VBA thì khỏe hơn)
Vì đó là công thức mảng ---> Phải Ctrl + Shift + Enter mới được (Enter sẽ lổi)Cám ơn bạn nhiều, nhưng sa minh click vô coi công thứ sau do enter thì nó lại lổi vậy???
---(Bài này dùng VBA thì khỏe hơn)
Hay quá cám ơn bạn nhiều!!!!Vì đó là công thức mảng ---> Phải Ctrl + Shift + Enter mới được (Enter sẽ lổi)
Anh thử file này xem---
Làm cho anh học được không chú?
Sub Test()
Dim Des As Range, Src As Range, Clls As Range, Tmp1 As String, Tmp2 As String
Dim Title1 As Range, Title2 As Range, Title3 As Range
On Error GoTo ExitSub
Set Des = Application.InputBox("Chon cell dau tien, noi dat du lieu", Type:=8)
Set Src = Application.InputBox("Chon vung du lieu goc", Type:=8)
Set Title1 = Src.Offset(0, 0).Resize(, 1)
Set Title2 = Src.Offset(0, 1).Resize(, 1)
Set Title3 = Src.Offset(0, 2).Resize(, 1)
Des.Resize(UBound(UniqueList(Title1)) + 1).Value = WorksheetFunction.Transpose(UniqueList(Title1))
Des.Resize(, UBound(UniqueList(Title2)) + 1).Value = UniqueList(Title2)
With Des.CurrentRegion
For Each Clls In Intersect(.Cells, .Offset(1, 1))
Tmp1 = Intersect(Des.EntireColumn, Clls.EntireRow).Address
Tmp2 = Intersect(Des.EntireRow, Clls.EntireColumn).Address
Clls.Value = Evaluate("INDEX(" & Title3.Address & ",Match(" & Tmp1 & "&" & Tmp2 & "," & Title1.Address & "&" & Title2.Address & ",0))")
[COLOR=Blue][B] If IsError(Clls) Then
Clls.Value = ""
End If[/B][/COLOR]
Next
Des = Title1(1, 1)
End With
ExitSub:
End Sub
Sub Transfer()
Dim Des As Range, Src As Range, Clls As Range
Dim Dic1, Dic2, i As Long, j As Long
On Error GoTo ExitSub
Set Dic1 = CreateObject("Scripting.Dictionary")
Set Dic2 = CreateObject("Scripting.Dictionary")
Set Src = Application.InputBox("Chon vung du lieu goc, bao gom ca tieu de", Type:=8)
Set Des = Application.InputBox("Chon cell dau tien, noi dat du lieu", Type:=8)(1, 1)
For Each Clls In Intersect(Src, Src.Offset(1)).Resize(, 1)
If Not Dic1.Exists(Clls(, 1).Value) Then
i = i + 1: Dic1.Add Clls(, 1).Value, i
Des.Offset(i) = Clls(, 1)
End If
If Not Dic2.Exists(Clls(, 2).Value) Then
j = j + 1: Dic2.Add Clls(, 2).Value, j
Des.Offset(, j) = Clls(, 2)
End If
Des.Offset(Dic1.Item(Clls(, 1).Value), Dic2.Item(Clls(, 2).Value)) = Clls(, 3)
Next
Des = Src(1, 1)
ExitSub:
End Sub
Sub Transfer()
Dim Des As Range, Src As Range, Clls As Range
Dim Dic1, Dic2, i As Long, j As Long, Arr(100, 100)
On Error GoTo ExitSub
Set Dic1 = CreateObject("Scripting.Dictionary")
Set Dic2 = CreateObject("Scripting.Dictionary")
Set Src = Application.InputBox("Chon vung du lieu goc, bao gom ca tieu de", Type:=8)
Set Des = Application.InputBox("Chon cell dau tien, noi dat du lieu", Type:=8)
Arr(0, 0) = Src(1, 1)
For Each Clls In Intersect(Src, Src.Offset(1)).Resize(, 1)
If Not Dic1.Exists(Clls(, 1).Value) Then
i = i + 1: Dic1.Add Clls(, 1).Value, i
Arr(i, 0) = Clls(, 1)
End If
If Not Dic2.Exists(Clls(, 2).Value) Then
j = j + 1: Dic2.Add Clls(, 2).Value, j
Arr(0, j) = Clls(, 2)
End If
Arr(Dic1.Item(Clls(, 1).Value), Dic2.Item(Clls(, 2).Value)) = Clls(, 3)
Next
Des.Resize(Dic1.Count + 1, Dic2.Count + 1).Value = Arr
ExitSub:
End Sub
Code trên dùng ít nhất là 3 lần lập: 1 lần trong code chính và 2 lần trong UDF ---> Tôi cảm thấy như vậy là quá thừa
Cải tiến lần nữa, dùng duy nhất 1 lần lập và không cần sự trợ giúp của hàm tự tạo
1> Đây là phương pháp thông thường: Tìm đến đâu, điền dữ liệu đến nấy
2> Đây là phương pháp dùng mảng nạp toàn bộ dữ liệu tìm được vào mảng, cuối cùng gán mảng vào vùng kết quảPHP:Sub Transfer() Dim Des As Range, Src As Range, Clls As Range Dim Dic1, Dic2, i As Long, j As Long On Error GoTo ExitSub Set Dic1 = CreateObject("Scripting.Dictionary") Set Dic2 = CreateObject("Scripting.Dictionary") Set Src = Application.InputBox("Chon vung du lieu goc, bao gom ca tieu de", Type:=8) Set Des = Application.InputBox("Chon cell dau tien, noi dat du lieu", Type:=8)(1, 1) For Each Clls In Intersect(Src, Src.Offset(1)).Resize(, 1) If Not Dic1.Exists(Clls(, 1).Value) Then i = i + 1: Dic1.Add Clls(, 1).Value, i Des.Offset(i) = Clls(, 1) End If If Not Dic2.Exists(Clls(, 2).Value) Then j = j + 1: Dic2.Add Clls(, 2).Value, j Des.Offset(, j) = Clls(, 2) End If Des.Offset(Dic1.Item(Clls(, 1).Value), Dic2.Item(Clls(, 2).Value)) = Clls(, 3) Next Des = Src(1, 1) ExitSub: End Sub
Ai rảnh rổi hãy thử nghiệm xem phương pháp dùng mảng có nhanh hơn không nha!PHP:Sub Transfer() Dim Des As Range, Src As Range, Clls As Range Dim Dic1, Dic2, i As Long, j As Long, Arr(100, 100) On Error GoTo ExitSub Set Dic1 = CreateObject("Scripting.Dictionary") Set Dic2 = CreateObject("Scripting.Dictionary") Set Src = Application.InputBox("Chon vung du lieu goc, bao gom ca tieu de", Type:=8) Set Des = Application.InputBox("Chon cell dau tien, noi dat du lieu", Type:=8) Arr(0, 0) = Src(1, 1) For Each Clls In Intersect(Src, Src.Offset(1)).Resize(, 1) If Not Dic1.Exists(Clls(, 1).Value) Then i = i + 1: Dic1.Add Clls(, 1).Value, i Arr(i, 0) = Clls(, 1) End If If Not Dic2.Exists(Clls(, 2).Value) Then j = j + 1: Dic2.Add Clls(, 2).Value, j Arr(0, j) = Clls(, 2) End If Arr(Dic1.Item(Clls(, 1).Value), Dic2.Item(Clls(, 2).Value)) = Clls(, 3) Next Des.Resize(Dic1.Count + 1, Dic2.Count + 1).Value = Arr ExitSub: End Sub
------------------------------
Gữi Domfootwear: Dữ liệu giả lập bạn đưa trong file là chưa hợp lý nha! Ngay từ đầu tôi đã hỏi và tác giả cũng đã khẳng định rằng không có dữ liệu trùng ---> Vì nếu có dữ liệu trùng thì làm sao TỔNG HỢP được
Tóm lại: Có thể thiếu 1 Item nào đó nhưng không thể có chuyện TRÙNG
Hỏi lại:
- Có trường hợp nào trùng TÊN và LOẠI hay không?
- Nếu có trường hợp này thì số lượng có được cộng dồn hay không?
---
Làm cho anh học được không chú?