RaoVat24h
Office Word

15 Useful functions – 15 hàm hữu ích trong lập trình Macro VBA Excel

Advertisement

Khi lập trình VBA, một số thao tác các bạn thường xuyên sử dụng, các thao tác này sẽ được thay bằng các hàm Function, ban chỉ cần gọi nó ra trong câu lệnh.

Tuyển tập những tài liệu hay nhất về lập trình VBA Macro trên Excel tải về free dành cho các bạn.

1) Hàm xác định:

  • Hàng cuối (last row).
  • Cột cuối (last column).
  • Ô cuối (last cell).

Mã:
Function RDB_Last(choice As Integer, rng As Range)
' Giá trị choice đưa vào
' 1 = tìm hàng cuối
' 2 = tìm cột cuối
' 3 = tìm ô cuối
Dim lrw As Long
Dim lcol As Integer

Select Case choice

Case 1:
On Error Resume Next
RDB_Last = rng.Find(What:="*", _
after:=rng.cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
On Error GoTo 0

Case 2:
On Error Resume Next
RDB_Last = rng.Find(What:="*", _
after:=rng.cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
On Error GoTo 0

Case 3:
On Error Resume Next
lrw = rng.Find(What:="*", _
after:=rng.cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Row
On Error GoTo 0

On Error Resume Next
lcol = rng.Find(What:="*", _
after:=rng.cells(1), _
Lookat:=xlPart, _
LookIn:=xlFormulas, _
SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, _
MatchCase:=False).Column
On Error GoTo 0

On Error Resume Next
RDB_Last = rng.Parent.cells(lrw, lcol).Address(False, False)
If Err.Number > 0 Then
RDB_Last = rng.cells(1).Address(False, False)
Err.Clear
End If
On Error GoTo 0

End Select
End Function

Tìm hàng cuối của một cột:
Thông thường để tìm hàng cuối cùng của một cột (manual), chúng ta sẽ thực hiện các bước sau:

  • Nhấn tổ hợp phím Ctrl + End để di chuyển đến ô có dữ liệu cuối cùng của một worksheet.
  • Di chuyển con trỏ chuột đến cột mà chúng ta muốn tìm hàng cuối cùng.
  • Sau đó nhấn tổ hợp phím Ctrl + Phím mủi tên lên.


Thao tác này tương đương với đoạn mã sau:

Mã:
Sub LastRowInOneColumn()
'Tìm hàng có dữ liệu cuối cùng của một cột. Ở đây ta tìm hàng cuối cùng của cột A
'Vậy khi muốn tìm ở cột nào thì bạn thay thế tên cột đó
Dim LastRow As Long
With ActiveSheet
LastRow = .Cells(.Rows.Count, "A").End(xlUp).Row 'Tương đương với việc bấm tổ hợp Ctrl + Phím mủi tên đi lên
End With
MsgBox LastRow
End Sub
[/GPECODE]

Tìm cột cuối cùng của một hàng:
Cách làm cũng tương tự trên.
[GPECODE=vb]
Sub LastColumnInOneRow()
'Tìm cột cuối cùng của một hàng: giả sử ở đây chúng ta tìm ở hàng số 1
Dim LastCol As Integer
With ActiveSheet
LastCol = .Cells(1, .Columns.Count).End(xlToLeft).Column
End With
MsgBox LastCol
End Sub

Chú ý:
Với cách này nếu các bạn merged các ô (merged cells) thì kết quả có khi sẽ bị sai.

Hàm GetLastCell của Chip Pearson:

Mã:
Public Function GetLastCell(InRange As Range, SearchOrder As XlSearchOrder, _
Optional ProhibitEmptyFormula As Boolean = False) As Range
'''''
' GetLastCell
' By Chip Pearson, chip@cpearson.com, www.cpearson.com
'
' This returns the last used cell in a worksheet or range. If InRange
' is a single cell, the last cell of the entire worksheet if found. If
' InRange contains two or more cells, the last cell in that range is
' returned.
' If SearchOrder is xlByRows (= 1), the last cell is the last
' (right-most) non-blank cell on the last row of data in the
' worksheet's UsedRange. If SearchOrder is xlByColumns
' (= 2), the last cell is the last (bottom-most) non-blank cell in the
' last (right-most) column of the worksheet's UsedRange. If SearchOrder
' is xlByColumns + xlByRows (= 3), the last cell is the intersection of
' the last row and the last column. Note that this cell may not contain
' any value.
' If SearchOrder is anything other than xlByRows, xlByColumns, or
' xlByRows+xlByColumns, an error 5 is raised.
'
' ProhibitEmptyFormula indicates how to handle the case in which the
' last cell is a formula that evaluates to an empty string. If this setting
' is omitted for False, the last cell is allowed to be a formula that
' evaluates to an empty string. If this setting is True, the last cell
' must be either a static value or a formula that evaluates to a non-empty
' string. The default is False, allowing the last cell to be a formula
' that evaluates to an empty string.
'''''''
' Example:
' a b c
' d e
' f g
'
' If SearchOrder is xlByRows, the last cell is 'g'. If SearchOrder is
' xlByColumns, the last cell is 'e'. If SearchOrder is xlByRows+xlByColumns,
' the last cell is the intersection of the row containing 'g' and the column
' containing 'e'. This cell has no value in this example.
'
'''''
Dim WS As Worksheet
Dim R As Range
Dim LastCell As Range
Dim LastR As Range
Dim LastC As Range
Dim SearchRange As Range
Dim LookIn As XlFindLookIn
Dim RR As Range

Set WS = InRange.Worksheet

If ProhibitEmptyFormula = False Then
LookIn = xlFormulas
Else
LookIn = xlValues
End If

Select Case SearchOrder
Case XlSearchOrder.xlByColumns, XlSearchOrder.xlByRows, _
XlSearchOrder.xlByColumns + XlSearchOrder.xlByRows
' OK
Case Else
Err.Raise 5
Exit Function
End Select

With WS
If InRange.Cells.Count = 1 Then
Set RR = .UsedRange
Else
Set RR = InRange
End If
Set R = RR(RR.Cells.Count)

If SearchOrder = xlByColumns Then
Set LastCell = RR.Find(what:="*", after:=R, LookIn:=LookIn, _
LookAt:=xlPart, SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, MatchCase:=False)
ElseIf SearchOrder = xlByRows Then
Set LastCell = RR.Find(what:="*", after:=R, LookIn:=LookIn, _
LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, MatchCase:=False)
ElseIf SearchOrder = xlByColumns + xlByRows Then
Set LastC = RR.Find(what:="*", after:=R, LookIn:=LookIn, _
LookAt:=xlPart, SearchOrder:=xlByColumns, _
SearchDirection:=xlPrevious, MatchCase:=False)
Set LastR = RR.Find(what:="*", after:=R, LookIn:=LookIn, _
LookAt:=xlPart, SearchOrder:=xlByRows, _
SearchDirection:=xlPrevious, MatchCase:=False)
Set LastCell = Application.Intersect(LastR.EntireRow, LastC.EntireColumn)
Else
Err.Raise 5
Exit Function
End If
End With

Set GetLastCell = LastCell

End Function

Khi lập trình VBA, một số thao tác các bạn thường xuyên sử dụng như:

  • Kiểm tra tập tin có tồn tại hay không?
  • Kiểm tra đường dẫn có tồn tại hay không?

Nguồn tại đây.
Tôi xin giới thiệu các bạn 6 hàm sau:

  • 2) FileExists: kiểm tra sự tồn tại của tập tin – Trả về TRUE nếu tập tin tồn tại.
  • 3) FileNameOnly: lấy tên tập tin từ đường dẫn.
  • 4) PathExists : kiểm tra đường dẫn có tồn tại hay không? – Trả về TRUE nếu đường dẫn tồn tại.
  • 5) RangeNameExists : kiểm tra tên của một vùng (Range) có tồn tại hay không? – Trả về TRUE nếu tên vùng tồn tại.
  • 6) SheetExists : kiểm tra sheet có tồn tại hay không? – Trả về TRUE nếu sheet tồn tại.
  • 7) WorkBookIsOpen : kiểm tra xem tập tin có đang mở hay không? – Trả về TRUE nếu tập tin đang mở.


