truonghagpex
Thành viên mới

- Tham gia
- 24/9/08
- Bài viết
- 31
- Được thích
- 1
Bạn xem trong file kèm nhé.chào các anh chị em hiện đang vướng mắc đoạn code sau mà không tìm được ai giúp, anh chị giúp em làm hộ nhé. em xin cảm ơn nhiều.
EM GỮI KÈM THEO PHAI ĐỂ CÁC ANH XEM HỘ EM NHÉ
Option Explicit
Sub TimAndCopy()
Dim Rng As Range, sRng As Range, Clls As Range
Dim MyColor As Byte, eRw As Long
Sheets("sheet2").Select: MyColor = [E1].Interior.ColorIndex
Set Rng = Range([d1], [iV1].End(xlToLeft))
eRw = [C65500].End(xlUp).Row
[E2].Resize(eRw, Rng.Columns.Count - 1).ClearContents
For Each Clls In Range("C2:C" & eRw)
Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole)
If sRng Is Nothing Then
Clls.Interior.ColorIndex = 42 'Tô màu Chung Loai Chua Có'
Else
Cells(Clls.Row, sRng.Column).Value = Clls.Offset(, 1).Value
End If
Next Clls
Rng.Offset(, 1).Interior.ColorIndex = IIf(MyColor < 42, MyColor + 1, 34)
End Sub
---(Mình mong rằng sẽ không cần đưa file đính kèm lên!)PHP:Option Explicit Sub TimAndCopy() Dim Rng As Range, sRng As Range, Clls As Range Dim MyColor As Byte, eRw As Long Sheets("sheet2").Select: MyColor = [E1].Interior.ColorIndex Set Rng = Range([d1], [iV1].End(xlToLeft)) eRw = [C65500].End(xlUp).Row [E2].Resize(eRw, Rng.Columns.Count - 1).ClearContents For Each Clls In Range("C2:C" & eRw) Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole) If sRng Is Nothing Then Clls.Interior.ColorIndex = 42 'Tô màu Chung Loai Chua Có' Else Cells(Clls.Row, sRng.Column).Value = Clls.Offset(, 1).Value End If Next Clls Rng.Offset(, 1).Interior.ColorIndex = IIf(MyColor < 42, MyColor + 1, 34) End Sub
Chúc bạn thành công!
Nếu là lọc duy nhất thì trên GPE đã có hàng đóng bài rồi ---> Dùng Dictionary Object là nhanh nhất---
Em có đọc bài 1 của bạn truonghagpex, nếu em hiểu không sai thì ý tác giả muốn bẻ ngang cột C (từ C2...C) chuyển thành hàng ngang và duy nhất tính từ E1, F1...đồng thời trich số phát sinh giống hình thức bảng kê trong kế toán. File của anh thì hình như tiêu đề E1, F1... là có sẳn. Em không hiểu ý anh lắm, mong anh gởi file đính kèm
Trân trọng.
Function Dsach(Rng As Range, Idx As Long) As String
Dim kq
Dim Cll As Range
Dim Ch, Tam As String
Application.Volatile
For Each Cll In Rng.Cells
If InStr(1, Ch, Cll.Text) = 0 Then Ch = Ch & Cll.Text & ";"
Next
Ch = Left(Ch, Len(Ch) - 1)
kq = Split(Ch, ";")
If Idx > UBound(kq) Then Dsach = "": Exit Function
For i = 0 To UBound(kq) - 1
For j = i + 1 To UBound(kq)
Tam = kq(i)
If Tam > kq(j) Then
kq(i) = kq(j)
kq(j) = Tam
End If
Next j, i
Dsach = kq(Idx)
End Function
=dsach($A$2:$A$50,COLUMN()-3)
Lọc duy nhất mà dùng InStr là không ổn đâu anh à!Mình tham gia cách dùng hàm UDF:
Cú pháp:PHP:Function Dsach(Rng As Range, Idx As Long) As String Dim kq Dim Cll As Range Dim Ch, Tam As String Application.Volatile For Each Cll In Rng.Cells If InStr(1, Ch, Cll.Text) = 0 Then Ch = Ch & Cll.Text & ";" Next Ch = Left(Ch, Len(Ch) - 1) kq = Split(Ch, ";") If Idx > UBound(kq) Then Dsach = "": Exit Function For i = 0 To UBound(kq) - 1 For j = i + 1 To UBound(kq) Tam = kq(i) If Tam > kq(j) Then kq(i) = kq(j) kq(j) = Tam End If Next j, i Dsach = kq(Idx) End Function
=Dsach(Vùng mã,chỉ số)
Chỉ số bắt đầu từ 0
Ví dụ từ ô C7 bắt đầu Danh sách lập công thức, rồi chép sang các ô khác:
PHP:=dsach($A$2:$A$50,COLUMN()-3)
---Mình tham gia cách dùng hàm UDF:
Cú pháp:
=Dsach(Vùng mã,chỉ số)
Chỉ số bắt đầu từ 0
Ví dụ từ ô C7 bắt đầu Danh sách lập công thức, rồi chép sang các ô khác:
PHP:=dsach($A$2:$A$50,COLUMN()-3)
ndu96081631 đã viết:Nếu là lọc duy nhất thì trên GPE đã có hàng đóng bài rồi ---> Dùng Dictionary Object là nhanh nhất
Function Dsach2(Rng As Range, Idx As Long) As String
Dim a, tam
Dim Tg As Object
Dim Cll As Range
Application.Volatile
Set Tg = CreateObject("scripting.dictionary")
For Each Cll In Rng.Cells
If Cll.Text <> "" And Not Tg.exists(Cll.Text) Then Tg.Add Cll.Text, Nothing
Next
If Idx > Tg.Count - 1 Then Dsach2 = "": Exit Function
a = Tg.keys
For i = 0 To Tg.Count - 2
For j = i + 1 To Tg.Count - 1
tam = a(i)
If tam > a(j) Then
a(i) = a(j)
a(j) = tam
End If
Next
Next
Dsach2 = a(Idx)
End Function
Chỉ số có nghĩa là anh cần lấy phần tử thứ mấy trong nguyên cái danh sách duy nhất ấy---
- Em tệ quá nên vẫn không hiểu cú pháp nhập chỉ số như thế nào? ( Đã mò mẫm trên file rồi) mong anh nói rõ.
Chỉ cần 1 vòng lập thôi anh àTo Ndu thân,
Đúng là ý kiến Ndu rất xác đáng và mình bổ xung thêm dùng Dictionary Object.
(Nhưng trong lập trình thì có thể được vì nguyên tắc kỵ trong đặt mã không trùng và không lồng ví dụ A11 và A112. Vấn đề này thường được kiểm tra khi khai báo mã)
PHP:Function Dsach2(Rng As Range, Idx As Long) As String Dim a, tam Dim Tg As Object Dim Cll As Range Application.Volatile Set Tg = CreateObject("scripting.dictionary") For Each Cll In Rng.Cells If Cll.Text <> "" And Not Tg.exists(Cll.Text) Then Tg.Add Cll.Text, Nothing Next If Idx > Tg.Count - 1 Then Dsach2 = "": Exit Function a = Tg.keys For i = 0 To Tg.Count - 2 For j = i + 1 To Tg.Count - 1 tam = a(i) If tam > a(j) Then a(i) = a(j) a(j) = tam End If Next Next Dsach2 = a(Idx) End Function
Function Dsach2(Rng As Range, Idx As Long) As String
Dim Cll As Range
With CreateObject("Scripting.Dictionary")
For Each Cll In Rng.Cells
If Cll.Text <> "" And Not .Exists(Cll.Text) Then
.Add Cll.Text, "": Idx = Idx - 1
If Idx = 0 Then
Dsach2 = Cll: Exit Function
End If
End If
Next
End With
End Function