You are on page 1of 9

1.

Tng tc cho code VBA ca bn


1. Tt cc ch cp nht mn hnh v cc ch khc tng tc thc hin code


Code:
Option Explicit
Public glb_origCalculationMode As Integer
Sub SpeedOn(Optional StatusBarMsg As String = "Running macro...")
' Ch : y cc bn c th thay i thng bo
' bng cch truyn vo chui UNICODE vo bin StatusBarMsg
glb_origCalculationMode = Application.Calculation
With Application
.Calculation = xlCalculationManual
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
.Cursor = xlWait
.StatusBar = StatusBarMsg
.EnableCancelKey = xlErrorHandler
End With
End Sub
Sub SpeedOff()
With Application
.Calculation = glb_origCalculationMode
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
.CalculateBeforeSave = True
.Cursor = xlDefault
.StatusBar = False
.EnableCancelKey = xlInterrupt
End With
End Sub
Sub FillSlow()
Dim c As Range, r As Range, startTime, EndTime
Set r = Range("A1:C1000")
r.ClearContents
startTime = Timer
For Each c In r
c.Select
c.Formula = "=Row()*Column()"
Next c
DoEvents
EndTime = Timer
MsgBox "Total Time: " & EndTime - startTime
[A1].Select
End Sub
Sub FillFast()
Dim c As Range, r As Range, startTime, EndTime
Set r = Range("A1:C1000")
r.ClearContents
startTime = Timer
On Error Goto ResetSpeed
SpeedOn
For Each c In r
c.Select
c.Formula = "=Row()*Column()"
Next c
DoEvents
EndTime = Timer
MsgBox "Total Time: " & EndTime - startTime
[A1].Select
ResetSpeed:
SpeedOff
End Sub
Ngun t y.

Cch dng:
Xin xem v d FillSlow v FillFast trn.
Bn s gi th tc tng tc khi thc hin cc on m bng cch gi th tc SpeedOn v gi li th
tc SpeedOff mi khi bn hon tt.

Ch :
Nu cc on m ca bn c s dng kt qu tnh ton ca mt cng thc, th bn nn xem xt hoc
chnh sa cc th tc trn cho ph hp vi cng vic ca mnh.

L Vn Duyt
1. 2. Truy cp n mt trong vng - Accessing Cells In A Range

Gi s ti c d liu ti Sheet1, vng
Code:
A1:B10
, v ti t tn l "MyRange", ti mun tham chiu n B5:

Nguyn vn bi Bi ton t ra
Lm th no tham chiu n cc trong (mang tnh tng i, s gii thch phn sau) vng d liu
A1:B10 (tn MyRange) l nhanh nht?
Cu tr li:
Thay v tham chiu

Code:
Range("MyRange").Cells(5,2)
ta dng

Code:
Range("MyRange")(5,2)
Ngoi ra khi tham chiu n A1, cc bn c th dng code
Cch 1:
Code:
Range("A1")
hoc
Cch 2:
Code:
[A1]
Trong hai cch trn, cch 2 ngn gn hn nhng s chm hn cch 1.


Ni thm v tham chiu kiu ny:

Code:
Range("A1:B10")(5,2) ' Tham chiu n B5
Range("A1:B10")(1,1) ' Tham chiu n A1
Range("B2:C10")(0, 0) ' Tham chiu n A1, cc bn ch !
Range("C3:D10")(-1, -1) ' Tham chiu n A1, cc bn ch !
Range("A1:B10")(5,2)(5,2) ' Tham chiu n C9
Range("A1:B10")(5,3) ' Tham chiu n C5
Range("A1:B10")(12,13) ' Tham chiu n M12

Range("A1:B10")(1) ' Tham chiu n A1
Range("A1:B10")(2) ' Tham chiu n B1
Range("A1:B10")(3) ' Tham chiu n A2
Range("A1:B10")(4) ' Tham chiu n B2
Vic tham chiu khi dng mt s (Range("A1:B10")(3)) s i t tri qua phi, sau xung mt hng v
li tip tc t tri qua phi.

Di chuyn theo hng:

Code:
Range("D4")(1) ' Tham chiu n D4
Range("D4")(2) ' Tham chiu n D5
Range("D4")(3) ' Tham chiu n D6
Di chuyn theo ct:

Code:
Range("D4").Columns(1) ' Tham chiu n D4
Range("D4").Columns(2) ' Tham chiu n E4
Range("D4").Columns(3) ' Tham chiu n F4
Cc bn c th c thm bi vit v cc kiu tham chiu ti y.

3. Khi tham chiu n mt sheet - Collection Indexes:

Khi tham chiu n mt sheet bn c th tham chiu bi Tn hoc S nh,
Cch 1:

Code:
Worksheets("Sheet1")
Cch 2:

Code:
Worksheets(1)
Tham chiu cch 2 s nhanh hn. Nhng ch , s tham chiu ny c th s thay i, chnh v iu
ny an ton th tham chiu cch mt vn an ton hn v d thay i hn.

4. Khai bo sm - Early Binding:

i khi khi lp trnh chng ta s tham chiu n mt s i tng th vic khai bo sm (Early Binding:
c th hiu l tng minh, v nu bn khai bo l Object (i tng), th chng trnh phi mt thi gian
d tm) s nhanh hn.
V d sau ti tham chiu n i tng Word:
Th khai bo sau

Code:
Dim WordObj As Word.Application
s gip thc thi nhanh hn

Code:
Dim WordObj As Object
5. Ch khi dng vng lp FOR EACH:
Bn nn dng vng lp FOR EACH nh sau:

Code:
Dim WS as Worksheet
For Each WS In Worksheets
MsgBox WS.Name
Next WS
thay v dng

Code:
Dim i as Integer
For i = 1 To Worksheets.Count
MsgBox Worksheets(i).Name
Next i

6. Trnh s dng SELECT:
Gi s ti c nhiu shape trn mt sheet, ti mun a ch "Hello" vo cc shape ny.

Thay v s dng SELECT

Code:
For i = 0 To ActiveSheet.Shapes.Count
ActiveSheet.Shapes(i).Select
Selection.Text = "Hello"
Next i
thif ti dng trc tip nh sau, s nhanh hn

Code:
For i = 0 To ActiveSheet.Shapes.Count
ActiveSheet.Shapes(i).TextEffect.Text = "Hello"
Next i
7. c v ghi trn mt khi d liu ln :
Vn ny, ngi vit cng tng gp, nht l khi phi lm vic vi khi d liu ln. V d nh: khi
vit chng trnh ly d liu t tp tin Excel t Visual Basic 6.
Khi vit code, bn cn ch lm gim thiu vic truyn d liu t Excel v code ca bn.
Code 1:

Code:
Dim DataRange As Range
Dim Irow As Long
Dim Icol As Integer
Dim MyVar As Double
Set DataRange = Range("A1:C10000")

For Irow = 1 To 10000
For Icol = 1 To 3
MyVar = DataRange(Irow, Icol) ' c gi tr t Excel
If MyVar > 0 Then
MyVar = MyVar * MyVar ' Thay i cc gi tr
DataRange(Irow, Icol) = MyVar ' a cc gi tr ngc vo
Excel
End If
Next Icol
Next Irow
Code 2:


Code:
Dim DataRange As Variant
Dim Irow As Long
Dim Icol As Integer
Dim MyVar As Double
DataRange = Range("A1:C10000").Value ' c tt c cc gi tr t
Excel mt ln, v a vo mng

For Irow = 1 To 10000
For Icol = 1 To 3
MyVar = DataRange(Irow, Icol)
If MyVar > 0 Then
MyVar = MyVar * MyVar ' Thay i cc gi tr trong
mng
DataRange(Irow, Icol) = MyVar
End If
Next Icol
Next Irow
Range("A1:C10000").Value = DataRange ' a li cc gi tr t mng
vo Excel mt ln
Code 2 s nhanh hn. Vy cc bn ch cc code sau:

Code:
DataRange = Range("A1:C10000").Value
Code:
Range("A1:C10000").Value = DataRange
v khai bo bin l kiu Variant

Code:
Dim DataRange As Variant
s lm cho chng trnh ca bn nhanh hn.

i khi ngi ta cn dng hm sau (cng ch l vn ti ni trn)

Code:
Function ExcelToVBA(Rng As Range)
Dim Arr As Variant
Arr = Rng.Value
End Function
Ngoi ra, cc bn nn tham kho topic bn v cch lm vic vi mng ti y.

8. S dng cc hm sn c ca Excel:

Nn dng cc hm sn c ca Excel. V d sau dng hm SUM cho vng A1:A100

Code:
MySum = Application.WorksheetFunction.Sum(Range("A1:A100"))
Bn ng vit li code nh sau:

Code:
For Each C In Range("A1:A100")
MySum = MySum + C.Value
Next C
9. Trnh s dng Application.Volatile khi c th

10. Trnh s dng OFFSET, nn dng ging nh mc 2

Tng hp.
L Vn Duyt
1. 11. S dng cc kiu d liu ph hp vi nhau:
VBA qu d gii, chnh v th m i khi trong cc on m chng ta li i so snh hai bin
khng h ging nhau. trnh nhng li ng tic xy ra, trc khi truyn bin cho mt th
tc, hay gn mt bin cho mt bin khc, lun lun phi chc chn rng cc kiu bin ca chng
phi ging nhau.

12. Thc hin chuyn i trc tip, thay v phi VBA t quyt nh:
Khi hai bin khng cng kiu d liu, bn nn thc hin vic chuyn i kiu d liu nh CStr(),
CDbl() vv... Bng vic thc hin ny, bn s gip tit kim thi gian thay v phi VBA a ra
quyt nh.

13. S dng Len(chui)=0 thay v dng chui ="":
VBA lu tr chui trong b nh bng vic lu chiu di ca chui, c theo sau bi cc k t
chui ny cha.
Chnh v vy vic so snh chiu di ca chui nh Len(chui)=0 s nhanh hn.

14. S dng Left$, Right$, Mid$ ... thay v dng Left, Right v Mid

You might also like