Mã:
Private Function FileExists(fname) As Boolean
' Returns TRUE if the file exists
Dim x As String
x = Dir(fname)
If x <> "" Then FileExists = True _
Else FileExists = False
End Function


Private Function FileNameOnly(pname) As String
' Returns the filename from a path/filename string
Dim i As Integer, length As Integer, temp As String
length = Len(pname)
temp = ""
For i = length To 1 Step -1
If Mid(pname, i, 1) = Application.PathSeparator Then
FileNameOnly = temp
Exit Function
End If
temp = Mid(pname, i, 1) & temp
Next i
FileNameOnly = pname
End Function


Private Function PathExists(pname) As Boolean
' Returns TRUE if the path exists
Dim x As String
On Error Resume Next
x = GetAttr(pname) And 0
If Err = 0 Then PathExists = True _
Else PathExists = False
End Function


Private Function RangeNameExists(nname) As Boolean
' Returns TRUE if the range name exists
Dim n As Name
RangeNameExists = False
For Each n In ActiveWorkbook.Names
If UCase(n.Name) = UCase(nname) Then
RangeNameExists = True
Exit Function
End If
Next n
End Function


Private Function SheetExists(sname) As Boolean
' Returns TRUE if sheet exists in the active workbook
Dim x As Object
On Error Resume Next
Set x = ActiveWorkbook.Sheets(sname)
If Err = 0 Then SheetExists = True _
Else SheetExists = False
End Function


