Vầy thử xem:Xin chào các anh chị GPE !
Tôi có nhu cầu cần copy số liệu từ cột dọc chuyển thành cột khác ứng với điều kiện giá trị >0 và đúng với ký hiệu của đơn vị. Nhờ mọi người giúp đỡ. Xin cảm ơn ! (có file gửi kèm theo)
Sub Test()
Dim Clls As Range, ColRng As Range
For Each Clls In Sheet1.Range("C2:C1000").SpecialCells(2)
Set ColRng = Sheet1.Range("E1:J1").Find(Clls.Offset(, 1), , xlValues, xlWhole)
If Not ColRng Is Nothing Then Sheet1.Cells(Clls.Row, ColRng.Column) = Clls
Next
End Sub
Vầy thử xem:
Xin cảm ơn ndu96081631 ! Tôi đã thử code của anh ở file trích dẫn, kết quả đã được như ý. Rất cảm ơn anh đã giúp đỡ. Tôi đang vận dụng vào file dữ liệu gốc. Anh cho tôi hỏi thêm: có thể dùng thêm 1 cách bằng hàm được không ? file dữ liệu gốc của tôi đã dùng khá nhiều macro rồi.PHP:Sub Test() Dim Clls As Range, ColRng As Range For Each Clls In Sheet1.Range("C2:C1000").SpecialCells(2) Set ColRng = Sheet1.Range("E1:J1").Find(Clls.Offset(, 1), , xlValues, xlWhole) If Not ColRng Is Nothing Then Sheet1.Cells(Clls.Row, ColRng.Column) = Clls Next End Sub
Vầy thử xem:
Xin cảm ơn ndu96081631 ! Tôi đã thử code của anh ở file trích dẫn, kết quả đã được như ý. Rất cảm ơn anh đã giúp đỡ. Tôi đang vận dụng vào file dữ liệu gốc. Anh cho tôi hỏi thêm: có thể dùng thêm 1 cách bằng hàm được không ? file dữ liệu gốc của tôi đã dùng khá nhiều macro rồi.
Option Base 1
''__________________________________________
Sub abc()
Dim Dic As Object, ArrC, ArrKQ, EndR As Long
Set Dic = CreateObject("Scripting.Dictionary")
EndR = [a65000].End(xlUp).Row
ArrC = [C2].Resize(EndR - 1, 2)
ReDim ArrKQ(EndR - 1, 6)
For i = 1 To 6
Dic.Add [E1].Offset(0, i - 1).Value, i
Next
For i = 1 To EndR - 1
ArrKQ(i, Dic.Item(ArrC(i, 2))) = ArrC(i, 1)
Next
Range("E2").Resize(EndR - 1, 6) = ArrKQ
End Sub
Cách 1: công thức
E2=IF($D2=E$1,$C2,0)
hoặc
E2=($D2=E$1)*$C2
Fill xuống và ngang
Cách 2: pivot table
Đúng là có sự nhầm lẫn, mình xin lỗi ! Khi thử ở file trích dẫn thì được nhưng khi lắp vào file dữ liệu gốc(file đang làm viêc) thì có nhầm lẫn. Tôi đã kiểm tra và sửa lại được rồi. Xin cảm ơn anh ! Nhân tiện cho tôi hỏi thêm:Thật lạ nhỉ? Anh có chú ý các dấu $ không? Hay là sau khi filter, dòng đầu không phải dòng 2 và anh không thay tham chiếu dòng $D2 và $C2?
Sub def()
Dim EndR As Long
EndR = [a65000].End(xlUp).Row
Range("e2:J" & EndR).SpecialCells(12).FormulaR1C1 = _
"=(RC4=R1C)*RC3"
End Sub
Vầy thử xem:
Xin cảm ơn ndu96081631 ! Tôi đã thử code của anh ở file trích dẫn, kết quả đã được như ý. Rất cảm ơn anh đã giúp đỡ. Tôi đang vận dụng vào file dữ liệu gốc. Anh cho tôi hỏi thêm: có thể dùng thêm 1 cách bằng hàm được không ? file dữ liệu gốc của tôi đã dùng khá nhiều macro rồi.PHP:Sub Test() Dim Clls As Range, ColRng As Range For Each Clls In Sheet1.Range("C2:C1000").SpecialCells(2) Set ColRng = Sheet1.Range("E1:J1").Find(Clls.Offset(, 1), , xlValues, xlWhole) If Not ColRng Is Nothing Then Sheet1.Cells(Clls.Row, ColRng.Column) = Clls Next End Sub
@ anh Long, Code của Ndu là quá ngon rồi (ngắn gọn, chạy nhanh, kết quả chính xác). Chỉ có điều khi vận dụng, anh phải sửa tên Sheet1 trong code thành tên Sheet... thực tế của anh làm là OK.
Thử dùng Dic và mảng, áp dụng Dic.Item(i), để không xài lại quên nữa. Vả lại, nếu dữ liệu rất nhiều, dùng mảng sẽ nhanh hơn.
PHP:Option Base 1 ''__________________________________________ Sub abc() Dim Dic As Object, ArrC, ArrKQ, EndR As Long Set Dic = CreateObject("Scripting.Dictionary") EndR = [a65000].End(xlUp).Row ArrC = [C2].Resize(EndR - 1, 2) ReDim ArrKQ(EndR - 1, 6) For i = 1 To 6 Dic.Add [E1].Offset(0, i - 1).Value, i Next For i = 1 To EndR - 1 ArrKQ(i, Dic.Item(ArrC(i, 2))) = ArrC(i, 1) Next Range("E2").Resize(EndR - 1, 6) = ArrKQ End Sub
...
(trong sub của macro tôi bỏ đoạn Option Base 1 do Excel 2007 của tôi không chịu) kết quả là khi macro thực hiện xong Sub đó thì cột E không có kết quả-d1 không có số liệu. Các dòng khác bị chuyển dịch xuông 1 dòng (vẫn copy được số liệu