langkhachquaduong
Thành viên chính thức


- Tham gia
- 23/7/19
- Bài viết
- 50
- Được thích
- 8
Dùng thủ tục đi, hàm sao làm được. Hoặc dùng chức năng Consolidate có sẵn trong Excel cũng được màMình có 1 hàm unique để lọc dữ liệu duy nhất.
Làm cách để khi ta gõ hàm unique vào ô b1 , kết qủa unique là 10 giá trị thì tự động hàm unique gán giá trị xuống ô b1 đến b10.
Nếu bạn dùng phiên bản office 365 thì thậm chí bạn không cần làm gì cả, tự nhiên nó được vậy thôiMình có 1 hàm unique để lọc dữ liệu duy nhất.
Làm cách để khi ta gõ hàm unique vào ô b1 , kết qủa unique là 10 giá trị thì tự động hàm unique gán giá trị xuống ô b1 đến b10.
Function UNIQUE(Rng As Range)
Dim Arr As Variant, Cls As Range
Dim J As Long, K As Long, W As Long
Dim dic As Object
Set dic = CreateObject("Scripting.Dictionary")
ReDim Arr(1 To 2 * Rng.Cells.Count, 1 To 1)
For Each Cls In Rng
J = J + 1
If Not dic.exists(Cls.Value) Then
dic.Add Cls.Value, J
W = W + 1: Arr(W, 1) = Str(Cls.Value)
End If
Next
UNIQUE = Arr()
End Function
Không phải vậy đâu sư phụ à. Ý người ta là làm sao cho nó tự động fill công thức mảng kìa. Như trong video, em gõ công thức vào 1 cell, enter phát là nó tự fill xuống đến hết mà không cần phải quét chọn trước vùng chứa kết quả (mà dù có quét cũng không biết phải quét bao nhiêu ô là đủ)Nếu không có 365 thì xài tạm cái này:
PHP:Function UNIQUE(Rng As Range) Dim Arr As Variant, Cls As Range Dim J As Long, K As Long, W As Long Dim dic As Object Set dic = CreateObject("Scripting.Dictionary") ReDim Arr(1 To 2 * Rng.Cells.Count, 1 To 1) For Each Cls In Rng J = J + 1 If Not dic.exists(Cls.Value) Then dic.Add Cls.Value, J W = W + 1: Arr(W, 1) = Str(Cls.Value) End If Next UNIQUE = Arr() End Function
Loại hàm mảng này tôi đã từng giải thíchn cách dùng rồi.Nếu không có 365 thì xài tạm cái này:
...
Chắc là ý như Video ... VBA thừa sức viết ra và không xài tới API của BillMình có 1 hàm unique để lọc dữ liệu duy nhất.
Làm cách để khi ta gõ hàm unique vào ô b1 , kết qủa unique là 10 giá trị thì tự động hàm unique gán giá trị xuống ô b1 đến b10.
Tìm trên diễn đàn nha, trước đây mình có làm thử theo file trên diễn đàn, chạy chậm quá nên xóa mấtMình có 1 hàm unique để lọc dữ liệu duy nhất.
Làm cách để khi ta gõ hàm unique vào ô b1 , kết qủa unique là 10 giá trị thì tự động hàm unique gán giá trị xuống ô b1 đến b10.
Bạn kiểm tra thử xem,Mình có 1 hàm unique để lọc dữ liệu duy nhất.
Làm cách để khi ta gõ hàm unique vào ô b1 , kết qủa unique là 10 giá trị thì tự động hàm unique gán giá trị xuống ô b1 đến b10.
Option Explicit
Public RangesToExpand As New Collection
Private Sub Workbook_SheetCalculate(ByVal Sh As Object)
Dim oneCell As Range
Dim strFormula
Application.EnableEvents = False
For Each oneCell In RangesToExpand
With oneCell
strFormula = .Cells(1, 1).FormulaArray
.CurrentRegion.ClearContents
.FormulaArray = strFormula
RangesToExpand.Remove .Address(, , , True)
End With
Next oneCell
Application.EnableEvents = True
End Sub
Function UNIQUES_COL(rng As Range) As Variant()
Dim list As New Collection
Dim Ulist() As Variant
Dim Value, i As Long
On Error Resume Next
For Each Value In rng
list.Add CStr(Value), CStr(Value)
Next
On Error GoTo 0
ReDim Ulist(list.Count - 1, 0)
For i = 0 To list.Count - 1
Ulist(i, 0) = list(i + 1)
Next
If TypeName(Application.Caller) = "Range" Then
If Application.EnableEvents Then
With Application.Caller
If .Rows.Count <> i Or .Columns.Count <> 1 Then
If ThisWorkbook.RangesToExpand Is Nothing Then
Set ThisWorkbook.RangesToExpand = New Collection
End If
With .Resize(i, 1)
ThisWorkbook.RangesToExpand.Add item:=.Cells, Key:=.Address(, , , True)
End With
End If
End With
End If
End If
UNIQUES_COL = Ulist
End Function
=UNIQUES_COL($A$1:$A$13)
TransposeArray = ResizeArray(Total)
Mình đã text thử ok đó.Bạn kiểm tra thử xem,
Bỏ đoạn này vào ThisWorkbook module:
Mã:Option Explicit Public RangesToExpand As New Collection Private Sub Workbook_SheetCalculate(ByVal Sh As Object) Dim oneCell As Range Dim strFormula Application.EnableEvents = False For Each oneCell In RangesToExpand With oneCell strFormula = .Cells(1, 1).FormulaArray .CurrentRegion.ClearContents .FormulaArray = strFormula RangesToExpand.Remove .Address(, , , True) End With Next oneCell Application.EnableEvents = True End Sub
Bỏ đoạn này vào Module có tên "FUNCUNIQUE" hoặc một module mới.
Mã:Function UNIQUES_COL(rng As Range) As Variant() Dim list As New Collection Dim Ulist() As Variant Dim Value, i As Long On Error Resume Next For Each Value In rng list.Add CStr(Value), CStr(Value) Next On Error GoTo 0 ReDim Ulist(list.Count - 1, 0) For i = 0 To list.Count - 1 Ulist(i, 0) = list(i + 1) Next If TypeName(Application.Caller) = "Range" Then If Application.EnableEvents Then With Application.Caller If .Rows.Count <> i Or .Columns.Count <> 1 Then If ThisWorkbook.RangesToExpand Is Nothing Then Set ThisWorkbook.RangesToExpand = New Collection End If With .Resize(i, 1) ThisWorkbook.RangesToExpand.Add item:=.Cells, Key:=.Address(, , , True) End With End If End With End If End If UNIQUES_COL = Ulist End Function
Gõ vào F1:
Mã:=UNIQUES_COL($A$1:$A$13)
Bác nhớ từ khóa tên gì không em muốn kham khảo.Tìm trên diễn đàn nha, trước đây mình có làm thử theo file trên diễn đàn, chạy chậm quá nên xóa mất
xem video bài số 4 Anh ý xài 365 đấy không quét chọn đối số của hàm thì chỉ có nước gõ vào thôi bạn ợTrong Excel 365 thì hàm Unique nó tự động điền xuống dưới luôn, không cần phải quét chọn toàn bộ ô trước khi gõ hàm.
Em nhầm, bác Quote nhanh quá, em đang xài 365 nên có cái hàm nàyxem video bài số 4 Anh ý xài 365 đấy không quét cho đối số của hàm thì chỉ có nước gõ vào thôi bạn ợ
Bạn thử lấy code phía trên bỏ vô module chạy.Gõ vào 1 ô thì tự điền công thức giống như hàm unique 365Trong Excel 365 thì hàm Unique nó tự động điền xuống dưới luôn, không cần phải quét chọn toàn bộ ô trước khi gõ hàm.
Hàm 365 là hàm có trên 1 Cells thôi nhé bạn ... còn hàm đó là mảng rùi thử xóa vài cells trong hàm xem nó ko cho xóa đâuBạn thử lấy code phía trên bỏ vô module chạy.Gõ vào 1 ô thì tự điền công thức giống như hàm unique 365
Dạ đúng rồi này phải xoá luôn 1 mảng.Hàm 365 là hàm có trên 1 Cells thôi nhé bạn ... còn hàm đó là mảng rùi thử xóa vài cells trong hàm xem nó ko cho xóa đâu
SQL này em thấy cũng hay nhưng chưa đụng đến .Làm báo cáo lấy dữ liệu cực kỳ nhanh.Các Bạn cố giắng mà học cách điền kết quả ra Sheet kiểu Office 365 đi sẻ rất hay đấy ... Ngay cả khi Bạn xài Office 365 mà một số hàm Bill không hổ trợ thì viết lấy mà xài cho khỏe VD như: xài ADO lấy dữ liệu file Access Or Excel thì viết ADO bình thường như những hàm khác xong truyền SQL vào gõ trên Cells cái cộp là xong .... Minh họa như hình sau ( làm biếng úp Video lắm )
Nếu kẹt nữa thì Atools cũng là 1 giải pháp tốt cho Bạn
View attachment 246257
ADO là COM của Windows, đâu phải hệ thống nào cũng xài được.Các Bạn cố giắng mà học cách điền kết quả ra Sheet kiểu Office 365 đi sẻ rất hay đấy ... Ngay cả khi Bạn xài Office 365 mà một số hàm Bill không hổ trợ thì viết lấy mà xài cho khỏe VD như: xài ADO lấy dữ liệu file Access Or Excel thì viết ADO bình thường như những hàm khác xong truyền SQL vào gõ trên Cells cái cộp là xong .... Minh họa như hình sau ( làm biếng úp Video lắm )
...
Biết mà nếu nhớ ko lầm thì Bạn có nói 1 lần trên GPE rồi mà ở thớt khácADO là COM của Windows, đâu phải hệ thống nào cũng xài được.
Mà đã xài tới 365 thì chả cần Sí-cồ Sí-kiếc gì cả. Truy vấn qua Power Query khoẻ và hợp tiêu chuẩn hơn nhiều.
"Application.Caller"Xài 365 nói làm gì nữa.Nó tích sẵn luôn rồi bỏ tiền ra mua thôi.
Mình đang tự viết hàm giống với unique nhưng đến đoạn đỗ ra range thì chưa biết phải làm gì
Bài đã được tự động gộp:
Mình đã text thử ok đó.
Bài đã được tự động gộp:
Bác nhớ từ khóa tên gì không em muốn kham khảo.
If TypeName(Application.Caller) = "Range" ThenBạn kiểm tra thử xem,
Bỏ đoạn này vào ThisWorkbook module:
Mã:Option Explicit Public RangesToExpand As New Collection Private Sub Workbook_SheetCalculate(ByVal Sh As Object) Dim oneCell As Range Dim strFormula Application.EnableEvents = False For Each oneCell In RangesToExpand With oneCell strFormula = .Cells(1, 1).FormulaArray .CurrentRegion.ClearContents .FormulaArray = strFormula RangesToExpand.Remove .Address(, , , True) End With Next oneCell Application.EnableEvents = True End Sub
Bỏ đoạn này vào Module có tên "FUNCUNIQUE" hoặc một module mới.
Mã:Function UNIQUES_COL(rng As Range) As Variant() Dim list As New Collection Dim Ulist() As Variant Dim Value, i As Long On Error Resume Next For Each Value In rng list.Add CStr(Value), CStr(Value) Next On Error GoTo 0 ReDim Ulist(list.Count - 1, 0) For i = 0 To list.Count - 1 Ulist(i, 0) = list(i + 1) Next If TypeName(Application.Caller) = "Range" Then If Application.EnableEvents Then With Application.Caller If .Rows.Count <> i Or .Columns.Count <> 1 Then If ThisWorkbook.RangesToExpand Is Nothing Then Set ThisWorkbook.RangesToExpand = New Collection End If With .Resize(i, 1) ThisWorkbook.RangesToExpand.Add item:=.Cells, Key:=.Address(, , , True) End With End If End With End If End If UNIQUES_COL = Ulist End Function
Gõ vào F1:
Mã:=UNIQUES_COL($A$1:$A$13)
Chốc chốc lại thấy có anh gì lại úp quả vi đi ô rất là hoành trán nhưng không thấy mặt mũi cốt két thế nào? Bạn thử hỏi cách làm của anh ý xem.a
Bài đã được tự động gộp:
If TypeName(Application.Caller) = "Range" Then
If Application.EnableEvents Then
With Application.Caller
If .Rows.Count <> i Or .Columns.Count <> 1 Then
If ThisWorkbook.RangesToExpand Is Nothing Then
Set ThisWorkbook.RangesToExpand = New Collection
End If
With .Resize(i, 1)
ThisWorkbook.RangesToExpand.Add item:=.Cells, Key:=.Address(, , , True)
End With
End If
End With
End If
End If
Mình tìm mọi cách để hiểu đoạn code trên mà chưa được. Mong bạn giải thích giúp mình. Mình cám ơn
Một bài toán nhiều phương án giải khác nhau đều sẽ có ưu nhược điểm riêng. Đối với bạn nó bình thường nhưng đối với mình thì nó cực kỳ hữu ích. Mình rất mong sự giải đáp từ bạn.Chốc chốc lại thấy có anh gì lại úp quả vi đi ô rất là hoành trán nhưng không thấy mặt mũi cốt két thế nào? Bạn thử hỏi cách làm của anh ý xem.
Cách làm này của tôi có gì cao điêu đâu, anh ý cũng chỉ ra nhược điểm rồi mà.
Bạn cứ bình tĩnh chờ đợi thêm các phương pháp như trong video của các anh ý đã, biết đâu được đến đó bạn sẽ thấy những cái đó hữu ích hơn rất nhiều.Một bài toán nhiều phương án giải khác nhau đều sẽ có ưu nhược điểm riêng. Đối với bạn nó bình thường nhưng đối với mình thì nó cực kỳ hữu ích. Mình rất mong sự giải đáp từ bạn.
Thôi đành ngậm ngùi vậy. Một chuyện tình dang dở.Bạn cứ bình tĩnh chờ đợi thêm các phương pháp như trong video của các anh ý đã, biết đâu được đến đó bạn sẽ thấy những cái đó hữu ích hơn rất nhiều.
Mình cũng đan chờ đợi những cái đó giống như cảm giác của bạn vậy![]()
Tôi thấy có gì đáng buồn cười đâu.đọc Comment của bạn không nhịn được cười
xem thử vi deo của 1 bạn dấu tên xem có nghiệm ra được gì không
Hihi Bạn không buồn cười nhưng tôi đọc cái câu này "Thôi đành ngậm ngùi vậy. Một chuyện tình dang dở. " tôi thấy nó tiếu lăm, nó hài hài nên tôi mắt cười thôiTôi thấy có gì đáng buồn cười đâu.
Bạn ý không hiểu không biết vận dụng thì bạn ý hỏi thôi, hỏi không được thì bạn ý buồn thôi chứ có gì mà buồn cười.
Tôi thì không đủ khả năng để làm được như các video hay hình ảnh hoành tráng đó mà chỉ có thể tìm hiểu trên mạng rồi tùy biến lại theo nhu cầu người hỏi thôi, nhưng có vị cao siêu nhìn thấy nó tầm thường quá nên chê bơi nọ kia, nên tôi không dám to mồm nữa.
Đành im lặng mà xem các siêu sao đó biểu diễn thôi.
Chứ có gì đáng cười đâu.
Cái này nó cũng co dãn được tẹoThôi đành ngậm ngùi vậy. Một chuyện tình dang dở.
Cái này bạn có thể ứng dụng nó viết ra đầy thứ như ai đấyCái này nó cũng co dãn được tẹo