Private Function WorkbookIsOpen(wbname) As Boolean
' Returns TRUE if the workbook is open
Dim x As Workbook
On Error Resume Next
Set x = Workbooks(wbname)
If Err = 0 Then WorkbookIsOpen = True _
Else WorkbookIsOpen = False
End Function

Cách khác để kiểm tra sự tồn tại của một tập tin:
Ngoài ra chúng ta cũng có thể dùng FileSystemObject để kiểm tra sự tồn tại của một tập tin. Hàm FileExists có thể viết lại như sau:

Mã:
Function FileExists(ByVal fname As String) As Boolean
Set fs = CreateObject("Scripting.FileSystemObject")
FileExists = fs.FileExists(fname)
End Function

Một cách khác:

Mã:
Function bFileExists(rsFullPath As String) As Boolean
bFileExists = CBool(Len(Dir$(rsFullPath)) > 0)
End Function

Cách tương tự nhưng bạn có thể kiểm tra sự tồn tại của tập tin/thư mục. Nguồn từ đây.

Mã:
Public Function FileFolderExists(strFullPath As String) As Boolean
'Tác giả/Author : Ken Puls (www.excelguru.ca)
'Mục đích/Macro Purpose: Kiểm tra sự tồn tại của một tập tin/thư mục - Check if a file or folder exists

On Error GoTo EarlyExit
If Not Dir(strFullPath, vbDirectory) = vbNullString Then FileFolderExists = True

EarlyExit:
On Error GoTo 0

End Function

Cách khác để kiểm tra sự workbook có đang mở hay không:

Mã:
Function bWorkbookIsOpen(rsWbkName As String) As Boolean
On Error Resume Next
bWorkbookIsOpen = CBool(Len(Workbooks(rsWbkName).Name) > 0)
End Function

Một hàm cùng chức năng để các bạn tham khảo:
Nguồn tại đây.
Các bạn đưa đoạn mã sau vào một module.

Mã:
Option Explicit
Option Compare Text
' modIsFileOpen
' By Chip Pearson, www.cpearson.com , chip@cpearson.com
' www.cpearson.com/Excel/IsFileOpen.aspx
' This module contains the IsFileOpen procedure whict tests whether
' a file is open.
' Module chứa hàm IsFileOpen nhằm kiểm tra việc tập tin đang mở hoặc đang
' được sử dụng bởi một process khác

Public Function IsFileOpen(FileName As String, _
Optional ResultOnBadFile As Variant) As Variant
'
' IsFileOpen
' This function determines whether a the file named by FileName is
' open by another process. The fuction returns True if the file is open
' or False if the file is not open. If the file named by FileName does
' not exist or if FileName is not a valid file name, the result returned
' if equal to the value of ResultOnBadFile if that parameter is provided.xd
' If ResultOnBadFile is not passed in, and FileName does not exist or
' is an invalid file name, the result is False.

Dim FileNum As Integer
Dim ErrNum As Integer
Dim V As Variant

On Error Resume Next

' If we were passed in an empty string,
' there is no file to test so return FALSE.

If Trim(FileName) = vbNullString Then
If IsMissing(ResultOnBadFile) = True Then
IsFileOpen = False
Else
IsFileOpen = ResultOnBadFile
End If
Exit Function
End If

' if the file doesn't exist, it isn't open
' so get out now
V = Dir(FileName, vbNormal)
If IsError(V) = True Then
' syntactically bad file name
If IsMissing(ResultOnBadFile) = True Then
IsFileOpen = False
Else
IsFileOpen = ResultOnBadFile
End If
Exit Function
ElseIf V = vbNullString Then
' file doesn't exist.
If IsMissing(ResultOnBadFile) = True Then
IsFileOpen = False
Else
IsFileOpen = ResultOnBadFile
End If
Exit Function
End If

