Làm Sao Gán Kết Qủa Xuống Từng Dòng Bằng Hàm Tự Tạo (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

langkhachquaduong

Thành viên chính thức
Tham gia
23/7/19
Bài viết
50
Được thích
8
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.
 

File đính kè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.
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à
 
Lần chỉnh sửa cuối:
Upvote 0
Trên nguyên tắc, hàm tự tạo không thể sửa đổi gì trên bảng tính.
Yêu cầu "gán kết quả xuống ... bằng hàm tự tạo" coi như không thể thực hiện.

(thực ra có cách để "che mắt" Excel và gán được. Nhưng cách đó chỉ những người tin rằng mình đã đạt tình độ cao của VBA mới nên dùng. Ai muôn thì tự tìm lấyn đi. tôi không nói thêm ở đây)
 
Upvote 0
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ôi

 
Upvote 0
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
 
Upvote 0
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
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à đủ)
 
Upvote 0
Nếu không có 365 thì xài tạm cái này:
...
Loại hàm mảng này tôi đã từng giải thíchn cách dùng rồi.
Gõ =Rows(Hàm UDF(...))
Nó ra số gì thì bôi đen bao nhiêu ấy ô, gõ hàm và nhấn Ctrl+Enter

Lưu ý là hàm phải trả về mảng với nhiều dòng và một cột. Nếu hàm trả về một dòng thì phải thêm hàm transpose hoặc fill ngang
 
Upvote 0
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.
Chắc là ý như Video ... VBA thừa sức viết ra và không xài tới API của Bill
Cố giắng mò xem sao nha ... Nếu kẹt quá thì xài Office 365 đi cho khỏe
 
Lần chỉnh sửa cuối:
Upvote 0
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.
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
 
Upvote 0
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.
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)
 

File đính kèm

Upvote 0
Rảnh mới thử làm cái hàm chuyển mảng xem sao ... cơ bản là chạy tốt và quan trọng nhất là viết code tính toán như thế nào ??!!!
Còn lại cái Hàm gán lên Sheet Kiểu office 365 là xong ............ xài chung cho tất cả các hàm khác nhau ....
đại ý như sau
Mã:
TransposeArray = ResizeArray(Total)
Cái khó nhất là cái Hàm ResizeArray ................. xài chung cho tất cả các Hàm gán kết quả lên Sheet kiểu office 365

 
Lần chỉnh sửa cuối:
Upvote 0
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:

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)
Mình đã text thử ok đó.
Bài đã được tự động gộp:

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
Bác nhớ từ khóa tên gì không em muốn kham khảo.
 
Upvote 0
Nếu bạn không có Office 365 hoặc muốn tính năng hàm tự insert dòng, hoặc hết tất cả các cách rồi thì tham khảo giải pháp cuối cùng là dùng hàm BS_UNIQUE của Add-in A-Tools
 
Upvote 0
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 :D

1601255872627.png
 
Lần chỉnh sửa cuối:
Upvote 0
Trong Excel 365 thì hàm Unique nó tự động điền xuống dưới luôn, bí lắm thớt chuyển qua 365 xài cho khỏe
 
Upvote 0
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.
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 ợ
 
Upvote 0
Upvote 0
N
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 :D

View attachment 246257
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.
 
Upvote 0
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 )
...
ADO 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.
 
Upvote 0
ADO 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.
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ác
Còn nếu Viết trên Delphi Thì Mạnh đoán thôi nhé nếu sai thì bỏ qua toàn bộ các dòng dưới đây

Delphi nó cho Hổ trợ Import các thư viện DLL của Bill thành các Unit đính kèm vào vậy nếu làm theo cách đó ko biết mang qua máy ko cài hệ điều hành của Windows thì điều gì sẻ xảy ra ... tại vì ko có cài hệ điều hành khác nên cũng ko có quậy được ====> nên nêu lên đại vậy ====> ai biết trả lời dùm ???!!!
 
Upvote 0
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.
"Application.Caller"
 
Upvote 0
a
Bài đã được tự động gộp:

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)
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
 
Upvote 0
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
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à.
 
Upvote 0
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à.
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.
 
Upvote 0
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.
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 :)
 
Upvote 0
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 :)
Thôi đành ngậm ngùi vậy. Một chuyện tình dang dở.
 
Upvote 0
@>><M? đọc Comment của bạn không nhịn được cười@>><M?
xem thử vi deo của 1 bạn dấu tên xem có nghiệm ra được gì không
Tô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.
 
Upvote 0
Tô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.
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ôi
 
Upvote 0
thì bài số 21 Mạnh có nói rồi còn gì ... cơ bản nó khác nhau cái gì... ???!!!
Còn nhìn thấy họ gõ hàm xong bấm vào vùng dữ liệu của hàm mà nó có kiểu như sau ... thì hahahaha ........... hehehehe -0-0-0- -0-0-0- -0-0-0- -0-0-0-
{=Ham(value1,value2)}
 
Upvote 0
Hàm tự co giãn biết viết và biết ứng dụng thì nó có sức mạnh và lợi ích vô cùng. Cũng phải biết cách viết chứ không đơn giản như Excel 365. Chúng ta chỉ nên dùng khi cần lấy mảng động và mảng đó phải phục vụ cho một báo cáo hoàn chỉnh hoặc là vùng đệm quan trọng cho các công cụ khác của Excel. Cách làm công thức Excel truyền thống để tạo báo cáo có cấu trúc mới là bất cập, tốc độ chạy chậm, người dùng phải làm công thức thừa, phải thêm chiều động tác đi filter để ẩn dòng thừa, tính tham chiếu ... làm cho Excel chạy chậm.
Nếu bạn nào muốn thử nghiệm những gì tôi nói thì xem video này, cài A-Tools, tải file báo cáo như trong video dưới đây chạy thử, không phải dùng VBA thì sẽ thấy lợi ích lớn thế nào
(Download file Excel thiết kế trong video trên: https://drive.google.com/file/d/1Wj57L02GMBN4U_nDz_3Czx_AaPZSgs47/view?usp=sharing )​
 
Lần chỉnh sửa cuối:
Upvote 0
Cái này nó cũng co dãn được tẹo
Cái này bạn có thể ứng dụng nó viết ra đầy thứ như ai đấy

1/ Sử dụng ADO lấy dữ liệu Excel + Access
2/ Sử dụng ADO lấy dữ liệu Ms Server
3/ Viết Hàm xVlooup ..
5/ ....
6/ Miễn sao bạn tính toán mọi thứ xong cho vào 1 Array xong gán nó vào Hàm ResizeKQ là xong
đơn giản chỉ có thế còn vận dụng tùy biến yes Or No thì tùy vào khả năng của từng bạn -0-0-0-

Còn cái co và dãn thì nó cũng chỉ có vai trò là hình thức ... có là tốt ... chứ nó không phải là nội dung quyết định mọi vấn đề
 
Lần chỉnh sửa cuối:
Upvote 0

Bài viết mới nhất

Back
Top Bottom