PDA

View Full Version : Xin giới thiệu các hàm thường gặp trong VBA



anhtuan1066
11-12-07, 12:22 PM
Chào các bạn!
Trên GPE tôi thấy có giới thiệu các hàm thông dụng cũng như cách sử dụng... Vậy xin các cao thủ nhín chút thời gian giới thiệu về các hàm thông dụng nhất trong VBA (tôi gọi nó là hàm vì ko biết phải gọi như thế nào mới đúng)...
Lấy ví dụ: Hàm MOD của công thức Excel sẽ tương đương với cái gì trong VBA? Cách dùng như thế nào? vân vân và vân vân...
Những người mới học lập trình như tôi thường rất lúng túng.. làm bằng công thức Excel thì dc, nhưng chuyển sang VBA lại ko biết viết tương đương như thế nào, đành phải dùng lệnh gọi hàm, như thế có vẽ ko chuyên nghiệp lắm
Có thể chỉ thêm cái nào có trong công thức Excel lại ko có trong VBA và ngược lại... vân vân...
(Tôi nghĩ khoảng vài ba ngày giới thiệu 1 hàm... ta có trong tay khoảng độ từ 20 đến 50 hàm là có thể tung hoàng ngang dọc rồi)
Vô cùng cảm ơn!
ANH TUẤN