FileNum = FreeFile()
' Attempt to open the file and lock it.
Err.Clear
Open FileName For Input Lock Read As #FileNum
ErrNum = Err.Number
' Close the file.

Close FileNum
On Error GoTo 0

' Check to see which error occurred.
Select Case ErrNum
Case 0
'
' No error occurred.
' File is NOT already open by another user.
'
IsFileOpen = False
Case 70
' Error number for "Permission Denied."
' File is already opened by another user.
IsFileOpen = True
Case Else
' Another error occurred. Assume open.
IsFileOpen = True
End Select

End Function

Chú ý: với cách ở trên thì hàm cũng kiểm tra luôn trong các process (Ví dụ: khi bạn vào Start>All Programs>Microsoft Office>Microsoft Excel, mở một tập tin. Sau đó bạn mở một tập tin khác cũng bằng cách này. Sau đó bạn nhấn tổ hợp Ctrl + Alt + Deletebạn sẽ thấy hai process Excel.exe ) đang mở khác.
Cách tương tự, viết ngắn gọn lại, dễ hiểu hơn như sau:

Mã:
Function IsFileOpen(FileName As String)
Dim iFilenum As Long
Dim iErr As Long

On Error Resume Next
iFilenum = FreeFile()
Open FileName For Input Lock Read As #iFilenum
Close iFilenum
iErr = Err
On Error Goto 0

Select Case iErr
Case 0: IsFileOpen = False
Case 70: IsFileOpen = True
Case Else: Error iErr
End Select

End Function

Sub test()
If Not IsFileOpen("C:MyTestvolker2.xls") Then
Workbooks.Open "C:MyTestvolker2.xls"
End If
End Sub

Hoặc các bạn cũng có thể tham khảo tại đây: http://support.microsoft.com/?kbid=138621
Đoạn code tương ứng với link ở trên của Microsoft như sau:

Mã:
Sub TestFileOpened()

' Test to see if the file is open.
If IsFileOpen("c:Book2.xls") Then
' Display a message stating the file in use.
MsgBox "File already in use!"
'
' Add code here to handle case where file is open by another
' user.
'
Else
' Display a message stating the file is not in use.
MsgBox "File not in use!"
' Open the file in Microsoft Excel.
Workbooks.Open "c:Book2.xls"
'
' Add code here to handle case where file is NOT open by
' another user.
'
End If
End Sub

Function IsFileOpen(filename As String)
Dim filenum As Integer, errnum As Integer

On Error Resume Next 'Tắt việc kiểm tra lỗi.
filenum = FreeFile() ' Get a free file number.
' Thử mở tập tin vào khóa nó
Open filename For Input Lock Read As #filenum
Close filenum ' Đóng tập tin
errnum = Err ' Lưu lại lỗi xãy ra
On Error GoTo 0 ' Mở lại việc kiểm tra lỗi

' Kiểm tra xem lỗi gì xãy ra
Select Case errnum

' Không có lỗi xãy ra
' Tập tin chưa mở bởi người dùng khác
Case 0
IsFileOpen = False

' Error number for "Permission Denied."
' Tập tin được mở bởi người dùng khác
Case 70
IsFileOpen = True

' Lỗi khác xãy ra
Case Else
Error errnum
End Select
End Function


Cách khác để kiểm tra sự tồn tại của worksheet:

Mã:
Function WksExists(wksName As String) As Boolean
On Error Resume Next
WksExists = CBool(Len(Worksheets(wksName).Name) > 0)
End Function

Các bạn có thể tham khảo thêm tại http://www.rondebruin.nl/exist.htm.

8) Xác định một vùng có tồn tại trong một vùng khác hay không

Trong một số trường hợp các bạn muốn biết một vùng này có nằm trong một vùng kia hay không. Ví dụ: bạn cần biết ô hiện hành có nằm trong một vùng nào đó hay không chằng hạn.

Trong trường hợp này các bạn có thể dùng hàm sau:
Chú ý rằng, hàm kiểm tra để chắc chắn rằng hai vùng bạn đưa vào hàm này phải cùng trên một workbook và cùng trên một worksheet.

Bạn có thể dùng hàm này trong VBA hoặc worksheet.

