Hàm có khả năng thay đổi thuộc tính của Cell hay không? (1 người xem)

Liên hệ QC

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

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,912
Như ta đã biết, 1 UDF chỉ có thể trả về 1 giá trị nào đó (qua 1 quá trình tính toán) chứ ko thể làm thay đổi thuộc tính của 1 cell
Nhưng thí nghiệm dưới đây có thể làm cho các bạn phải thay đổi suy nghĩ đấy
1> Chèn 1 Comment vào cell A1 với nội dung BÊN PHẢI
2> Chèn 1 Comment vào cell H1 với nội dung BÊN TRÁI
(hãy Show các Comment này cho dể kiểm tra)
3> Mở cửa sổ VBE và chèn đoạn code này vào 1 module
PHP:
Function ChangeCom(Clls1 As Range, Clls2 As Range)
   Dim Temp As String
   Temp = Clls1.Comment.Text
   Clls1.Comment.Text Clls2.Comment.Text
   Clls2.Comment.Text Temp
End Function
4> Quay trở lại bảng tính, gõ công thức vào cell E1:
=ChangeCom(A1,B1)
5> Kiểm tra lại Comment ở 2 cell. Có phải 2 Comment đã hoán đổi vị trí cho nhau?
Lưu ý: Hãy chọn vào cell E1, bấm F2 rồi Enter lần nữa. Ta sẽ thấy cứ mỗi lần Enter công thức là 1 lần 2 Comment hoán đổi vị trí cho nhau
Kỳ diệu ko? Có phải nó đã phá vở những quy luật mà lâu nay bạn đã từng nghĩ ko?
 

File đính kèm

Như ta đã biết, 1 UDF chỉ có thể trả về 1 giá trị nào đó (qua 1 quá trình tính toán) chứ ko thể làm thay đổi thuộc tính của 1 cell

To: Anh Tuấn,
Câu trên của anh không đúng. Thực sự ra khi viết một UDF, việc trả về một giá trị chỉ là một phần thôi.
Ví dụ: ta có một hàm để kiểm tra xem việc định dạng của mình có thành công hay không
Mã:
Function FormatCheck() AS Long
'Khai báo biến ở đây
On Error Goto ErrorHandler
'Các đoạn code để định dạng ở đây
'Tức là thay đổi, điều chỉnh các thuộc tính
'Ngay cả có thể thực hiện một thủ tục nào đó

   'Nếu thành công sẽ trả về giá trị 1
   FormatCheck = 1

ErrorExit:

   Exit Function
ErrorHandler:
   FormatCheck = 0
   Resume ErrorExit
End Function

Lê Văn Duyệt
 
Upvote 0
To: Anh Tuấn,
Câu trên của anh không đúng. Thực sự ra khi viết một UDF, việc trả về một giá trị chỉ là một phần thôi.
Ví dụ: ta có một hàm để kiểm tra xem việc định dạng của mình có thành công hay không
Mã:
Function FormatCheck() AS Long
'Khai báo biến ở đây
On Error Goto ErrorHandler
[B][COLOR=red]'Các đoạn code để định dạng ở đây[/COLOR][/B]
[B][COLOR=red]'Tức là thay đổi, điều chỉnh các thuộc tính[/COLOR][/B]
......................
Chưa hiểu lắm!
Duyệt có thể cho 1 file ví dụ nào đó mà UDF có khả năng thay đổi thuộc tính của 1 cell không?
 
Upvote 0
Chào Anh Tuấn,
Đối với VB6 thì điều em nói ở trên là đúng.
Còn đối với VBA cần phải nói cho rõ lại
UDF được gọi từ worksheet có thể thay đổi thuộc tính của một ô (cell) nếu nó được kết hợp với thủ tục sự kiện Calculate.

Đặt đoạn code sau trong môt module:
Mã:
Public CellsToBold As New Collection 
 
Function RowsCount(Rng As Range) As Long 
    On Error Resume Next 
    CellsToBold.Add Rng, key:=Rng.Address(, , , True) 
    On Error Goto ErrorHandler 
    RowsCount = Rng.Rows.Count 
errorExit: 
    On Error Goto 0 
    Exit Function 
ErrorHandler: 
    RowsCount = -1 
    Resume errorExit 
End Function

Và trong thủ tục sự kiện Workbook_SheetCalculate
Mã:
Private Sub Workbook_SheetCalculate(ByVal Sh As Object) 
    Dim oneCell As Range 
     
    If 0 < CellsToBold.Count Then 
        For Each oneCell In CellsToBold 
            oneCell.Font.Bold = True 
        Next oneCell 
        Set CellsToBold = Nothing 
    End If 
End Sub

Đây có thể nói là một điểm tương đối khác biệt giữa VB6 và VBA.

Đối với hàm anh đưa ra, nói về chức năng thì đây đúng hơn là một thủ tục (sub) chứ không phải hàm.
Mã:
Function ChangeCom(Clls1 As Range, Clls2 As Range)
   Dim Temp As String
   Temp = Clls1.Comment.Text
   Clls1.Comment.Text Clls2.Comment.Text
   Clls2.Comment.Text Temp
End Function

Xin nói thêm:
Excel 2007 VBA Programmers Ref đã viết:
What UDFs Cannot Do
A common mistake made by users is to attempt to create a worksheet function that changes the structure
of the worksheet
by, for example, copying a range of cells. Such attempts will fail. No error messages are
produced because Excel simply ignores the offending code lines
, so the reason for the failure is not obvious.
UDFs, used in worksheet cells, are not permitted to change the structure of the
worksheet
, meaning that a UDF cannot return a value to any other cell than the one
it is used in, and it cannot change a physical characteristic of a cell, such as the font
color or background pattern. In addition, UDFs cannot carry out actions such as
copying or moving spreadsheet cells. They cannot even carry out some actions that
imply a change of cursor location, such as an Edit➪Find. A UDF can call another
function procedure, or even a sub procedure, but that procedure will be under the
same restrictions as the UDF. It will still not be permitted to change the structure of
the worksheet.
Em nghĩ câu màu xanh in đậm là quan trọng.
Nên chắc mình cũng chẳng nên chú trọng vấn đề này làm gì.

Lê Văn Duyệt
 
Lần chỉnh sửa cuối:
Upvote 0
Chính vì có đoạn này:
A common mistake made by users is to attempt to create a worksheet function that changes the structure
of the worksheet
by, for example, copying a range of cells. Such attempts will fail. No error messages are
produced because Excel simply ignores the offending code lines
Nên hầu hết người dùng có kinh nghiệm đều tin chắc rằng 1 Function hoàn toàn không có khả năng thay đổi thuộc tính của bất cứ thứ gì trên Worksheet!
Tuy nhiên sau quá trình tìm tòi cũng phát hiện thì ra vẫn có ngoại lệ
Duyệt nói rằng:
Đối với hàm anh đưa ra, nói về chức năng thì đây đúng hơn là một thủ tục (sub) chứ không phải hàm.
Vâng! Đồng ý nó là 1 thủ tục, nhưng rõ ràng đây là 1 trường hợp ngoại lệ với Comments... Với các thuộc tính khác nó có changes gì được đâu!
Ko chắc lắm, nhưng biết đâu đấy, có ngày ta sẽ dùng tới!
Tôi vẫn luôn cảm thấy rất thú vị với bất cứ trường hợp ngoại lệ nào!
 
Upvote 0
Web KT

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

Back
Top Bottom