BNTT
11-12-07, 01:24 PM
Chị HanDung107 có một bài hay lắm nè anh:
Hàm VBA & các thủ tục thông dụng về File, Workbook, Worksheet (http://www.giaiphapexcel.com/forum/showthread.php?t=35)

http://www.cosgan.de/images/smilie/xmas/w015.gif

anhtuan1066
11-12-07, 02:13 PM
Tôi đã có xem qua, nhưng nói chung là mấy cái đó chỉ giúp dc cho người khá rành về VBA rồi.. chứ như tôi nhìn vào như trời 30...
Tôi cần những cái thực tế hơn... Tôi lấy ví dụ nhé:
1> Hàm COUNT viết trong VBA như thế nào?
2> Hàm MOD......?
3> Hàm DATE....?
4> MONTH...?
5> DAY...?
6> YEAR...?
7> INT...?
Nói chung là những cái tôi thường xử dụng hàng ngày trong công thức Excel, giờ nếu viết bằng VBA thì tương đương là cái gì?
Mong các cao thủ quan tâm giùm 1 chút... Cứ mỗi lần viết code, đụng đến hàm nào đó lý ra viết rất dễ dàng bằng công thức, nhưng giờ lại chẳng biết diển giãi thế nào trong VBA, đành phải hỏi lung tung...
Ko biết các bạn có hiểu tôi nói ko nhỉ? (vì ko biết giãi thích thế nào ý tưởng của mình... đang kém về VBA mà)
Mến
ANH TUẤN

Lam_A0
11-12-07, 02:52 PM
Em nghĩ viết bằng cái gì chẳng được, anh cứ viết bằng công thức miễn là giải quyết được bài toán thôi. Riêng em hơi dốt về Excel nên không biết so sánh giữa công thức và VBA thế nào nữa, xin liệt kê một số hàm về Date and time nhé:
Now() = current system date and time
Date() = current date, integral date part
Time() = current time, fractional date part
Timer() = number of seconds since midnight, with fractional seconds
Day(#12/25/02#) = 25, the day as Integer
Month(#12/25/02#) = 12, the month as Integer
Year(#12/25/02#) = 2002, the year as Integer
Weekday(#12/25/02#) = 4 (Sunday = 1)
Hour(35656.52) = 12 (Time 12:28:48)
...

BNTT
11-12-07, 03:25 PM
Bác ANHTUAN ơi!
Bác chỉ cần right-click vào VBA, rồi chọn cái Object Browser là ra ngay á mà.

Cái này nè:


http://i216.photobucket.com/albums/cc49/BNTT_photos/011.jpg


Có một cái, gồm rất nhiều hàm tương tự cách xài ngoài Excel: WorkSheetFunction


http://i216.photobucket.com/albums/cc49/BNTT_photos/012.jpg


http://www.cosgan.de/images/smilie/xmas/w015.gif

SA_DQ
11-12-07, 03:46 PM
Tìm kho chứa các hàm của VBA:
Tại trang tính đang mở ta có thể đến cửa sổ (CS) Microsoft Visual Basic (MVB) ít nhất bằng 2 cách sau:
* Bấm tổ hợp ALT +{F11}
* Phải chuột vô ô trái nhất trên thanh menu & chọn dòng cuối (View Code )
Tại CS MVB ta vô tiếp menu View -> Object Browser; Kết quả là CS Object Browser xuất hiện
Chúng ta có thể dùng sự trợ giúp của CS này để tìm hiểu các hàm của VBA giống như chúng ta tìm hiểu các hàm trong excel;

Ví dụ để tìm họ các hàm về thời gian, chúng ta tìm trong ngăn Classes dòng Date Time
Lúc đó bên ngăn Members of 'Date Time' sẽ liệt kê toàn bộ các hàm, về thời gian; Hơn nữa, phía dưới trái nhất của CS sẽ giới thiệu ngắn gọn về 1 hàm mà dòng này đang được kích hoạt
( Kết quả của chúng ta thu được là 14 hàm;)
Trong đó có rất nhiều hàm gần giống với hàm trong excel;

Một cách khác, một khi ta biết chắc là ai đó dùng hàm của VBA mà ta chưa rõ & muốn tìm hiểu về nó. VD ta cần tìm hiểu về hàm InStr;
Dưới từ VBA mà ta chọn ban nãy, ta nhập cụm từ InStr
Liền lập tức CS Search Results sẽ đưa ra các lựa cho cho ta tùy nghi sử dụng;
Theo tôi, mỗi ngày hay mỗi tuần một ít, tích góp chúng ta sẽ có ít vốn tích lũy lâu dài sẽ dùng đến!
. . . .
Điều cuối cùng mình muốn nói là hàm nào chúng ta hay xài trong excel, thì thử tìm hiểu hàm tương tự trong VBA!;
Tuy nhiên sẽ khó có những hàm chỉ số dòng hay số cột trong trang tính; lúc đó ta lại phải dùng cú pháp sử dụng hàm excel trong VBA

Chúc vui!

tigertiger
11-12-07, 03:52 PM
Int(x) trả về phần nguyên của X

MOD,DIV: Không có hàm mod và div
nhưng có phép toán MOD, và div (\) đó là phép toán chia dư, và chia nguyên
vd:
8 mod 3 cho kQ: 2
11 \ 3 cho kQ: 3 (không viết DIV)

ADDRESS, COLUM, ROW,... trong VBA nó là các thuộc tính của các đối tượng RANGE, SHEET,... -> Muốn dùng ta dùng đối tượng này rồi thêm dấu chấm (.) VBA sẽ liệt kê các thuộc tính của nó lun rất trực quan , VD như:

Range("C4").Column -> kết quả là 3
Range("C4").Row -> kết quả là 4

dat2007
11-12-07, 04:14 PM
Có 2 cách dùng công thức trong VBA:

+ Application.WorksheetFunction

Ví dụ: Application.WorksheetFunction.DcountA
Cách này chỉ dùng với một số hàm nhất định

+ ActiveCell.FormulaR1C1

Ví dụ: ActiveCell.FormulaR1C1 = "=SUM(R[-2]C:R[-2]C[4])"

Cách này đựoc với mọi công thức mà bác hay dùng trong bảng tính, tuy nhiên nhiên nếu dữ liệu lớn thì sẽ rất nặng và tốc độ xử lý của bảng tính rất chậm. Do đó nêu trong trường hợp dữ liệu lên đến hàng nghìn dòng thì bác cần Copy dữ liệu sau khi điền công thức sau đó Paste lại bằng phương thức: PasteSpecial (xlPasteValues). VD: ActiveCell.PasteSpecial (xlPasteValues)

ptm0412
12-12-07, 11:29 PM
Cái này là mình bị rồi mới biết:
Hàm replace() của VBA không giống replace() của Excel mà giống y substitute(): replace(string, oldstring, newstring).
Chủ đề này rất hay vì khi biết các hàm tương đương của VBA tương ứng với hàm nào của Excel, mình xách function VBA trong Excel đi xài trong Access được. Mong các bạn nối tiếp.

SA_DQ
13-12-07, 07:32 AM
Macro sau sẽ thay toàn bộ danh sách tại cột B (từ B2) những từ lỡ nhập
Nguyễn T. An => Nguyễn Thị An
Lê V. Thanh => Lê Văn Thanh
Trần t. Nu => Trần thị Nu



Option Explicit
Sub ThayDem()
Dim Rng As Range, iJ As Long, lRow As Long, bVTri As Byte
' Dòng cuối cột "B" : '
lRow = Cells(65432, 2).End(xlUp).Row

For iJ = 2 To lRow
Set Rng = Cells(iJ, 2)
bVTri = InStr(Rng, ".")
If bVTri > 0 Then
7 ' Rng.Offset(, 1) = ThayChu(Rng, bVTri) '
8 Rng.Offset(, 1) = Replace(Rng, ".", ChuCai(Mid(Rng, bVTri - 1, 1)))
End If
Next iJ
End Sub


Function ChuCai(StrC As String) As String
ChuCai = UCase$(ChuCai)
If StrC = "T" Then
ChuCai = "h?"
ElseIf StrC = "V" Then
ChuCai = "?n"
Else
ChuCai = ""
End If
End Function

Bạn nào thử viết hàm ThayChu() (Tại dòng lệnh 7)
để có thể thay thế cho dòng lệnh 8 dùm nha!

ptm0412
18-12-07, 11:06 PM
Coi như bài tập, tớ giải thử, bạn xem giúp nhé


Sub ThayDem()
Dim Rng As Range, iJ As Long, lRow As Long, bVTri As Byte
Dim Tat(1 To 3), The(1 To 3) As String
lRow = Cells(65432, 2).End(xlUp).Row
Tat(1) = "T."
The(1) = "Thi"
Tat(2) = "H."
The(2) = "Huu"
Tat(3) = "V."
The(3) = "Van"
For iJ = 2 To lRow
Set Rng = Cells(iJ, 2)
bVTri = InStr(Rng, ".")
For iK = 1 To 3
If Mid(Rng, bVTri - 1, 2) = Tat(ik) Then
Rng.Offset(, 1) = Replace(Rng, Tat(ik), The(ik))
End If
Next iK
Next iJ
End Sub

Bạn xem giúp: Tại sao nếu không có If, kết quả chỉ thay 1 trong số 3 giá trị của Tat() bằng The() ? Thí dụ chỉ thay V. bằng Van, các chữ khác không thay?

SA_DQ
19-12-07, 08:02 AM
. . . xem giúp: Tại sao nếu không có
If Mid(Rng, bVTri - 1, 2) = Tat(ik) Then

End If
thì kết quả chỉ thay 1 trong số 3 giá trị của Tat() bằng The() ? Thí dụ chỉ thay V. bằng Van, các chữ khác không thay?
Bạn thử thêm câu lệnh sau, để kiểm tra các biến í mà!

MsgBox Tat(iK) , , iK

ptm0412
19-12-07, 08:47 AM
Hiểu rồi, thank bạn. Là do Replace thay đủ 3 lần, chữ "Van" là phần tử thứ 3 thay sau chót nên còn giữ kq, các phần tử khác thay xong lại bị thay bằng thứ khác, không có thứ khác thì để nguyên.

ptm0412
19-12-07, 09:04 AM
Hoặc thêm 1 biến tạm Newvalue:

' Phần code chính
For iJ = 2 To lRow
Set Rng = Cells(iJ, 2)
bVTri = InStr(Rng, ".")
Newvalue = Rng
For iK = 1 To 3
Newvalue = Replace(Newvalue, Tat(iK), The(iK))
Next iK
Rng.Offset(, 1) = Newvalue
Next iJ

connhangheo
20-12-07, 03:50 PM
em được học là hàm trong excel và trong VBA là khác nhau. Trong VBA muốn sử dụng hàm trong excel thì dùng thuộc tính worksheetFunction, còn muốn biết các hàm trong VBA sử dụng như thế nào thì vào xem help: F1/Microsoft Visual Basic Documentation/Visual Basic Language Reference/Functions (tất cả các hàm trong VBA đều có hết)

thanhdt15
29-03-10, 03:47 AM
Ai có thể cho mình biết đoạn chương trình này làm gì vây? mong lắm những dòng hồi âm


Private Sub SwapQuestions()
Dim i As Integer
Dim ran As Integer
Dim arr() As Integer
ReDim arr(intTotalQues)

For i = 1 To intTotalQues
arr(i) = i
Next i

For i = 1 To intTotalQues
Randomize
ran = Int(UBound(arr) * Rnd + 1)
arrSTT(i) = arr(ran)
DeleteArrayElement arr, ran
Next i
'MsgBox "zzz"

End Sub