Mã:
Function InRange(rng1, rng2) As Boolean
' Returns True if rng1 is a subset of rng2
InRange = False
If rng1.Parent.Parent.Name = rng2.Parent.Parent.Name Then
If rng1.Parent.Name = rng2.Parent.Name Then
If Union(rng1, rng2).Address = rng2.Address Then
InRange = True
End If
End If
End If
End Function

Ví dụ:

Ví dụ sau cho người sử dụng chọn một vùng và sử dụng hàm InRange để kiểm tra. Nếu người dùng không chọn trong vùng A1:E20, thì hộp thoại yêu cầu sẽ lại hiện ra lại.

Mã:
Sub Test()
Dim ValidRange As Range, UserRange As Range
Dim SelectionOK As Boolean

Set ValidRange = Range("A1:E20")
SelectionOK = False
On Error Resume Next

Do Until SelectionOK = True
Set UserRange = Application.InputBox(Prompt:="Select a range", Type:=8)
If TypeName(UserRange) = "Empty" Then Exit Sub
If InRange(UserRange, ValidRange) Then
MsgBox "The range is valid."

SelectionOK = True
Else
MsgBox "Select a range within " & ValidRange.Address
End If
Loop
End Sub

Nguồn từ đây.

Kiểm tra ô hiện hành (ActiveCell) có nằm trong một vùng hay không?

Mã:
Sub CellinRange()
Dim rngArea As Range

' Vùng dữ liệu bạn muốn kiểm tra
' Bạn có thể thay đổi theo ý bạn
Set rngArea = Range("A1:C5")

' Dùng Intersect để kiểm tra
If Application.Intersect(rngArea, ActiveCell) Is Nothing Then
MsgBox ("Ô hiện tại không có trong vùng này.")
Else
MsgBox ("Ô hiện tại đang ở trong vùng này.")
End If
End Sub


Nguồn tại đây, bài của SA_DQ.

Bài viết cụ thể về phương thức Intersect xin xem tại đây.

File đính kèm

9) Hàm chuyển đổi số thứ tự cột thành chữ – Column number to Column letter

Đôi khi trong lập trình VBA chúng ta muốn chuyển đổi cột từ số sang chữ, các bạn có thể sử dụng hàm sau:

Mã:
Function [COLOR="Red"][B]ColumnLetter[/B][/COLOR](ColumnNumber As Integer) As String

'
'example usage:
'
'Dim temp As Integer
'temp = Sheets(1).Range("B2").End(xlToRight).Column
'MsgBox "The last column of this region is " & _
' ColumnLetter(temp)
'

If ColumnNumber <= 0 Then
'negative column number
ColumnLetter = ""

ElseIf ColumnNumber > 16384 Then
'column not supported (too big) in Excel 2007
ColumnLetter = ""

ElseIf ColumnNumber > 702 Then
' triple letter columns
ColumnLetter = _
Chr((Int((ColumnNumber-1-26-676) / 676)) Mod 676 + 65) & _
Chr((Int((ColumnNumber-1-26) / 26) Mod 26) + 65) & _
Chr(((ColumnNumber-1) Mod 26) + 65)

ElseIf ColumnNumber > 26 Then
' double letter columns
ColumnLetter = Chr(Int((ColumnNumber-1) / 26) + 64) & _
Chr(((ColumnNumber-1) Mod 26) + 65)
Else
' single letter columns
ColumnLetter = Chr(ColumnNumber + 64)

End If

End Function

Nguồn từ đây.

Còn đây nếu dùng công thức:

Mã:
Function CotDoiSangChu(n As Integer) As String
Dim s As String
s = Cells(1, n).Address
CotDoiSangChu = Mid(s, 2, InStr(2, s, "$") - 2)
End Function

Nếu muốn dùng trong AutoIt thì dùng hàm sau:

Mã:
; ----------------------------------------------------------------------------------------------------
; Function Name: [B][COLOR="red"] _ExcelColumnLetter[/COLOR][/B]()
; Description: Converts Microsoft Excel column number (1 - 16384) into column letter(s)
; [http://www.freevbcode.com/ShowCode.asp?ID=9264].
; Syntax: _ExcelColumnLetter([$iColumn = 0])
; Parameter(s): $iColumn - The column number to convert into column letter(s).
; Requirement(s): None.
; Return Value(s): Success - "A" to "XFD", @error = 0, @extended = 1, 2, 3.
; Failure - "", @error = 1, @extended = 0.
; ----------------------------------------------------------------------------------------------------
Func _ExcelColumnLetter($iColumn = 0)
Switch $iColumn
Case 1 To 26 ; Single letter columns (1 = "A" - 26 = "Z").
Local $letter1 = Chr($iColumn + 64)
Return SetError(0, 1, $letter1)
Case 27 To 702 ; Double letter columns (27 = "AA" - 702 = "ZZ").
Local $letter1 = Chr(Int(($iColumn - 1) / 26) + 64)
Local $letter2 = Chr(Mod(($iColumn - 1), 26) + 65)
Return SetError(0, 2, $letter1 & $letter2)
Case 703 To 16384 ; Triple letter columns (703 = "AAA" - 16384 = "XFD" [18278 = "ZZZ"]).
Local $letter1 = Chr(Mod(Int(($iColumn - 1 - 26 - 676) / 676), 676) + 65)
Local $letter2 = Chr(Mod(Int(($iColumn - 1 - 26) / 26), 26) + 65)
Local $letter3 = Chr(Mod(($iColumn - 1), 26) + 65)
Return SetError(0, 3, $letter1 & $letter2 & $letter3)
EndSwitch
Return SetError(1, 0, "")
EndFunc

Nguồn tại đây.

10) Kiểm tra xem địa chỉ tham chiếu có đúng không?

Trong lập trình VBA, đôi khi chúng ta cần phải kiểm tra xem địa chỉ tham chiếu đến một vùng có đúng hay không trước khi thực hiện bước tiếp theo.

Xin giới thiệu các bạn hàm kiểm tra IsValidRef, của Tác giả Jan Karel Pieterse

Các bạn hãy đưa đoạn mã này vào một module, rồi thay đổi các giá trị tham chiếu trong ví dụ Test1 để kiểm tra.


Mã:
Option Explicit

Public Function [COLOR="red"]IsValidRef[/COLOR](sRef As String) As Boolean
'-------------------------------------------------------------------------
' Procedure : IsValidRef Created by Jan Karel Pieterse
' Company : JKP Application Development Services (c) 2005
' Author : Jan Karel Pieterse
' Created : 21-12-2005
' Purpose/Mục đích : Checks of argument is a valid cell reference
'-------------------------------------------------------------------------
Dim sTemp As String
Dim oSh As Worksheet
Dim oCell As Range

IsValidRef = False
On Error Resume Next
sTemp = Left(sRef, InStr(sRef, "!") - 1)
sTemp = Replace(sTemp, "=", "")
If Not IsIn(ActiveWorkbook.Worksheets, sTemp) Then
IsValidRef = False
Exit Function
End If
Set oSh = ActiveWorkbook.Worksheets(sTemp)
If oSh Is Nothing Then
Set oSh = ActiveWorkbook.Worksheets(Replace(sTemp, "'", ""))
End If
sTemp = Right(sRef, Len(sRef) - InStr(sRef, "!"))
Set oCell = oSh.Range(sTemp)
If oCell Is Nothing Then
IsValidRef = False
Else
IsValidRef = True
End If
End Function
Function [COLOR="red"]IsIn[/COLOR](vCollection As Variant, ByVal sName As String) As Boolean
'-------------------------------------------------------------------------
' Procedure : funIsIn Created by Jan Karel Pieterse
' Company : JKP Application Development Services (c) 2005
' Author : Jan Karel Pieterse
' Created : 28-12-2005
' Purpose/Mục đích : [COLOR="blue"]Kiểm tra xem đối tượng có trong Collection hay không?[/COLOR]/ Determines if object is in collection
'-------------------------------------------------------------------------
Dim oObj As Object
On Error Resume Next
Set oObj = vCollection(sName)
If oObj Is Nothing Then
IsIn = False
Else
IsIn = True
End If
If IsIn = False Then
sName = Replace(sName, "'", "")
Set oObj = vCollection(sName)
If oObj Is Nothing Then
IsIn = False
Else
IsIn = True
End If
End If
End Function


Sub Test1()
Dim bTest As Boolean
bTest = IsValidRef("Sheet1!A3")
Debug.Print bTest
End Sub

Nguồn tại đây.

File đính kèm

11. Hàm Tìm một từ trong một chuổi

Đôi khi chúng ta muốn tìm một từ trong một chuổi.
Ví dụ: tôi muốn tìm từ cho những trong chuổi xã hội lên án các cộng đồng mạng ủng hộ cho những việc không đúng
Các bạn có thể dùng hàm sau:

Mã:
Function [COLOR="red"][B]IsWholeWord[/B][/COLOR](ByVal SearchWhat As String, ByVal SearchFor As String, _
Optional IgnoreCase As Boolean = True) As Boolean
If IgnoreCase Then SearchWhat = UCase(SearchWhat): SearchFor = UCase(SearchFor)
IsWholeWord = " " & SearchWhat & " " Like "*[!A-Za-z0-9]" & SearchFor & "[!A-Za-z0-9]*"
End Function

Hoặc

Mã:
Function [B][COLOR="red"]IsWholeWord[/COLOR][/B](ByVal SearchWhat As String, ByVal SearchFor As String, _
Optional IgnoreCase As Boolean = True) As Boolean
IsWholeWord = " " & Format(SearchWhat, Mid(">", 2 + IgnoreCase)) & " " Like "*[!A-Za-z0-9]" & _
Format(SearchFor, Mid(">", 2 + IgnoreCase)) & "[!A-Za-z0-9]*"
End Function

Vậy ta có thể viết

Mã:
IsWholeWord("cho những","xã hội lên án các cộng đồng mạng ủng hộ cho những việc không đúng")

Hoặc nếu các bạn đặt từ “cho những” tại ô A1, còn “xã hội lên án các cộng đồng mạng ủng hộ cho những việc không đúng” tại ô A2, thì bạn có thể lập công thức như sau:

Mã:
=IsWholeWord(A2,A1,FALSE)

Tham khảo tại đây.
12. Thủ tục giúp mở sheet có mật khẩu

Mã:
Sub [COLOR="#0000FF"]PasswordBreaker[/COLOR]()
' Tác giả: không biết; Nguồn từ www.experts-exchange.com

Dim i As Integer, j As Integer, k As Integer
Dim l As Integer, m As Integer, n As Integer
Dim i1 As Integer, i2 As Integer, i3 As Integer
Dim i4 As Integer, i5 As Integer, i6 As Integer
On Error Resume Next
For i = 65 To 66: For j = 65 To 66: For k = 65 To 66
For l = 65 To 66: For m = 65 To 66: For i1 = 65 To 66
For i2 = 65 To 66: For i3 = 65 To 66: For i4 = 65 To 66
For i5 = 65 To 66: For i6 = 65 To 66: For n = 32 To 126


ActiveSheet.Unprotect Chr(i) & Chr(j) & Chr(k) & _
Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & Chr(i3) & _
Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
If ActiveSheet.ProtectContents = False Then
MsgBox "One usable password is " & Chr(i) & Chr(j) & _
Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
ActiveWorkbook.Sheets(1).Select
Range("a1").FormulaR1C1 = Chr(i) & Chr(j) & _
Chr(k) & Chr(l) & Chr(m) & Chr(i1) & Chr(i2) & _
Chr(i3) & Chr(i4) & Chr(i5) & Chr(i6) & Chr(n)
Exit Sub
End If
Next: Next: Next: Next: Next: Next
Next: Next: Next: Next: Next: Next


End Sub

13. Hàm đọc số thành chữ tiếng Anh:

Nguồn: http://support.microsoft.com/kb/213360

Mã:
Function SpellNumber(ByVal MyNumber)
Dim Dollars, Cents, Temp
Dim DecimalPlace, Count
ReDim Place(9) As String
Place(2) = " Thousand "
Place(3) = " Million "
Place(4) = " Billion "
Place(5) = " Trillion "
' String representation of amount.
MyNumber = Trim(Str(MyNumber))
' Position of decimal place 0 if none.
DecimalPlace = InStr(MyNumber, ".")
' Convert cents and set MyNumber to dollar amount.
If DecimalPlace > 0 Then
Cents = GetTens(Left(Mid(MyNumber, DecimalPlace + 1) & _
"00", 2))
MyNumber = Trim(Left(MyNumber, DecimalPlace - 1))
End If
Count = 1
Do While MyNumber <> ""
Temp = GetHundreds(Right(MyNumber, 3))
If Temp <> "" Then Dollars = Temp & Place(Count) & Dollars
If Len(MyNumber) > 3 Then
MyNumber = Left(MyNumber, Len(MyNumber) - 3)
Else
MyNumber = ""
End If
Count = Count + 1
Loop
Select Case Dollars
Case ""
Dollars = "No Dollars"
Case "One"
Dollars = "One Dollar"
Case Else
Dollars = Dollars & " Dollars"
End Select
Select Case Cents
Case ""
Cents = " and No Cents"
Case "One"
Cents = " and One Cent"
Case Else
Cents = " and " & Cents & " Cents"
End Select
SpellNumber = Dollars & Cents
End Function

' Converts a number from 100-999 into text
Function GetHundreds(ByVal MyNumber)
Dim Result As String
If Val(MyNumber) = 0 Then Exit Function
MyNumber = Right("000" & MyNumber, 3)
' Convert the hundreds place.
If Mid(MyNumber, 1, 1) <> "0" Then
Result = GetDigit(Mid(MyNumber, 1, 1)) & " Hundred "
End If
' Convert the tens and ones place.
If Mid(MyNumber, 2, 1) <> "0" Then
Result = Result & GetTens(Mid(MyNumber, 2))
Else
Result = Result & GetDigit(Mid(MyNumber, 3))
End If
GetHundreds = Result
End Function

' Converts a number from 10 to 99 into text.
Function GetTens(TensText)
Dim Result As String
Result = "" ' Null out the temporary function value.
If Val(Left(TensText, 1)) = 1 Then ' If value between 10-19...
Select Case Val(TensText)
Case 10: Result = "Ten"
Case 11: Result = "Eleven"
Case 12: Result = "Twelve"
Case 13: Result = "Thirteen"
Case 14: Result = "Fourteen"
Case 15: Result = "Fifteen"
Case 16: Result = "Sixteen"
Case 17: Result = "Seventeen"
Case 18: Result = "Eighteen"
Case 19: Result = "Nineteen"
Case Else
End Select
Else ' If value between 20-99...
Select Case Val(Left(TensText, 1))
Case 2: Result = "Twenty "
Case 3: Result = "Thirty "
Case 4: Result = "Forty "
Case 5: Result = "Fifty "
Case 6: Result = "Sixty "
Case 7: Result = "Seventy "
Case 8: Result = "Eighty "
Case 9: Result = "Ninety "
Case Else
End Select
Result = Result & GetDigit _
(Right(TensText, 1)) ' Retrieve ones place.
End If
GetTens = Result
End Function

' Converts a number from 1 to 9 into text.
Function GetDigit(Digit)
Select Case Val(Digit)
Case 1: GetDigit = "One"
Case 2: GetDigit = "Two"
Case 3: GetDigit = "Three"
Case 4: GetDigit = "Four"
Case 5: GetDigit = "Five"
Case 6: GetDigit = "Six"
Case 7: GetDigit = "Seven"
Case 8: GetDigit = "Eight"
Case 9: GetDigit = "Nine"
Case Else: GetDigit = ""
End Select
End Function

14. Kiểm tra phiên bản của Excel:

Để kiểm tra phiên bản của MS Excel mình đang sử dụng các bạn có thể dùng hàm sau:

Mã:
Val(Application.Version)

(Chỉ áp dụng cho phiên bản Excel trên Windows)

Hàm trên sẽ trả về giá trị tương ứng với các phiên bản:

  • Excel 97 sẽ trả về 8
  • Excel 2000 sẽ trả về 9
  • Excel 2002 sẽ trả về 10
  • Excel 2003 sẽ trả về 11
  • Excel 2007 sẽ trả về 12
  • Excel 2010 sẽ trả về 14
  • Excel 2011 sẽ trả về 14.1 hoặc 14.2
15. Kiểm tra hệ điều hành trên máy sử dụng Excel:
Cách 1:

Mã:
Application.OperatingSystem Like "*Mac*"

Ngược lại thì đó là hệ điều hành Windows.

Cách 2:

Mã:
#If Win32 Or Win64 Then
' Hệ điều hành Windows

#Else
' Hệ điều hành MAC

#End If

?DienDan.Edu.Vn cám ơn bạn đã quan tâm và rất vui vì bài viết đã đem lại thông tin hữu ích cho bạn. https://diendan.edu.vn/
?Các bạn tham khảo hướng dẫn tải file trên Quản Trị Excel tại đây: http://www.quantriexcel.info/2018/11/huong-dan-tai-file-tren-quan-tri-excel.html

Rate this post

DienDan.Edu.Vn

DienDan.Edu.Vn Cám ơn bạn đã quan tâm và rất vui vì bài viết đã đem lại thông tin hữu ích cho bạn.
DienDan.Edu.Vn! là một website với tiêu chí chia sẻ thông tin,... Bạn có thể nhận xét, bổ sung hay yêu cầu hướng dẫn liên quan đến bài viết. Vậy nên đề nghị các bạn cũng không quảng cáo trong comment này ngoại trừ trong chính phần tên của bạn.
Cám ơn.

Đăng bình luận

(+84) (901) 369.468