Tự học AutoCAD các phiên bản - Miễn phí 100%



. . . . . . . . . . . . . . PH?N M? ??UMicrosoft excel là m?t c?ng c? m?nh dùng trong vi?c ph?n tích & trình bày các th?ng tin. Th? m?nh c?a b?ng tính excel, ngoài các c?ng th?c s?n có, còn là macro c?a nó.K? t? khi xu?t hi?n version 5.0 ??n nay, ng?n ng? dùng trong excel là Visual Basic for Applications (VBA). ?ó là ng?n ng? l?p trình dùng chung cho nhi?u ph?n m?m trong windows.Quy?n ghi chép này s? nh?m gi?i thi?u cách th?c làm quen v?i macro, và cách th?c tu?n t? chinh ph?c ng?n ng? VBA trong excel.Bài 1: Nh?ng macro ??n gi?n nh?t1. B? thu macroNg?n ng? macro là m?t ng?n ng? l?p trình th?t s?. Nh?ng m?t trái c?a s? m?nh m? này là làm cho ta kh?ng d? ??c & hi?u ngay ???c.?? b??c ??u làm quen v?i nó ta nh? b? thu macro, b? thu này lu?n có s?n trong excel. Nó giúp b?n t?o ra nh?ng tác ph?m ??u tay và r?t th?c t?. ?? r?i sau ?ó ta s? t?o ra nh?ng macro ph?c t?p, th?c hi?n nh?ng c?ng vi?c theo s? thích c?a b?n! 2. T?o macro ??u tayKhi th?c hành v?i excel, chúng ta ??i lúc c?ng ph?i ??nh d?ng d?y ? nào ?ó. Mu?n d?y bi?u th? d?ng ti?n VN? kh?ng có s? l?, ta ch?n d?y ?; v? menu Format -> Cells; ->Number ta ch?n Currency trong h?p tho?i Category; trong h?p Decimal places ta ch?n giá tr? 0; trong h?p Symbol ta ch?n None; cu?i cùng trong h?p Negative numbers ta ch?n hàng th? ba (?ang là (1.2340)) và nh?p v? nút OK ?? tr? v? trang tính Excel m?c ??nh d?ng th?c ti?n có hai s? l?. Trong th?c t? nhi?u khi kh?ng c?n nhi?u s? l? ??n v?y!. Chúng ta t?o m?t macro ?? ??nh d?ng ? theo ki?u ti?n kh?ng có s? l?.a./ Chu?n b?:Ta quét ch?n các ? t? A2 ??n A9; b?n chu?t lên thanh c?ng th?c và nh?p các hàm sau:= INT(9 * RAND()) ^ 8 và k?t thúc b?ng t? h?p hai fím CTRL+ENTER b./ T?o macroV? menu Tool -> Macro ->Record New Macro. . .; c?a s? New Macro xu?t hiên; Trong h?p Macro Name ta nh?p FormatCurrency và nh?p nút OK. Trên màn hình s? hi?n thêm thành ph?n thanh Toolbar c?a macro. Chúng ta b?t ??u th?c hi?n vi?c ghi v? b? thu macro:(V?i các ? A2:A9 ?? ch?n), v? menu Format -> Cells. . . và ch?n ng?n Number; Ti?p theo ch?n Currency trong h?p tho?i Category; trong h?p Decimal places ta ch?n giá tr? 0; trong h?p Symbol ta ch?n None; cu?i cùng trong h?p Negative numbers ta ch?n hàng th? ba (?ang là (1.2340)) và nh?p v? nút OK ?? tr? v? trang tính. K?t thúc ghi macro b?ng cách nh?p v? nút close trên thanh Toolbar c?a macro v?a xu?t hi?n Chú ?: M?t s? thao tác có th? có nhi?u cách ?? ??t ???c; thí d? t? h?p phím CTRL +1 s? nhanh chóng ??a ta ??n h?p tho?i Format Cells; Ta c?ng có th? k?t thúc ghi macro khi ch?n trên menu Tool -> macro -> Stop Recording; Trong ph?n ghi chép này ch? ghi m?t cách th?c (còn các cách khác ta t? áp d?ng)Tác ph?m ??u tay ?? xong; Chúng ta nóng ru?t mu?n bi?t ??a con tinh th?n nó hình hài ra sao & s? ch?y nh?y nh? th? nào!?? xem hình hài ta v? menu Tool -> Macro; trong danh sách li?t kê nó là tên duy nh?t mà ta ?? ?n ??nh: FormatCurrency; N?i dung nó nh? sau:Code:Sub FormatCurrency()' FormatCurrency Macro' Macro recorded 10/10/2006 by Quai Dang' Selection.NumberFormat = "#,##0_);(#,##0)"End Sub Th?c ra ch? có ba dòng l?nh trong macro là quan tr?ng th?i; các dòng có d?u nháy ??u dòng là nh?ng ghi chú, nh?c chúng ta fút nó chào ??i nh?: tên, tu?i , fím nóng ?? v?n hành . . .c./ Ch?y macro ?? bi?t nó ?i ??ng ra sao ta quét ch?n vài ? d? li?u s? trên trang tính; v? menu Tool -> Macro -> Macros; ch?n tên macro và ?n nút Run d./ Gán t? h?p phím t?t cho macroV? menu Tool -> Macro -> Macros; c?a s? Macro xu?t hi?n tr? l?i; Phía ph?i c?a c?a s? (CS), ngoài nút Run m?i quen, còn có các nút khác mà ta s? d?n làm quen. Và nút k? ti?p ta làm quen là Option; Ta nh?p v? nó ?? hi?n lên CS Macro Option; Ta b?m chu?t v? ? Shortcut key; ?n gi? phím Shift và nh?n ti?p phím 'F'. (Nh? v?y là ta gán cho macro FormatCurrency t? h?p 3 fím CTRL+SHIFT+FChú ?: T?t nhiên ta c?ng có th? kh?ng gi? fím Shift; nh?ng vi?c ?ó l?i b?t c?p h?i vì d? g?y xung ??t!Chú ?: Ta c?ng có th? gán t? h?p phím nóng ngay t? ??u, sau khi ??t tên: Khi ?ó ta c?ng ?? th?y CS Shortcut key trong h?p tho?i Record Macro3. Macro thay ??i nhi?u thu?c tính a./ Chu?n b?: Nh?p v? ? B2 chu?i sau: 'T?ng h?p s? li?u tháng 10/06'. Ch?n ? B2 này;b./ Thu macro:V? menu Tool -> Macro ->Macros . . . Trong CS Macro name nh?p tên: 'DinhDangTieuDe'; Trong CS Shortcut key ta gi? phím Shift & nh?n phím 'D' và nh?n nút OK ?? ghi macro m?i..Khi ? B2 v?n ???c ch?n, v? menu Format -> Cells. . .Ti?p theo v? ng?n Aligment; Trong CS Text aligment ta ch?n t?i c? hai CS Horizontal & Vertical ??u là Center; Sau ?ó ?n nút OK ?? tr? v? trang tính; Ta quét ch?n các ? t? B2 ??n F2; Sau ?ó nh?p v? nút Merge and Center ?? tiêu ?? canh gi?a c?a các ? li?t kê. K?t thúc vi?c ghi macro DinhDangTieuDe b?ng 1 trong các cách nêu trên.?? xem n?i dung macro ta nh?n ??ng th?i hai phím ALT + F6 ?? m? CS Macro và ch?n tên DinhDangTieuDe; xong r?i ?n ch?n nút Edit ?? hi?n màn hình Microsoft Visual Basic có ch?a ?o?n code sau:Code:Sub DinhDangTieuDe()'' DinhDangTieuDe Macro' Macro recorded 10/10/2006 by Quang Duc' Keyboard Shortcut: Ctrl+Shift+D Range("B2").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Range("B2:F2").Select With Selection .HorizontalAlignment = xlCenter .WrapText = False .Orientation = 0 .AddIndent = False .IndentLevel = 0 .ShrinkToFit = False .ReadingOrder = xlContext .MergeCells = False End With Selection.MergeEnd SubCái macro tr??c th?c t? ch? có m?t dòng l?nh; nh?ng macro này r?t nhi?u dòng l?nh.c./ B??c ??u tác ??ng lên macro:Tr??c tiên , ta bi?t các dòng có d?u nháy ??n ??u dòng lá nh?ng dòng chú thích; ta b? h?n 5 dòng. (Ch? ?? dòng ' Keyboard Shortcut: Ctrl+Shift+D). Nh?ng c?t nó dán sau 2 d?u ngo?c ??n; c?a dòng Sub DinhDangTieuDe() Ta v? menu Debug và ch?n thanh Compile VBAProject; N?u chúng ta kh?ng th?y C?a S? th?ng báo l?i nào thì ta bi?t r?ng VBA ch?p nh?n nh?ng thay ??i c?a chúng ta (ch?ng t? kh?ng có l?i biên d?ch.)H?n n?a ta l?i bi?t thêm r?ng, các chú thích có th? ngay sau c?u l?nh, mi?n tr??c nó có d?u nháy ??n;Ti?p theo ta th?c hi?n ?ánh s? v? các dòng l?nh và sau ?ó m?nh d?n b? các dòng l?nh t? 5 ??n 11. Ta l?i th?c hi?n ki?m l?i biên d?ch nh? menu Debug nh? nêu trên; N?u kh?ng ???c báo l?i nào, ta yên t?m b?m nút l?u l?iTi?p m?t b??c xa h?n, ta ??t d?u nháy tr??c các s? c?a các dòng l?nh t? 14 ??n 23. T?c là ta v? hi?u các dòng l?nh này m?t cách t?m th?i;Th?c hi?n phép th? macro l?n cu?i, nh? sau:Xoá nguyên dòng 2 ch?a ??nh d?ng mà macro ?? th?c hi?n; Nh?p dòng khác thay th? (VD: 'B?O C?O T?NH H?NH TH?NG TR??C.' và th? ch?y macro DinhDanhTieuDe; N?u nó v?n làm vi?c theo ?úng nh? lúc ch?a s?a gì là ? kê! Code:Sub DinhDangTieuDe() ' Keyboard Shortcut: Ctrl+Shift+D1 Range("B2").Select2 With Selection3 .HorizontalAlignment = xlCenter4 .VerticalAlignment = xlCenter12 End With13 Range("B2:F2").Select14 With Selection15 .HorizontalAlignment = xlCenter16 .WrapText = False17 .Orientation = 018 .AddIndent = False19 .IndentLevel = 020 .ShrinkToFit = False21 .ReadingOrder = xlContext22 .MergeCells = False23 End With24 Selection.MergeEnd SubNh? v?y, macro c?a chúng ta ch? còn là:Code:Sub DinhDangTieuDe() ' Keyboard Shortcut: Ctrl+Shift+D Range("B2").Select With Selection .HorizontalAlignment = xlCenter .VerticalAlignment = xlCenter End With Range("B2:F2").Select Selection.MergeEnd Sub d./ ??c & di?n d?ch n?i dung các c?u l?nh:Macro ???c b?t ??u b?ng t? Sub (t?m hi?u là t? vi?t t?t c?a Subroutine); & dòng cu?i c?a macro là End Sub; Macro lu?n có tên, (VD ta ?? có DinhDangTieuDe & FormatCurrency); H?n n?a tên ph?i tu?n th? m?t quy lu?t nghiêm:Kh?ng g?m các kho?ng tr?ng, kh?ng là các k? s? ? ??u tên.. . ( vi?c này VBA s? truy?n ??t cho b?n r?, m?t khi b?n kh?ng tu?n th?!)Macro DinhDangTieuDe th?c ra làm hai c?ng vi?c: - Ch?n ? B2 & ??nh d?ng canh gi?a theo chi?u ngang & chi?u d?c;- Canh gi?a ?o?n v?n b?n trên toàn b? các ? "B2:F2"Vì m?t l? do nào ?ó, chúng ta có th? vi?t hai dòng l?nh trên m?t hàng, nh?ng ph?i cách nhau b?ng d?u hai ch?m ':'Range("B2:F2").Select: Selection.Merge Ng??c l?i, v?i c?u l?nh quá dài, chúng ta có th? b? trí trên nhi?u dòng; lúc này d?u ngang d??i '_' ???c nh?p cu?i dòng trên ?? báo cho VBA bi?t r?ng dòng l?nh còn ti?p theo ? dòng d??i. Ta xem xét ??n ví d? macro dùng ?? x?p danh sách theo tên ("C1"), nh? sauCode:Sub SortByName() Columns("A:C").Select Selection.Sort Key1:=Range("C1"), Order1:=xlAscending, Key2:=Range("A1") _ , Order2:=xlAscending, Key3:=Range("B1"), Order3:=xlAscending, Header:= _ xlGuess, OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _ DataOption1:=xlSortNormal, DataOption2:=xlSortNormal, DataOption3:= _ xlSortNormalEnd SubNh? v?y, c?u l?nh th? hai trong macro tr?i dài qua 5 dòng & n?i k?t v?i nhau b?ng d?u g?ch d??i (chú ? có kho?ng tr?ng tr??c nó)C?u l?nh này ???c hi?u nh? sau:T?i ba c?t A-C ?? ch?n (? c?u l?nh tr??c ?ó), h?y x?p theo h??ng t?ng d?n giá tr? t?i c?t C;Ti?p theo là x?p theo th? t? t?ng d?n các giá tr? t?i c?t A;Và cu?i cùng là x?p theo c?t B c?ng theo chi?u t?ng d?n ;Bài t?p c?a bài 1:+ T?o macro ?? xoá thanh trang b?ng tính (sheet tab): Th??ng thanh này n?m trên thanh cu?n ngang, Ta có th? v? menu Tool-> Option -> View r?i b? ch?n h?p Sheet Tabs+ Chuy?n c?ng th?c thành giá tr?: T?i trang tính ?? chu?n b? ghi macro ??u tiên ta có c?ng th?c = INT(9 * RAND()) ^ 8 t?i các ? c?t A; B?n th? l?p macro chuy?n các ? t? A2 ??n A9 này thành giá tr?!+ T?i c?t D, b?t ??u t? D1, D2 ta nh?p t??ng ?ng 1 & 2T?i c?t E k? bên ta nh?p 1 & 4; T?i c?t F ta nh?p F1 là 36; F2 là 100H?y t?o macro ?? th?c hiên các hành ??ng sau: Ch?n vùng t? D1:F2; v? menu Edit -> Copy; Sau ?ó ch?n ? D4 và c?ng v? menu Edit -> Paste Special; t?i CS Paste Special ta ?ánh d?u h?p ki?m Transpose; sau khi dán xong ta nh?n phím ESC ?? b? vùng ch?n.+ T?i trang b?ng tính c?a VD 3; thi?t l?p macro ghi l?i nh?ng hành ??ng sau:Ch?n ? A1, v? menu Edit -> Go to; Trong h?p tho?iBài ??c thêm Xem t?i ??yBài 2: Nh?ng macro ph?c t?p h?n1. T?ng ??ng lo?t ti?n th??ng cho m?t danh sáchG?n cu?i tháng s?p yêu c?u b?n l?p danh sách ti?n th??ng c?a toàn c? quan, kèm theo l?nh: "T?ng 15% so v?i tháng tr??c;N?u tháng nào s?p c?ng ch? ??o t?ng hay gi?m ti?n th??ng so v?i tháng tr??c, thì ??y là mi?ng ??t màu m? ?? macro ho?t ??ng;V?n ?? là b?n ?? có danh sách CNV trong toàn c? quan. Trong ?ó, c?t F, k? t? F3 là d? li?u ti?n th??ng tháng tr??c. B?n nên thu m?t macro ?? s? d?ng cho các tháng sau v?i nh?ng hành ??ng nh? sau:* V? menu Tool -> Macro -> Record New Macro. . . . T?i c?a s? (CS) Record Macro ta nh?p Thuong (là tên macro), xong OK* Quét ch?n t? ? G3 ??n ? G99 (? ch?a ng??i cu?i cùng trong danh sách c? quan)* B?m chu?t lên thanh c?ng th?c và nh?p d?u b?ng ( '='), dùng tr? chu?t ?n v? ? F3, sau ?ó nh?p ti?p d?u nh?n '*' và giá tr? 1,15 (nh? ? c?a s?p). K?t thúc vi?c nh?p li?u b?ng hai phím CTRL+ENTER* V?n nh?ng ? ???c ch?n, ta v? menu Edit -> Copy; Sau ?ó th?c hi?n Paste Special; Trong CS Paste Special ta ?ánh d?u ki?m t?i dòng Value* C?ng ?o?n cu?i cùng là c?t toàn b? d? li?u c?t G này dán lên c?t FTa thu ???c macro có n?i dung sau (?? thu g?n các dòng l?nh ng?n):Code:Sub Thuong() Range("G3:G95").Select Selection.FormulaR1C1 = "=RC[-1]*1.15" Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False: Selection.Cut Range"F").Select: ActiveSheet.PasteEnd Sub2. Th?c hi?n vi?c thêm v? macro:Macro Thuong còn nh?ng b?t ti?n: - N?u c? quan t?ng ng??i thì ph?i s?a l?i dòng l?nh ??u;- L??ng t?ng gi?m ti?n th??ng là theo ? ch? quan c?a s?p (doanh nghi?p t? nh?n)V?n ?? ??u h?i d? gi?i quy?t, ta c? vi?c ?n ??nh th?a lên; thay vì G95 ta nh?p G450, Vi?c này c?ng ch?a ph?i t?i ?u, nh?ng t?i th?i ?i?m này nên ch?p nh?n gi?i pháp. ??i khi nào sau này trình ?? ta khá lên, s? gi?i m?t cách c?n c? h?n!?? gi?i quy?t v?n ?? còn l?i, ta th?c hi?n t?ng b??c nh? sau:T?i dòng l?nh ??u tiên ta nh?p ti?p d?u hai ch?m (':'), sau ?ó ?n m?t l?n phím {TAB} và thêm chu?i: dim StrC as string; ?? k?t thúc, nh?n ENTER.N?u excel s?a l?i cho ta, tr? thành nh? sau là ?úng: Range("G3:G450").Select: Dim StrC As StringT?i dòng tr?ng ta v?a t?o ra, ta nh?p c?u l?nh:ctrc = inputbox("HAY NHAP HE SO: ")Sau khi ENTER, nh?p ti?p dòng sau:strc = "=RC[-1]*" & strcCu?i cùng ta s?a l?i dòng l?nh k? ti?p tr? thành:Selection.FormulaR1C1 = strcKhi ?ó macro có n?i dung nh? sau:Code:Sub Thuong() Range("G3:G15").Select: Dim StrC As String StrC = InputBox("HAY NHAP HE SO: ") StrC = "=RC[-1]*" & StrC Selection.FormulaR1C1 = StrC Selection.Copy Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=False Application.CutCopyMode = False Selection.Cut Range("F3").Select ActiveSheet.PasteEnd SubChú ?: * C?u l?nh ??u tiên mà ta thêm v? macro là c?u l?nh khai báo v?i VBA r?ng t?i s? s? d?ng bi?n có tên là StrC, ki?u chu?i. C?u l?nh th? n?a s? là: H?y l?y giá tr? cho bi?n StrC là giá tr? t?i nh?p v?; c?u ti?p d?ch n?m na là: h?y n?i bi?n chu?i t?i v?a nh?p v? sau chu?i t?i ghi; Và cu?i cùng (c?u l?nh ta s?a): h?y gán giá tr? bi?n mà t?i khai báo & thi?t l?p, tr? thành c?ng th?c c?a ? hi?n hành;* Khi khai báo m?t tên bi?n, ta nên vi?t c? ch? hoa & ch? th??ng, nh? v?y ta t?n d?ng ???c l?i th? s?n có c?a ch??ng trình ki?m l?i chính t? c?a VBA; ? tr??ng h?p này là StrC;Tuy là khai báo nh? v?y, nh?ng khi nh?p tên bi?n ta c? nh?p kh?ng theo nh? v?y, và nh? VBA s? s?a cho ta, là m?t d?p ?? ki?m tra phát hi?n l?i chính t? do nh?p sai tên bi?n. Tên bi?n c?ng kh?ng ???c ch?a các kí t? toán h?c & kh?ng ???c dài quá 64 kí t?* V? ki?u c?a bi?n thí có r?t nhi?u; ??n ??y ta ch? c?n bi?t nh?ng ki?u hay th??ng dùng:Ki?u Byte là ki?u s? nguyên, mi?n giá tr? t? 0 ??n 255Ki?u Boolean: là ki?u logic, lo?i này ch? nh?n m?t trong hai giá tr?: True & FalseKi?u Integer: S? nguyên, mi?n giá tr? t? -32768 ??n 32767Ki?u Long: C?ng là s? nguyên có mi?n l?n h?n: -2.147.483.648 ??n 2.147.483.647Ki?u Currency: ti?n t?;Ki?u Double: ki?u s? th?c, ???c ch?a trong 8 byte ? nh?Ki?u String: ki?u chu?i k? t?, mi?n l?u gi? có th? t?i ?a là 65.400 k? t?* L?nh gán, trong ng?n ng? VBA dùng d?u = làm l?nh gán; Ví d? sau khi khai báo bi?n StrC nh? trên, ta có th? dùng l?nh gán: StrC = "=RC[-1]*"; ? ??y hai d?u nháy kép ch? ?? bao m?t chu?i c?n gán v? bi?n.* Trong macro có hàm InputBox( ". . ."). Hàm này làm xu?t hi?n h?p tho?i, nh?n giá tr? chu?i mà ta nh?p v? nó. Trong tr??ng h?p này nó s? gán v? bi?n StrC giá tr? mà ta nh?p v?;* Trong c?u l?nh dài, chi?m 2 dòng ?ó, ta có th? v? hi?u hoá ?o?n cu?i, k? t? d?u ',' th? hai b?ng cách thêm d?u nháy tr??c nó; Khi ?ó dòng hai c?a c?u l?nh s? b? t? ??, báo cho ta bi?t s? b?t ?n trong nó; S? vi?c là do ta ?? v? hi?u hoá lu?n c? d?u n?i 2 dòng l?nh. ?? kh?c ph?c, ta nh?p thêm d?u nháy ??n v? ??u dòng b? t? ?? ?ó là ???c; Cu?i cùng, tr??c khi ch?y tác ph?m, ta nên v? menu Debug và ch?n dòng Compile VBAProject, còn ?? làm chi b?n ?? bi?t r?i.Tr??c khi ch?y macro m?i ta th?c hi?n vi?c gán phím t?t CTRL+SHIFT+T cho nó; Có th? có b?n h?i, nh?ng ?i?u này là b?t bu?c?, kh?ng, hoàn toàn t? nguy?n, nh?ng nên nh? v?y. C?ng gi?ng nh? ta kh?ng nên ?i b? b?ng m?t ch?n trên v?a hè & m?t ch?n d??i lòng ???ng.3./ Tính toán các giá tr? trong m?t c?tTa xét tr??ng h?p m?t ??n v? hành chính s? nghi?p c?n l?p danh sách th??ng ??nh k?; ?? th??ng theo h? s? ??n v? và h? s? thành tích cá nh?n, ng??i ta ?? l?p b?ng d? li?u g?m các tr??ng: [Ma], [Ho], [Ten], [MDV], [XL], [TThuong] (6 c?t b?t ??u t? A ). Nhi?m v? c?a macro là tính s? ti?n th??ng c?a m?i cá nh?n t??ng ?ng v?i h? s? cá nh?n và h? s? ??n v? (t?i c?t 'F') v?i s? tr? giúp c?a b?ng ???c ??t tên là HeSo. B?ng HeSo này g?m 3 c?t & 5 dòng. C?t th? hai ghi h? s? th??ng c?a các ??n v?; C?t th? ba ghi s? ti?n th??ng cá nh?n t??ng ?ng v?i danh hi?u thi ?ua ??t ???c?? b?t ??u thu macro ta c?ng v? menu Tool -> Macro -> Record New Macro & ??t tên macro là Tinh_Thuong.Trên trang tính ta ch?n ? F6, n?i c?n xu?t hi?n ti?n th??ng c?a ng??i ??u tiên trong danh sách. Ti?p theo v? menu Insert -> Function. . .. Trong CS Insert Function v?a xu?t hi?n, ta nh?p tên hàm là VLOOKUP và nh?n nút Go và ch?n trong CS Select a function hàm VLOOKUP().Khi b?ng tr? giúp hàm này xu?t hi?n, ta th?y d?u nh?c ?ang ? ? Lookup_Value, ta nh?p chu?t v? ? D6 ( ch?a m? ??n v? c?a ng??i ??u tiên); Trong ? Table_array ta nh?p HeSo; cu?i cùng trong ? Col_Index_Num ta nh?p s? 2; Xong ta ENTER ?? v? trang tính;Ta tr? chu?t l?i lên thanh c?ng th?c; nh?p d?u nh?n '*' và l?i v? menu Insert l?p l?i các b??c trên. Duy ch? khác là thay vì s? 2 ta nh?p s? 3 v? ? Col_Index_Num;Tr? v? trang tính, ta ch?n l?i ? F6 này và dùng ch?c n?ng AutoFill ?? chép c?ng th?c xu?ng các dòng d??i; (VD: t?i dòng cu?i là 21)Sau ?ó ta ch?n vùng F6:F22 và b?m lên nút AutoSum trên thanh c?ng c?; Excel báo cho ta là s? tính t?ng c?a c?t & nh?p v? ? 23. Ta tán thành vi?c làm này và k?t thúc macro nh? cách ?? bi?t.Macro thu ???c c?a b?n có trùng kh?p nh? v?y?(Th?c t? ta có th? v? hi?u hoá hay b? dòng th? hai ?i!)Code: Sub Tinh_Thuong() Range("F6").Select ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-2],HeSo,2)" ActiveCell.FormulaR1C1 = "=VLOOKUP(RC[-2],HeSo,2)*VLOOKUP(RC[-1],HeSo,3)" Selection.AutoFill Destination:=Range("F6:F21"), Type:=xlFillDefault Range("F6:F21").Select Range("F23").Select ActiveCell.FormulaR1C1 = "=SUM(R[-17]C:R[-1]C)" Range("F24").SelectEnd SubH?y c? ??c ?? hi?u n?i dung c?a nó; Trong ?ó có dùng hai hàm SUM() & VLOOKUP(). Kinh nghi?m cho th?y, ta ??c t? ph?i sang trái thì d? hi?u c?u l?nh h?n. Vì d? hai c?u l?nh g?n cu?i ???c hi?u nh? sau:Ch?n ? 'F23'L?y t?ng các ? t? ? th? 17 hàng tr??c ? hi?n hành, cho t?i ? tr??c ? hi?n hành 1 ? gán cho ? hi?n hành.4./ Chuy?n ??ng tuy?t ??i & t??ng ??iTa xem xét ??n c?u l?nh Range("F23").Select & c?u l?nh Range("F24").SelectTrong th?c t? ta kh?ng dùng chu?t ?n v? nút này, mà nh?p c?ng th?c tính t?ng trong ? F23 xong ta th?c hi?n ENTER. K?t qu? c?a nó là ??n ? F24 nh? máy ?? ghi!Trong dòng l?nh th? hai, hàm VLOOKUP() có ??i s? th? nh?t ???c ghi là RC[-2]; ch? C ch? s? c?t, ch? R ch? s? hàng; ? ngh?a th?c t? là ??i s? th? nh?t c?a hàm ?ang t?i ? cùng hàng & phía bên trái cách 2 c?tTrong c?u l?nh l?y t?ng, chúng ta ?? nói trên; nh?ng ? ??y VBA l?i ghi theo d?ng th?c t??ng t? nh? "B2:D9": góc trên trái nh?t & góc d??i ph?i nh?t c?a vùng ch?n.?? r? h?n ta xét ??n m?t macro ghi l?i các chuy?n ??ng b?ng bàn phím nh? sau:V?n l?y ví d? tính ti?n th??ng nêu trên, mà trong ?ó CSDL (c? s? d? li?u) g?m có 23 dòng t?t c? (t?i c?t 'F'). Ta thu m?t macro (tên là DiChuyen) v?i nh?ng hành ??ng nh? sau:Ch?n ? B2; ?n ??ng th?i 2 phím CTRL & phím m?i tên xu?ng (?i?m sáng s? t?i ? B5, là ? ??u tiên trong c?t có giá tr? (?ang ch?a K? t? 'Ho' ???c t? ??m)L?p l?i l?n n?a, ? ???c kích ho?t s? là ? B21 (là ? dòng cu?i kh?ng k? dòng ch?a c?ng th?c t?ng).N?u ti?p t?c ta ??n ???c dòng cu?i c?a trang tính!B?y ch? thì ph?i ng??c lên th?i: ?n CTRL+ phím m?i tên lên: ? kích ho?t s? l?i là B21;l?p l?i hành ??ng này m?t l?n n?a s? là – B5Cu?i cùng s? là ? B1 n?u ta mu?n! Code:Sub DiChuyen() Range("B2").Select Selection.End(xlDown).Select Selection.End(xlDown).Select Selection.End(xlDown).Select Selection.End(xlUp).Select Selection.End(xlUp).Select Selection.End(xlUp).SelectEnd SubCó khi macro ch?y nhanh quá, kh?ng làm b?n tin!?! Mu?n ghi nh?n l?i v? trí ? ???c kích ho?t khi th?c hi?n 1 l?n ta làm theo cách sau:??u dòng l?nh th? nh?t ta nh?p c?u l?nh saudim lJ as long: và nh?n hai l?n phím {TAB} (chú í có c? d?u hai ch?m ':')?? ?i?m chèn cu?i dòng l?nh th? hai & ?n ENTER, nh? v?y s? thêm 1 dóng tr?ng. ta nh?p lên nó hai c?u l?nh cách nhau b?ng d?u hai ch?m, nh? sau:lj = selection.row: msgbox str(Lj)(chú ?: gi?a ch? selection & ch? row có d?u ch?m)Ta ch?u khó l?p l?i chuy?n này ? t?t c? các dòng l?nh tr??c c?m t? End SubTh?c hi?n biên d?ch Sub nh? ?? nêu & cho ch?y l?i macroTr??c khi k?t thúc macro s? ??a ra sáu h?p tho?i báo cho ta bi?t ? kích ho?t ?ang là hàng th? m?y trong trang tính.Chú ?: ? T?i sao ta ph?i khai báo bi?n lj có ki?u là Long, mà kh?ng là Integer hay Double?N?u khai báo ch? là Integer thì bi?n kh?ng ?? n?ng l?c ?? ??n ???c dòng 65536, mà ?? b? b?t l?i!Nh?ng ng??c l?i, n?u khai báo ki?u d? li?u Double thì quá d? th?a & l?ng fí tài nguyên. H?n n?a kh?ng vì th? mà macro ch?y nhanh h?n!? Hàm MsgBox() t??ng t? nh? hàm InputBox() nêu trên, ch? có ?i?u chi?u tác ??ng thì ng??c l?i, hàm sau nh?n th?ng tin t? ng??i dùng, còn hàm m?i này th?ng báo cho ng??i dùng cái gì ?ó mà ng??i dùng ?ang thi?u th?ng tin!? Hàm Str(Num), hay hàm CStr(Num) s? bi?n ??i ki?u d? li?u d?ng s? ( Byte, Integer, Long. . .) thành chu?i kí s?. C?n nh? r?ng CStr(Num) & Str(Num) có khác nhau ? nhi?u tr??ng h?p! Ví d? Cú pháp Range( "A" & CStr(9) ).Select thì VBA hi?u; Còn Range("A" & Str(9)).Select thì kh?ng! Tuy r?ng khi biên d?ch VBA kh?ng phát hi?n ra l?i này! 5./ N?i các macroTa có th? chép h?t các dòng l?nh c?a macro sau cùng (ch? tr? c?u Sub DiChuyen & dòng End Sub) v? tr??c dòng End Sub c?a macro nêu ??u tiên trong bài. ?i?u này làm ???c do hai macro làm các c?ng vi?c hoàn toàn khác nhau, c?ng vi?c này xong kh?ng còn liên quan ??n c?ng vi?c sau.M?t cách khác n?a là ta nh?p tên macro sau v? trên dòng l?nh v?a nêu c?a macro tr??c:Code:Sub Thuong(). . . .. . . . .DiChuyenEnd SubHay Code:Sub Tinh_Thuong(). . . ... . . .DiChuyenEnd Subt?t nhiên trong m?i tr??ng h?p, h?p tho?i ta ghi thêm s? ??a ra th?ng tin có th? khác nhau!Bài t?p c?a bài hai :1./ T?o macro xoá dòng (hay c?t) ch?a m?u tin 2./ T?o macro cho ?n hay hi?n c?t (hay dòng) ch?a d? li?u3./ H?y t?o b?ng tính ?? có các c?t [?G] & [SL], h?y t?o macro tính c?t [TTien]4./ H?y t?o macro x?p h?c l?c cho HS theo ?i?m trung bình m?n h?c..Bài 3 Macro th?c hi?n các vi?c l?p l?i1./ T?o macro t? màu n?n m?t ?Tr??c tiên ta c?n chu?n b? CSDL (c? s? d? li?u) nh? m?t danh sách (DS) h?c sinh cu?a tr??ng ph? th?ng hay m?t c? quan nào ?ó g?n ngàn ng??i; có t?i thi?u các tr??ng d?? liê?u nh? sau: [Ma], [Ho], [Ten], [NgaySinh], & m?t s? tr??ng khác n?a. . . Nhi?m v? nêu ra là ??n cu?i bài h?c ta s? t? màu khác nhau cho nh?ng ng??i trong DS có các tháng sinh khác nhau;B??c ??u ta th?c hi?n vi?c t? màu cho 1 ? & di chuy?n xu?ng ? k? ti?p. Ta v? menu Tool -> Macro -> Record New Macros và ??t tên macro là ToMauSau khi ?n nút OK tr? v? b?ng tính ta ch?n c?t (tr??ng) [NgaySinh] v?i ? trên cùng ch?a d? li?u c?a ng??i ??u tiên trong DS. (Ví d? ?ó là ? ‘G6’)Ti?p theo ta rà m?i chu?t v? bi?u t??ng Fill Color trên thanh Toolbar, b?m hình m?i tên xu?ng ?? m? b?ng màu n?n.Ta nh?n v? ? màu trái nh?t hàng d??i cùng; xong ta nh?n m?i tên xu?ng trên bàn phím.L?i rà m?i chu?t lên b?ng màu, ?n ch?n v? màu k? nó phía ph?i màu v?a ch?n & l?i ?n phím m?i tên xu?ng;L?p l?i quá trình này cho ??n h?t s? màu trong hàng cu?i c?a b?ng màu;K?t thúc thu macro, ta s? có n?i dung nh? sau (tác gi? ?? thu g?n m?t s? c?p l?nh lên trên m?t dòng & b? b?t các c?u l?nh t? màu t? ? G11 tr? ?i): Code:Sub ToMau() Range("G6").Select With Selection.Interior .ColorIndex = 38: .Pattern = xlSolid End With Range("G7").Select With Selection.Interior .ColorIndex = 40: .Pattern = xlSolid End With Range("G8").Select With Selection.Interior .ColorIndex = 36: .Pattern = xlSolid End With Range("G9").Select With Selection.Interior .ColorIndex = 35: .Pattern = xlSolid End With Range("G10").Select With Selection.Interior .ColorIndex = 34: .Pattern = xlSolid End With End SubTrong macro, m?i khi ??n 1 ? m?i, VBA gán 2 thu?c tính màu n?n và ??t tính pattenrn solid cho ?. Macro này ch? ti?n h?n cách làm th? c?ng tí t?o! Chú ?: Hai c?u l?nh gán thu?c tính cho m?i ? có khác h?n so v?i macro FormatCurrency ??u tay. ? ??y tên m?i thu?c tính ??u n?m riêng bi?t, mà kh?ng n?m sau t? Selection & cách 1 d?u ch?m nh? ? Sub FormatCurrency.C?p c?u l?nh With Selection . . . End With làm các c?u l?nh n?m gi?a chúng s? tác ??ng lên ph?n ch?n; coi nh? m?i c?u ??u có t? Selection. ??ng tr??c. R? ràng c?u trúc này khi?n cho macro sáng s?a & d? ??c h?n. Còn h?n th?, nó làm cho macro ch?y nhanh h?n vì gi?m b?t m?t s? kh?u tr? l?i ban ??u: Thay vì chi? v? c?n phòng 1 l??n, rót n??c u?ng, r?i ch?m thu?c hút, ta l?i v? fòng, rót n??c u?ng, l?i ra, xong v? l?i & ch?m thu?c hút trong fòng í!2./ Ch? cho macro bi?t l?a ch?nV?n ?? nêu ra là macro ph?i bi?t t? màu nào ?ng v?i giá tr? ch?a trong ? ?o?; Và m?c tiêu c?a ta s? là t? màu khác nhau cho các tháng sinh khác nhau. ?? làm vi?c này ta t? ch?n t?t c? các dòng, tr? hai dòng ??u & cu?i và m?nh tay xoá c? ?i (b?ng phím Delete)Nh?p các dòng l?nh d??i ??yCode:Sub ToMau()1 Dim Thang, StrC As String: Dim Ij As Integer2 For Ij = 6 To 999 3 StrC = "G" & CStr(Ij): Range(StrC).Select 4 With Selection 5 Thang = .Value 6 If .Value = "" Then Exit For 7 Thang = Month(Thang) 8 Select Case Thang 9 Case Is < 310 .Interior.ColorIndex = 3811 Case Is < 512 .Interior.ColorIndex = 4013 Case Is < 7 14 .Interior.ColorIndex = 36 15 Case Is < 9 16 .Interior.ColorIndex = 35 17 Case Is < 11 18 .Interior.ColorIndex = 34 Case Else20 .Interior.ColorIndex = 37 End Select End With23 Next Ij Exit Sub: End Sub Ta khai báo bi?n StrC ?? l?u gi? m?t chu?i các ??a ch? thay ??i (t?ng d?n t? G6 tr? ?i)Chú ?: 1. Bi?n Thang ? ??y kh?ng ???c khai báo ki?u d? li?u, lúc ?ó máy m?c nhiên hi?u ki?u d? li?u là Variant. M?t bi?n ki?u Variant có th? ch?a các ki?u d? li?u mà ta bi?t t? bài ??u ??n nay. T?t nhiên b? nh? giành cho nó c?ng ph?i nhi?u h?n, & sau na?y no? co?n ch??a ????c nhiê?u th?? kha?c n??a.2. Ta co? thê? ghi s?? v? ???u m??i c?u lê?nh, ?ê? cho ma?y cu?ng nh? ta nh??n biê?t ?iê?u na?y.3./ Vo?ng l??p For . . .Next?ê? macro co? thê? th??c hiê?n chu tri?nh l??p la?i, ta s?? du?ng m?t c??u tru?c ta?o vo?ng l??p t?? c?u lê?nh do?ng 2 ?ê?n do?ng 23; Trong m?t l??n l??p, macro se? la?m nh??ng viê?c sau: L??y gia? tri? trong ? ?ê? ti?nh ra tha?ng sinh nh??t; t? ma?u nê?n ??ng v??i tha?ng ti?m ????c.Trong c??u tru?c na?y kh??i ca?c c?u lê?nh trong vo?ng l??p bi?nh th???ng se? th??c hiê?n theo s?? l??n ?a? xa?c ?i?nh; ma? cu? thê? ?? ??y la? (999 – 6) l??n. Tuy nhiên ta?i c?u lê?nh s?? 6, ng???i ta ??n ?i?nh ?iê?u kiê?n nê?u trong ? kh?ng ch??a gia? tri? se? thoa?t vo?ng l??p. /(/h? v??y, thay vi? l??p la?i nh??ng ti?nh toa?n v? nghi?a, ma?y se? thoa?t ra ngay ?u?ng lu?c. Va? ca?c ba?n se? tiê?t kiê?m r??t nhiê?u ta?i nguyên m?t khi d?? liê?u chu?ng ta ?ang i?t.Trong excel chu?ng ta cu?ng ?a? th??y bo?ng da?ng vo?ng l??p na?y trong ha?m =FACT(Num); Cu? pha?p ???y ?u? cu?a vo?ng l??p For . . . Next nh? sau:Code:For Counter = First To last [Step step] (statements) [Exit for] (statements)Next [Counter]Trong ?o?, ca?c t?? t? ???m la? t?? kho?a cu?a VBA, nh??ng t?? kho?a ma? VBA gia?nh quyê?n s?? du?ng thi? ta nên tra?nh ca?ng xa ca?ng t??t, nê?u kh?ng mu??n bi? ba?o l??i x?m pha?m chu? quyê?n.Counter la? m?t biê?n ?ê?m, (trong VD chu?ng ta la? ij) tu?y pha?m vi vo?ng l??p ma? ta khai ba?o kiê?u d?? liê?u cu?a biê?n na?y cho h??p le?.First la? gia? tri? ban ???u cu?a b?? ?ê?m; co?n last la? cu??i; Nh?ng nên biê?t r??ng cu??i ch?a ch??c la? l??n, vi? co? nh??ng ng???i, nh??ng lu?c c??n ?ê?m ng???c, nh?Code: Sub CaiSoDe()For iZ = 65535 to 1 Step -5 If iZ Mod 999 = 0 then Exit ForNext izMsgbox Str(iZ)End Sub?? ??y, l?u i? tr???c tiên biê?n iZ pha?i ????c khai ba?o nh? sau: Dim iZ As LongCo?n trong vi? du?, biê?n iZ kh?ng ????c khai ba?o tr???c. Va? nh? v??y biê?n se? ????c hiê?u co? kiê?u d?? liê?u Variant. (?iê?u kh?ng ba?o tr???c na?y trong nghê? y khuyên la? ch?ng chi? ?i?nh!)??y la? vo?ng l??p gia?m d??n, m??i l??n biê?n ?ê?m iZ gia?m 5 ??n vi? cho t??i 1 hay cho t??i khi g??p s?? iZ chia hê?t cho 999. Mod la? m?t toa?n t??, hiê?u nh? trong excel se? la? =If( MOD( iZ ; 999) = 0 ; ‘Exit For’; ‘Tiê?p’)Nh? v??y ta cu?ng th??y, nê?u b???c kh?ng ????c xa?c ?i?nh no? se? l??y gia? tri? la? 1. M?t ch?ng chi? ?i?nh n??a la? ???ng bao gi?? thay gia? tri? biê?n ?ê?m (iZ, hay Ij . . ) khi ?ang co?n trong vo?ng l??p; chuy?n na?y nên ho?i ‘ba?c sy?’ nê?u ch?a ra?nh vê? VBA)4./ C??u tru?c Select. . . .End SelectTrong excel ta ?a? biê?t c??u tru?c ph?n nha?nh b?ng ca?ch du?ng ha?m =IF(logical_test; value_if_true; value_if_false)Ha?m na?y chu?ng ta hiê?u n?m na la? trên ????ng l?u th?ng chu?ng ta t??i nga? ba; Re? pha?i hay tra?i tu?y thu??c ve? ta c??m trên tay; Hiê?n nhiên, trong excel c??u tru?c If ????c phe?p l??ng nhau (?ê?n 7 l??n); V??y th??c ra ta hiê?u: kh?ng pha?i tr???c nga? ba, ma? la? co?n chia ca?c nga? kha?c n??a. Lê?nh Select Case se? ????c phe?p re? nhiê?u nha?nh ngay m?t lu?c;(??u tru?c cu? pha?p cu?a Select Case nh? sau:Select Case TestExpressionCode:[Case Expression (i)][Statements (i)][Case Else [ElseStatements]End SelectTestExpression la? 1 biê?u th??c s?? hay chu??i b??t ky?. Trong vi? du? trên biê?n Thang gi?? vai tro? na?y. C??n no?i thêm r??ng lu?c ???u Thang ch??a gia? tri? d?? liê?u cu?a ? hiê?n ha?nh (do?ng 5); sau ?o? Thang ch??a kê?t qua? =MONTH(Thang) – ????c ga?n gia? tri? tha?ng cu?a d?? liê?u (do?ng 7) & la? TestExpression cu?a c??u tru?c Select Case. Trong macro ToMau nêu trên, chu?ng ta chi? t? 6 ma?u kha?c nhau cho t??ng c??p tha?ng; tuy nhiên chu?ng ta cu?ng co? thê? viê?tCode:Select Case Thang Case 1, 7 .Interior.ColorIndex = 38 Case 2, 8 .Interior.ColorIndex = 40. . . . Case Else .Interior.ColorIndex = 37 End Select Nh??ng ng???i tha?nh thu?c VBA khuyên ta nên lu?n nh??p c?u lê?nh Case Else cho mo?i tr??ng h??p, co? khi se? ch??p ????c nh?ng gia? tri? TestExpression kh?ng mong mu??n xu??t hiê?n.Ba?i t??p th??c ha?nh:1./ Ha?y ta?o macro t? ma?u cho Font ch?? trong ca?c ? t??ng ??ng la? ?o?, Va?ng, lu?c, lam, ti?m. . .; xem & ?o?c n??i dung macro ?ê? th??c hiê?n ca?c ba?i t??p d???i;2./ Ha?y ?o?c ?ê? biê?t macro sau cho kê?t qua? bao nhiêu, khi ta nh??p 9 v? h??p thoa?i xu??t hiê?n:Code:Sub TongBinhPhuong() Dim jZ as integer, wZ as Integer, TongBF As Long wZ =InputBox(“HAY NHAP SO CUOI”) TongBF = 0 For jZ = 1 To wZ TongBF = TongBF + jZ * jZ Next jZ Msgbox Str(TongBF) End Sub3./ Gia? s?? ta co? c??t “D” la? ?iê?m trung bi?nh cu?a ho?c viên trong l??p; ta ta?o macro ?ê? t? ma?u theo xê?p loa?i ho?c sinh; (VD: >=9: ma?u ?o?; >=7,5: Ma?u va?ng . . .)Bài ??c thêm: ColorsOption ExplicitVI. T?o b?ng màu, tên màu & ch? só c?a 56 màuSub colors56() '57 colors, 0 to 56 Const Cot = 5: Const Hang = 1 Application.ScreenUpdating = False Application.Calculation = xlCalculationManual 'pre XL97 xlManualDim iZ As LongDim str0 As String, str As StringFor iZ = 0 To 56 Cells(iZ + Hang, 1 + Cot).Interior.ColorIndex = iZ Cells(iZ + Hang, 1 + Cot).Value = "[Color " & iZ & "]" Cells(iZ + Hang, 2 + Cot).Font.ColorIndex = iZ Cells(iZ + Hang, 2 + Cot).Value = "[Color " & iZ & "]" str0 = Right("000000" & Hex(Cells(iZ + 1, 1 + Cot).Interior.CoLor), 6) 'Excel shows nibbles in reverse order so make it as RGB str = Right(str0, 2) & Mid(str0, 3, 2) & Left(str0, 2) 'generating 2 columns in the HTML table Cells(iZ + Hang, 3 + Cot) = "#" & str & "#" & str & "" Cells(iZ + Hang, 4 + Cot).Formula = "=Hex2dec(""" & Right(str0, 2) & """)" Cells(iZ + Hang, 5 + Cot).Formula = "=Hex2dec(""" & Mid(str0, 3, 2) & """)" Cells(iZ + Hang, 6 + Cot).Formula = "=Hex2dec(""" & Left(str0, 2) & """)" Cells(iZ + Hang, 7 + Cot) = "[Color " & iZ & "]"Next iZdone: Application.Calculation = xlCalculationAutomatic 'pre XL97 xlAutomatic Application.ScreenUpdating = TrueEnd SubVII. Hàm tr? v? các d?ng bi?u th? ch? s? màu n?n c?a ? ???c ch? ??nhFunction ShowColor(rRange As Range, Loai As String) Dim sColor As String sColor = Right("000000" & Hex(rRange.Interior.CoLor), 6) sColor = Right(sColor, 2) & Mid(sColor, 3, 2) & Left(sColor, 2) Select Case UCase$(Loai) Case "H" ShowColor = sColor Case "I" ShowColor = rRange.Interior.ColorIndex Case "F" ShowColor = rRange.Font.ColorIndex Case "T" ShowColor = "#" & sColor Case Else End Select End FunctionVIII. Các hàm tính toán trên c? s? màu n?n c?a các ?Function ColorFunction(ColorCell As Range, rRange As Range, Optional TuyBien As String) Dim vResult, iCell As Range: Dim iIndex As Long, Dem As Long'Written by Ozgrid Business Applications'Sums or counts cells based on a specified fill color. If TuyBien = "" Then TuyBien = "T" iIndex = ColorCell.Interior.ColorIndex For Each iCell In rRange If iCell.Interior.ColorIndex = iIndex Then Dem = 1 + Dem vResult = WorksheetFunction.SUM(iCell, vResult) End If Next iCell Select Case UCase$(TuyBien) Case "D" vResult = Dem Case "V" vResult = vResult / Dem Case Else End Select ColorFunction = vResult End Functd9i5ISub DoiMau() Color_Change SelectionEnd SubIX. T? màu t??ng ?ng cho các ? theo giá tr? c?a ?:Private Sub Color_Change(ByVal Target As Range) Dim rgArea As Range, rgCell As Range Dim iColor As Integer ' Get the intersect of the target & the proper range Set Target = Intersect(Target, Range("A11:D28")) If (Not Target Is Nothing) Then ' If this intersection exists For Each rgArea In Target.Areas ' For each subsection of the selection For Each rgCell In rgArea.Cells ' For each cell of the subsection If rgCell.Value < 56 And rgCell.Value > 0 Then rgCell.Interior.ColorIndex = Int(rgCell.Value) Else rgCell.Interior.ColorIndex = xlNone End If Next rgCell, rgArea End IfEnd SubX. Tìm màu n?n t??ng ?ng v?i màu FontSub RealInvertColors() Dim Rng As Range Dim reD As Double, bLue As Double, gReen As Double, CoLor As Double Sheets("S2").Range("A20").Select Set Rng = Selection CoLor = Rng.Font.CoLor: MsgBox str(CoLor), , "Font Color:" reD = CoLor Mod 256: MsgBox str(reD), , "RED Color:" CoLor = (CoLor - reD) / 256: MsgBox str(CoLor), , "(Color - RED)/256:" gReen = CoLor Mod 256: MsgBox str(gReen), , "Green Color:" bLue = (CoLor - gReen) / 256: MsgBox str(bLue), , "Blue Color:" reD = 255 - reD gReen = 255 - gReen bLue = 255 - bLue ' CoLor = 255 * 255 * blue + 255 * green + red' MsgBox str(CoLor) Selection.Interior.CoLor = RGB(reD, gReen, bLue)End SubXI. Tìm các ? ch?a giá tr? chu?i "JjWwZz"Sub SelectJjWwZz()Dim RgJjWwZz As Range, RgNext As Range, FirstAddress As RangeWith ActiveSheet.Cells Set RgNext = .Find(What:="JjWwZz", After:=Range("A1"), LookIn:=xlValues) If Not RgNext Is Nothing Then 'Neu Tim Thay Set FirstAddress = RgNext Set RgJjWwZz = RgNext Do Set RgNext = .FindNext(RgNext) Set RgJjWwZz = Union(RgJjWwZz, RgNext) Loop While RgNext Is Nothing Or RgNext.Address <> FirstAddress.Address End IfEnd WithRgJjWwZz.SelectEnd SubXII.Tim "Jn" trong các tên cu? WorkBook , màu ?? thì ??i thành tr?ngSub HighLightNames() Dim Jn As Name On Error Resume Next For Each Jn In ThisWorkbook.Names If Not Range(Jn).Interior.ColorIndex = 3 Then Range(Jn).Interior.ColorIndex = 3 Else: Range(Jn).Interior.ColorIndex = 0 End If Next Jn On Error GoTo 0End SubXIII. Các b?n t? tìm hi?u :Sub PhAn() Dim StrC As String, FirstAddress As String Dim uRange, Jz As Integer StrC = InputBox("HAY CHON FUONG AN:") With Worksheets("S2").Range("A2:C25") Select Case UCase$(StrC) Case "B" 'Blanks: Count Set uRange = Cells.SpecialCells(xlCellTypeBlanks) If Not uRange Is Nothing Then FirstAddress = uRange.Address Do Jz = Jz + 1 Loop While Not uRange Is Nothing And uRange.Address <> FirstAddress End If Case "C" 'Consts: Count Set uRange = Cells.SpecialCells(xlCellTypeConstants, 23) If Not uRange Is Nothing Then FirstAddress = uRange.Address Do Jz = Jz + 1 Loop While Not uRange Is Nothing And uRange.Address <> FirstAddress End If Case "F" 'Formulas => Value 5 Set uRange = Cells.SpecialCells(xlCellTypeFormulas, 23) If Not uRange Is Nothing Then FirstAddress = uRange.Address Do uRange.Value = 5 Set uRange = .FindNext(uRange) Jz = Jz + 1 Loop While Not uRange Is Nothing And uRange.Address <> FirstAddress End If Case "T" 'Find Value= 5 => '=A20' Set uRange = .Find("5", LookIn:=xlValues) If Not uRange Is Nothing Then FirstAddress = uRange.Address Do uRange.Value = "=$A$20" Set uRange = .FindNext(uRange) Jz = Jz + 1 Loop While Not uRange Is Nothing And uRange.Address <> FirstAddress End If End Select MsgBox FirstAddress, , str(Jz) End WithEnd Sub Bài 4 Macro nh??p liê?u v? CSDL (c? s?? d?? liê?u).1./ Ta?m hiê?u vê? CSDL & ca?ch ti?m ?ê?n do?ng cu??i CSDLTrong th??c tê? i?t nhiê?u chu?ng ta ?ê?u tiê?p xu?c v??i CSDL. Trong excel ta co? m?t s?? ha?m CSDL, vi? du? =DSUM(database,field,criteria) ; database pha?i tho?a ma?n m?t s?? yêu c??u:Ha?ng ???u tiên la? ca?c tên tr???ng, Ca?c tên tr??ng, cu?ng nh? tên biê?n: kh?ng co? ch??a khoa?ng tr??ng hay ca?c ki? t?? ???c biê?t, Ca?c ha?ng trong CSDL (go?i la? ca?c record) ?ê?u pha?i co? s?? liê?u. Kh?ng ????c du?ng ky? t?? ntr, hay ‘–‘ ?ê? thay cho ca?c tri? tru?ng v??i gia? tri? tr??ng ?o? cu?a record trên no?.Ta co? thê? th??y CSDL ho?c sinh ca?c l??p trong m?t tr??ng ho?c, DS (danh sa?ch) c?ng nh?n viên ch??c trong ??n vi?, ba?ng kê ho?a ??n mua ba?n ha?ng ho?a, ba?ng kê sa?n l???ng cu?a b?? ph??n sa?n xu??t trong ??n vi? & co?n nhiê?u nh?ng DS kha?c n??a . . . .Gia? s?? ta co? DS ca?c chuy?n ha?ng nh??p v? nha? ma?y, co? ca?c tr??ng nh? sau: [STt], [Ngay], [MKH], [SoXe], [TgLuong], [Bi], [Sluong]. Ha?ng nga?y c? s?? sa?n xu??t ??y nh??n v? khoa?ng va?i chu?c xe ha?ng ?ê? la?m nguyên liê?u. Nh? v??y s?? ghi che?p ???y ?u? s?? liê?u nh??p loa?i nguyên liê?u na?y trong th??i ky? na?o ?o? se? la? m?t CSDL t??t ?ê? chu?ng ta du?ng macro ta?c ???ng ?ê?n t??t ca? ca?c kh?u, t?? kh?u nh??p liê?u, th?ng kê, x?? ly? s?? liê?u trong ba?o ca?o, qua?n ly? & ?iê?u chi?nh qua? tri?nh. . .Nê?u kh?ng co? c?ng cu? macro, chu?ng ta pha?i nh??p tr??c tiê?p ca?c s?? liê?u cu?a xe ha?ng v? do?ng cu??i cu?a CSDL. La?m nh? v??y r??t dê? nh??m l??n, d??n ?ê?n nh?ng sai so?t kh?n l???ng. Ca?ch t??t nh??t ?ê?n th??i ?iê?m na?y (do ta ch?a biê?t gi? vê? Form) la? ta nh??p s?? liê?u vê? xe ha?ng m??i v? lên 1 sheet (co? tên la? Nhap) theo c??t t?? trên xu??ng. (B?? tri? theo c??t vi? th??ng nh??p xong s?? liê?u m?t ?, ??n ENTER thi? con tro? xu??ng ngay ? do?ng d???i!). Sau khi kiê?m tra xong, ta ??n nu?t ?ê? macro thay ta che?p ca?c s?? liê?u na?y ?ê?n Sheet ch??a CSDL (co? tên la? CSDL), va?o ?u?ng n?i yêu c??u: do?ng cu??i cu?a CSDL. Lu?c ?o? ta t??n du?ng ????c ca?ch ma? excel copy chuy?n c??t tha?nh ha?ng;Gia?i ba?i toa?n nêu trên b?ng ca?ch: Ta?i Nhap ta thiê?t kê? nh? sau: Tr??n 2 ? A1 & B1 ?ê? no? ch??a chu??i: ‘Nh??p m??i’; Ca?c ? trong c??t A kê? t?? A2 tr?? xu?ng ch??a l??n l???t ca?c chu??i: ‘S?? TT’, ‘Nga?y nh??p’, ‘Ma? chu? ha?ng’, ‘Biê?n s??’, ‘Tro?ng l???ng ca? bi?’, ‘Tr?? bi?’, ‘S?? th??c nh??p’Ta nh??p s?? liê?u m?t xe ha?ng v? c??t b t?? B2 ?ê?n B7; Co?n gia? tri? ta?i B8 ta ca?i c?ng th??c = (B6 – B7). ?ê?n l???t ca?c ba?n ha?y t?? ta?o cho mi?nh m?t macro che?p s?? liê?u ta?i c??t B t?? B2 cho ?ê?n B8 theo ca?c b???c sau:v ???t tên macro s??p thu. . .v Du?ng chu??t t? cho?n ca?c ? t?? B2 tr?? xu?ng B8 cu?a sheet ‘Nhap’, xong v? menu Edit -> Copy;v Ta cho?n tiê?p sheets ‘CSDL’; ??n cho?n ? A2, & la?i v? menu Edit -> Paste Special; Trong ng?n Paste cu?a h??p thoa?i Paste Special ta cho?n Values & ??n v? nu?t cho?n Transposev Kê?t thu?c thu macro, & macro na?y ba?n ???t tên Nhap (hay NhapLieu) hay tên na?o kha?c g??i nh?? ma? ba?n mu??n. (Ta?c gia? quyê?n ghi che?p na?y mu??n ca?c ba?n theo do?i ba?i c??n th??c hiê?n macro na?y t??i thiê?u 2 l??n, nên m??i g??i tên ta?i ??y; du? sao cu?ng la? m?t y? ???!) Sau m??i l??n th?? ta co? thê? xo?a macro ?i b?ng ca?ch: Ta?i CS (c??a s??) excel ta nh??n cu?ng lu?c ALT+F8, CS Macro m?? ra, ta cho?n tên macro trong ng?n Macro Name ma? ta mu??n xo?a, xong cho?n nu?t lê?nh Delete ?ê? th??c hiê?n viê?c na?y. Mi?nh khuyên ca?c ba?n nên xo?a ta?c ph??m macro cu?a mi?nh nhiê?u l??n, sau m??i l??n xo?a macro, kiê?n th??c VBA cu?a ta se? l??n lên m?t i?t!. (/iê?c na?y kh?ng pha?i la? quên, ma? la? co? chu? t?m: sau b???c hai nêu trên, ba?n co?n m?t c?ng ?oa?n n??a la? ??n nu?t ESC trên ba?n phi?m! Viê?c na?y ta co? thê? quên trong khi thao ta?c trên ba?ng ti?nh excel (?ê? bo? cho?n da?y ? ?i?nh Copy). Nh?ng ?? ??y kh?ng nên quên te?o na?o, vi? dê? bi? phiê?n ph??c & kiê?n ca?o vê? sau, hoa?c gia? chu?ng ta kh?ng biê?t macro d??n ta ?i ?ê?n ph??ng tr??i na?o n??a?!Chú ?: * Trong h??p thoa?i Paste Special ba?n th?? kh?ng cho?n nu?t ??n Value 1 l??n va? xem macro cho kê?t qua? ra sao?* Ba?n th?? m?t l??n ???t tên macro la? Nhap_ se? bi? VBA pha?n ???i hay kh?ng ?!* Ba?n nghi? xem co?n co? thê? la?m gi? ?ê? giao l?u gi??a ba?n & VBA th?ng qua macro na?y kh?ng? VD nh? th?? ???t tên la? _Nhap xem bi? pha?n ???i kh?ng?! . . .?ê?n ??y la? xong m?t c?ng ?oa?n. Ph??n th?? ?ê?n la? xa?c ?i?nh do?ng cu??i cu?a CSDL; ?ê? th??c hiê?n viê?c na?y ba?n c??n t?? ta?o cho mi?nh m?t CSDL khoa?ng va?i chu?c records, va? na na? nh? mi?nh ?ê? ra ?ê? dê? theo do?i tiê?p. Macro trên bao gi?? ta cu?ng che?p v? range A2; Nh?ng th??c tiê?n CSDL t?ng (gia?m) liên tu?c, nên ta pha?i la?m sao ?ê? macro th?ng minh, hiê?u y? ta ma? ti?m ?ê?n do?ng cu??i ?ê? da?n d?? liê?u v?!Ta la?i th??c hiê?n ghi macro Sub DongCuoi() b?ng ca?ch thu macro qua ca?c b???c sau:* Cho?n ? A1 cu?a CSDL, gi?? phi?m CTRL & ??n phi?m mu?i tên xu??ng (Do?ng cu??i cu?a CSDL ????c cho?n)* Tiê?p tu?c th??c hiê?n ha?nh ??ng nh? v??y ?ê? ?ê?n ????c do?ng cu??i cu?a trang ti?nh* (Cu??i r??i nên quay la?i) ??n t?? h??p CTRL+ phi?m mu?i tên lên ?ê? tr?? la?i do?ng cu??i cu?a CSDL. Sau khi ng?ng thu macro ta se? co? nh?ng do?ng t??ng t?? va?y trong CS ch??a ca?c macro:Code:Sub DongCuoi() Rang(“A1”).Select: Selection.End(xlDown).Select Selection.End(xlDown).Select: Selection.End(xlUp).SelectEnd Sub?iê?u chu?ng ta c??n la? ma?y cho ta biê?t do?ng tr??ng kê? tiê?p ?ê? che?p; ?iê?u na?y th??c hiê?n ????c b?ng ca?ch s??a la?i macro trên ?ê? co? n??i dung sau:Sub DongCuoi() Dim iRow As Long Range("A65535").Select Selection.End(xlUp).Select iRow = 1 + Selection.Row MsgBox Str(iRow)End SubTrong macro na?y co? 2 do?ng lê?nh ?a?ng kê? ?ê?n. ?o? la? do?ng lê?nh th??c hiê?n thao ta?c CTRL+ mu?i tên lên. Do?ng lê?nh na?y la?m ? ch??a d?? liê?u cu??i cu?a CSDL trên c??t ‘A’ ????c ki?ch hoa?t.Do?ng th?? ?ê?n la? ph??ng th??c ga?n cho biê?n iRow ?a? khai ba?o gia? tri?, b?ng v??i gi?a tri? ha?ng hiê?n ha?nh c??ng v??i 1 (Nên ?o?c do?ng lê?nh t?? pha?i qua tra?i, la?: Do?ng hiê?n ha?nh c??ng 1, ga?n v? biê?n iRow). 2./ Macro nh??p liê?u?a? ?ê?n giai ?oa?n l??p macro nh??p liê?u, kê?t h??p t?? hai macro nêu trên & thêm gia vi? v? cho mo?n macro thêm h??p d??n. Nh?ng gi?? chu?ng ta di?ch ng???c t?? ng?n ng?? macro sang ng?n t?? diê?n ta? ca?c b???c tiê?n ha?nh cu?a ta, nh? sau:Code:Sub Nhap()401 Sheets("Nhap").Select: Range("B2:B8").Select402 Selection.Copy403 Sheets("CSDL").Select Range("A65535").Select404 Selection.End(xlUp).Select405 Selection.Offset(1, 0).Select406 Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=True407 Application.CutCopyMode = False: Sheets("Nhap").SelectEnd SubPh??n di?ch c?u lê?nh:401: Cho?n vu?ng c??t B ta?i sheet (“Nhap”);402: Copy (vu?ng cho?n);403: T??ng t?? 401; 404: ?a? gia?i thi?ch trên;405: Ha?y cho?n ? co? s?? ha?ng t?ng 1 & s?? c??t v??n nh? cu? so v??i ? ki?ch hoa?t;406 & 407: ‘Qua? quen!’(Vi? la? ng?n ng?? di?ch nên m??i ng???i co? ca?ch di?ch kha?c nhau, co? le? mi?nh ch?a thê? di?ch tiê?ng na?o ra tiê?ng y?, mong ????c ca?m th?ng!). Va? ca?c ba?n th??y ???y, di?ch t?? ng?n ng?? VBA sang ng?n ng?? ???i th??ng cu?ng quan tro?ng kh?ng ke?m, pha?i kh?ng?!Nh?n di?p ra?nh r??i ca?c ba?n th?? bo? va?i vê? sau cu?a mê?nh ?ê? 406 xem ra r?ng?!3./ Ta?o nu?t lê?nh cho m?t macroCa?c ba?i ???u ta ?a? biê?t ga?n t?? h??p phi?m t??t cho m?t macro. Nh?ng tiê?n thi? co? tiê?n v??i ta th?i. Co?n khi ta v??ng, ng???i kha?c thay ta nh??p liê?u thi? kh?ng biê?t ca?c phi?m na?y!. ?ê? tiê?n cho viê?c s?? du?ng ta thiê?t l??p m??t nu?t lê?nh trên trang ti?nh, & nh? v??y b??t ky? ai cu?ng co? thê? xa?i ????c kh?u nh??p liê?u.?ê? la?m ????c ?iê?u na?y, ta?i trang ba?ng ti?nh ‘Nhap’ hiê?n ha?nh, ta v? menu View ->Toolbars -> Forms ?ê? hiê?n thanh c?ng cu? Forms. Ra? mu?i chu??t l??n l???t lên ca?c nu?t ?ê? ti?m nu?t co? ch?? ‘Button’. ??n cho?n no?, ??a mu?i chu??t ?ang co? da?ng ch?? th??p ma?nh mai ?ê?n ? trên vu?ng C2:D8 (VD t?i cho?n C7). ??n gi?? tra?i chu??t & ve? hi?nh ch?? nh??t lên ? cho?n. Nê?u xu??t hiê?n CS Assign Macro thi? ta cho?n tên macro Nhap ta?i Macro Name & nh??n OK.V??i Button ?ang ????c ki?ch hoa?t, ta pha?i chu??t v? nu?t lê?nh ?ê? hiê?n menu t??t cu?a no?. Ta cho?n do?ng cu??i la? Format Control. CS Format Control xu??t hiê?n, nh?ng ta b??m Cancel cho ??n ?i. Con tro? chu??t trên do?ng ‘Button n’. Ta t? toa?n b?? ch?? na?y & nh??p v? thay b?ng ch?? viê?t: ‘Nh??p’; La?i t? sa?ng ch?? na?y & nh??p v? nu?t co? ch?? B trên Toolbar, la?m ???m ch??. Sau ?o? cho?n ma?u Font cho no? theo y? ba?n. Nê?u ba?n ?a?, hay se? ?i?nh ga?n t?? h??p ca?c phi?m CTRL+SHIFT+N cho macro Nhap thi? lu?c na?y la? t??t nh??t ?ê? ba?n t? ch?? ca?i ‘N’ & nh??n v? nu?t Underline. ???ng ta?c na?y g?y ??n t??ng gi??a hai th??c thê? ta v??i ma?y!Sau khi ta?o ra ta?c ph??m ???u tay na?y, nh??t thiê?t viê?c ?ê?n tiê?p la? th??. Ba?n co? thê? nh??n v? nu?t na?y nhiê?u l??n ?ê? xem ‘H??n’ che?p nh?ng gi? co? trên c??t ‘B’ qua CSDL; C?? bi? nh??n la? che?p, b??t kê? miê?n co?n ????c cung c??p ngu??n ?iê?n! 4./ Ta?o m?tCombo Box ?ê? nh??p ma? kha?ch ha?ng/(/h? trên ta th??y do?ng th?? ba trong sheets ‘Nhap’ ch??a ma? #h (kha?ch) ha?ng. Ba?n co? th??t m??c kh?ng? Ta kh?ng nh??p toa?n tên #h ha?ng ma? chi? la? ma? vi? chu?ng ta ‘l???i biê?ng’? /(h?ng ??u ca?c ba?n! Ba?n th?? hi?nh dung co? nhiê?u #h ha?ng th?n thiê?t nga?y na?o cu?ng cung c??p hai ?ê?n b?n chuy?n thi? ng???i nh??p cu?ng mê?t & ma?y cu?ng mê?t. Ng???i mê?t thi? dê? hiê?u r??i! Ma?y cu?ng mê?t vi? CSDL ta phi?nh nhanh qua? thay vi? tr??ng [MKH] chi? g??m t??i ?a 3 ki? t?? hay ky? s?? ta la?i nh??p nguyên C?ng T??ng T?n N?? Nguyê?t Nga la? kh?ng c??n thiê?t. Ba?n th?? hi?nh dung nh? thê? na?y trong file nh?n s?? cu?a m?t c? quan 750 ng???i g??m 15 b?? ph??nNê?u tr??ng [BoFan] ta nh??p nguyên tên ??n vi? nh?: T?? ch??c, Ha?nh cha?nh, Ta?i chi?nh, PX Nguyên liê?u, PX C? ?iê?n. . . thay cho viê?v nh??p A, C, D, E, F . . . thi? la?ng phi? ngu??n nh?n l??c la? ?a?ng kê?.T??t nhiên ?? ??y, cu?ng nh? ?? trên ta pha?i co? ba?ng ???i chiê?u nh? trong ha?m VLOOKUP() hay HLOOKUP() trong excel ?a? g??pTr?? la?i v??i ph??n nh??p ma? #h ha?ng. Nh? v??y ng???i du?ng se? ??a c?u ch??t v??n: La?m sao t?i nh?? ma? cu?a trên ??i chu?c kha?ch ??y?! ?u?ng la? m?t yêu c??u chi?nh ?a?ng ma? ng???i biê?t macro pha?i ?a?p ??ng. Va? c??u tinh ?o? chi?nh la? Combo Box (se? viê?t t??t la? Combo)/(/o? ?? ??u?, v??n trong toolbar Form y? th?i! Ba?n ra? mu?i chu??t nh? ban na?y, nh?ng thay vi? ti?m ch?? ‘Button’ ta ti?m ch?? ‘Combo’ trong khi Tool tips hiê?n ch??, hay th??y ca?i nu?t na?o co? biê?u t??ng gi?ng gi??ng ca?i h??p diêm thi? nha?o v? kiê?m./(/h?ng kiê?m v??y th?i, ta ch?a chu??n bi? gi? ngu??n l??c cho no? thi? no? cu?ng v? du?ng ma? th?i; Gi??ng nh? ta pha?i co? macro Nhap r??i m??i la?m nu?t lê?nh cho no? trên trang ti?nh ??y ma?!?ê? chu??n bi? ngu??n cho Combo, cu?ng nh? CSDL qua?n ly? ca?c th??ng ?ê? ta cu?ng se? ta?o ca?c tr??ng nh? STT, Ma, HoTen, NgSinh, Dthoai, DiaChi, Fax, NguoiGD, GhiChu, . . . Ca?c tr??ng kha?c ta b?? sung sau, nh?ng hai tr??ng pha?i co? tr???c la? Ma & HoTen; Gia? du? ta ?a? co? DS na?y g??m 20 vi?, tu?y thu??c v? s?? l???ng ma? ma? nên 2, 3 ky? t?? (Nê?u d???i 1.000 th??ng ?ê? ta chi? du?ng 2 ky? t?? la? ?u?,)Gi??ng nh? ta?o nu?t lê?nh cho macro, ta cu?ng ??n v? biê?u t??ng Combo trên Toolbar Forms. Sau ?o? trên trang ti?nh ta ve? hi?nh thanh da?i ?u? th??y tên cu?a th??ng ?ê? trong ?o? (khoa?ng ch??ng 8 Cm). Ta cu?ng pha?i chu??t v? hi?nh ch?? nh??t na?y & cho?n Format Control. Trong CS Format Control ta ??n chu??t v? h??p Input range. Du?ng chu??t que?t t?? ???u ?ê?n cu??i DS #h ha?ng. Tiê?p theo, trong h??p Cell Link ????c ??n chu??t, trên trang ti?nh ‘Nhap’ ta cho?n ? C4 (kê? v??i ? c??n nh??p ma? #h ha?ng). Tiê?n tay ta ?a?nh d??u kiê?m v? 3-d Shading;Ta nh??p v? ? tr??ng b??t ky? ?ê? kê?t thu?c s? l???c ph??n format Control. Nê?u gi?? ta nh??n v? mu?i tên xu??ng cu?a Combo ta cho?n tên 1 ng???i thi? ta?i ? C4 xu??t hiê?n s??, no?i lên th?? th?? cu?a th??ng ?ê? ?o? trong DS. V??y chi? co?n b???c cu??i cu?ng la? ta pha?i liên kê?t gi??a s?? trên C4 v??i ma? #h ha?ng t??ng ??ng; ?iê?u na?y ca?c ba?n co? thê? pha?i t?? la?m l??y, mi?nh chi? g?i y? hai ca?ch sau:Ta?i ? C3 du?ng =VLOOKUP() hay du?ng ha?m =CHOOSE(). Ha?m tr???c cho DS nhiê?u & sau cho kh?ng t??i chu?c #h ha?ng!?ê?n ??y ta co? thê? xoa tay & c???i t??i v??i tha?nh qua? cu?a mi?nh. ?ê? khuyê?ch tr??ng chiê?n ti?ch, ta la?m ?e?p Combo b?ng ca?ch pha?i chu??t v? Combo & th??c hiê?n chi?nh s??a ki?ch c?? cho v??a y? (???i v??i nu?t lê?nh cu?ng v??y); & t?? cho phe?p mi?nh ti?m hiê?u ca?c CS co? trong Format Control.Ba?i t??p cu?a ba?i 4:1./ Ba?n ?a? g??p macro na?y ?? ??u?Code:Sub Nhap_() Sheets("Nhap").Select: Range("B2:B8").Select Selection.Copy Sheets("CSDL").Select: Range("A2").Select Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _ :=False, Transpose:=True Application.CutCopyMode = FalseEnd Sub 2./ Ta?i ? nh??p nga?y tha?ng (B3) ta co? thê? ca?i m??c ?i?nh nga?y tr???c nga?y hiê?n ha?nh 1 nga?y (nê?u la? ca?c th?? #) & tr???c 2 nga?y nê?u la? th?? hai ????c kh?ng?!3./ Nh? c?u hai nê?u la? bi?nh th??ng, nh?ng nê?u ng???i nh??p liê?u mu??n lu?i 1 va?i nga?y co? ????c kh?ng?! (?ê? thi?ch ??ng v??i va?i 3 nga?y nghi? lê? tr?? lên i?!). G??i y?: S?? nga?y lu?i ????c nh??p v? C3File Bai4_5.XLS là c?a bài 5; Nh?ng các b?n có th? xem ph?n nh?p li?u. Tham kh?o th?i ch? khác nhi?u so v?i bài 4 (?? trách th?c m?c kh?ng c?n thi?t !). . . . . . . . . . . . Bài 5 Macro l??p ba?o ca?o ha?ng nga?y.1./ Kha?o sa?t ca?c yêu c??u:Ba?i toa?n nêu ra la? viê?c qua?n ly? chu tri?nh sa?n xu??t ta?i m?t CS (c? s??). Ma? cu? thê? la? Gia?m ???c CS yêu c??u ph?n x???ng II g??i BC (ba?o ca?o) s?? liê?u ha?ng nga?y tr???c 8h30 nga?y h?m sau. Trong BC pha?i ?u? s?? liê?u vê? 4 v??n ?ê?: c?ng nghê?, sa?n l???ng, ch??t l???ng & tiêu hao;Trong m??i v??n ?ê? co? nh?ng yêu c??u chi tiê?t ca?c ha?ng mu?c nh? sau:C?nghê?: s?? h? ho?ng ?? b?n kh?u trong ph?n x???ng (K1, K2, K3, K4)Sa?n l???ng: Sa?n l???ng sa?n xu??t 9 m??t ha?ng cu?a p/x (ph?n x???ng)Ch??t l???ng sa?n ph??m: S?? loa?i I & & loa?i 2 Tiêu hao : ?iê?n, nguyên liê?u & nhiên liê?u. . . . . .(xem trong Sheet(“BCao”) File Bai4_5.XLS)Ta ?a? biê?t r??ng macro no?i riêng (hay VBA no?i chung) r??t ?a ca?c c?ng viê?c l??p la?i th??ng xuyên na?y. V??n ?ê? la? la?m nh? thê? na?o ?ê? l??p CSDL (c? s?? d?? liê?u) x?? ly? m?t ca?ch tr?n tru & co?n co? h???ng cho mai sau pha?t triê?n!Trong Sheet(“CSDL”) cu?a file ?i?nh ke?m co? ca?c tr??ng sau: Ngay, Ca, Kip, ThSo, ThNm, SoLieuNgay Ca Ki?p ThSo ThNm SoLieu 23/09/2006 A 1 B6A 28 1,230 1/10/2006 A 1 A1A 29 9 Trong ?o? co? hai tr??ng c??n no?i t??i (co?n ca?c tr??ng kha?c ch??c ai cu?ng ng??m ra). ?o? la? [ThNm] & [ThSo][ThNm] la? tr??ng biê?u tr?ng cho n?m & tha?ng cu?a [Ngay]. Sau na?y ca?c ba?n se? biê?t no? du?ng ?ê? lo?c d?? liê?u theo tha?ng na?o ?o? trong n?m, phu?c vu? trong chuy?n ti?nh lu?y kê? sa?n xu??t.[ThSo] g??m 3 ki? t?? hay ki? s??. Ki? t?? ???u biê?u tr?ng cho ca?c v??n ?ê? c??n qua?n ly?: C?nghê?, sa?n l???ng, ch??t l???ng & tiêu hao; Ky? s?? th?? ?ê?n biê?u tr?ng cho th?? t?? yêu c??u chi tiê?t; Vi? du?: B6A thi? ta hiê?u la? tr??ng SoLieu ghi sa?n l???ng m??t ha?ng ma?c 6 (xem trong Sheets(“Nhap”))A1?: Ghi s?? h? ho?ng ta?i c?ng ?oa?n K1 cu?a ph?n x???ng.Ky? t?? cu??i cu?ng chi? ra ca sa?n xu??t. Co? thê? ba?n se? ho?i, v??y l?u ki?p th?? la?m gi?? Xin th?a: Ca ?êm ????c thêm l??ng & b??i d???ng gi??a ca! Viê?c na?y c??n thiê?t ?ê? sau na?y l?? Sê?p tra? l??ng theo kê?t qua? sa?n ph??m cu??i cu?ng . . .Cu?ng ?u?ng nê?u ta no?i [Ca] la? d?. Nh?ng ta m??i ch??p ch??ng v? VBA nên ph??n s?? du?ng ta?i nguyên co?n ch??ng m??c th?i, ch?a pha?i la? t??i ?u, mong nhiê?u ba?n th?ng ca?m!2./ Tri?ch lo?c s?? liê?u nga?y c??n thiê?tCa?c ba?n ha?y m?? trang ti?nh ‘BCao”, trong i? ?a? ca?i s??n c?ng th??c hê?t r??i. C?ng viê?c cu?a chu?ng ta la? viê?t macro ga?n v? nu?t lê?nh ‘Ba?o ca?o” trong sheets ‘Nhap’. ?ê? no? la?m tu??n t?? ca?c nhiê?m vu?: a.) Xê?p CSDL theo [Ngay]; li? do: ?ê? pho?ng nh?n viên nh??p liê?u kh?ng theo nga?y tha?ng nh? bi?nh th??ng. Viê?c na?y ca?c ba?n th?? ghi la?i b?ng m?t macro riêng, xem nh? m?t ba?i t??p b?? sung!b.) Tri?ch lo?c toa?n b?? d?? liê?u trong nga?y thê? hiê?n lên hai c??t ‘L’ & ‘M’ trong sheet ‘CSDL’. Nga?y chi? ?i?nh ????c ghi ta?i ? B2 cu?a Sheet ‘Nhap’ hay ? H2 thu??c vu?ng Criteria khi ta s?? du?ng ph??ng th??c Advanced Filter. . trên menu Data. Ca?c ba?n cu?ng nên ghi 1 macro na?y n??a ?ê? hiê?u thêm vê? Advanced Filter ?ê? co? trong tay nh?ng gi? ng?n ng?? VBA no?i ?ê?n chuy?n Advanced Filter. (Chuy?n na?y kh?ng ai c??m ca?n ba?n th??c hiê?n nhiê?u l??n ca?, chi? co? ?iê?u ba?n co? mu??n hay kh?ng ma? th?i! Ca?ng la?m nhiê?u ma?y no? ca?ng ca?m ?n ?o?; Cu? thê? nha: Trong menu Insert ->Name->Define cu?a excel co? ghi nh??n c?ng lao cu?a ba?n ?o?!) Vê? ph??n mi?nh ?a?ng ra t?i nên kho?a ca?c macro s??n co? trong file ?i?nh ke?m, nh?ng kh?ng vi? thê? ma? ca?c ba?n kh?ng t?? mi?nh viê?t nhiê?u l??n hai macro ?a? nêu trên (vê? xê?p tr??t t?? CSDL & Advanced Filter. . .) . Y? t?i mu??n la? ca?c ba?n t?? nh??n th??c la? chi?nh & c? ba?n nh??t. Va? ???ng t?? a?i khi ma?y chi? cho ta th?? na?y th?? kha?c qua ng?n ng?? VBA. Ca?ng kh?ng nên nha?o ngay v? ca?i s??n co? cu?a ng???i kha?c ma? mi?nh ch?a co? ???ng v??n na?o l??n l?ng. Va? y? cu??i cu?ng: ma?y ti?nh lu?c na?o cu?ng s??n lo?ng giu?p ta, kh?ng hê? vu? l??i!Nê?u chu?ng ta th??c hiê?n xong macro th?? hai na?y thi? trang BC chi? co?n ch?a c??p nh??t s?? liê?u lu?y kê? tha?ng (nêu ta?i c??t ‘P’ trong Sheet ‘BCao’). Co?n ca?c c??t tr???c no? ?a? ngon la?nh.A? co?n ?iê?u na?y no?i tr???c: Nh?ng ba?i ghi che?p na?y la? no?i vê? VBA, nê?u co? ai th??c m??c vê? c?ng th??c na?o ?o? cu?a excel (ma? cu? thê? la? trong trang ‘BCao’) thi? ba?n th?n xe?t th??y kh?ng co? ?u? kha? n?ng gia?i ?a?p, th?ng ca?m nha!c.) Ta?o s?? liê?u sa?n l???ng lu?y kê? tha?ng: ??y la? c?ng viê?c nho?c nh??ng, vi? chi? m?t chu?c s?? liê?u nh?ng la?i pha?i ??? nhiê?u c?ng s??c. V?y nên chuy?n no? tha?nh ?ê? mu?c riêng lu?n d???i ??y:3./ Thu th??p s?? liê?u ca?c nga?y tr???c ?o? cu?a tha?ng?ê? l??y d?? liê?u t?? ???u tha?ng t?? kho l?u tr?? ta th??c hiê?n lo?c hê?t d?? liê?u t?? nga?y 1 cu?a tha?ng ?o? cho ?ê?n nga?y sê?p yêu c??u. Nên nh?? r??ng co? lúc cu??i tha?ng, nh?ng sê?p mu??n xem kê?t qua? sa?n xu??t cu?a nh?ng nga?y trong tu??n ???u tha?ng thi? sao?! Vi? chu?ng ta m??i quen v??i VBA, nên chu?ng ta nên xa?i c??t phu?, ?o? la? tr??ng [ThNm]; N?m na la? tr??ng ch??a 2 ky? t??, ky? t?? ???u biê?u tr?ng cho n?m, ky? t?? sau biê?u tr?ng cho tha?ng cu?a n?m ??y! ?? ??y ng???i ta la?m v??y ?ê? chu?ng ta dê? xa?i ma? th?i. Na?y nha: nê?u chu?ng ta cung c??p cho macro m?t biê?n chu??i kiê?u ‘10/06’, ‘9/06’. . . cho ma?y cu?ng se? s??y ra tr??ng h??p b??t ??ng ng?n ng?? kh?ng i?t thi? nhiê?u. Vi? se? co? ng???i cho la? heo l??n h?n l??n, cu?ng se? co? ng???i cho l??n nh??n h?n heo!Tr??ng na?y do ha?m t?? ta?o ?em la?i; ?ê? co? kha?i niê?m vê? ha?m t?? ta?o, ta b??t ???u t? ha?m cu?a excel. Ha?m excel lu?n tra? vê? cho ta m?t th?? gi? ?o?; Co? m?t s?? ha?m ?o?i chu?ng ta cung c??p ca?c ???i s??, nh?ng cu?ng co? nh?ng ha?m ta ??i la? no? cho ngay ma? ch??ng ?o?i ho?i gi?;(o?n VBA cho chu?ng ta kha? n?ng l??p nh?ng ha?m tu?y thi?ch miê?n tu?n thu? lu??t ch?i vê? ng?n ng??. Tr?? la?i tr??ng ta?m nêu trên; Vi? tr??ng na?y chi? du?ng trong h??u tr??ng, va? cu?ng suy ra ????c t?? nga?y c??n BC, nên ??? da?i 2 ky? t?? la? ?u?. (Sau na?y co? di?p ta se? xe?t ky? h?n). Hiê?n th??i ta biê?t nê?u du?ng Advanced Filter theo tr???ng ?o?, ta se? co? s?? liê?u trong nguyên 1 tha?ng;Ca?c ba?n th?? d?? trang ti?nh ‘CSDL’ ra va? th?? nhiê?u l??n ?i, se? th??y t?i no?i kh?ng sai. Va? nê?u c??n ba?n ghi tha?nh macro lu?n, khi ?a? tha?nh thu?c./(/h?ng ?a? no?i trên, s?? liê?u nguyên tha?ng nhiê?u khi kh?ng c??n thiê?t & se? d??n ?ê?n th?ng tin lê?ch la?c. V??y la? ta?i vu?ng kê?t xu??t kê?t qua? tha?ng, ta pha?i th??c thi nhiê?m vu? xo?a ?i nh?ng d?? liê?u sau nga?y yêu c??u ba?o ca?o!4./ Xo?a ?i s?? liê?u ca?c nga?y sau cu?a tha?ngMacro BaoCao d???i ??y, t?i ?a? s??a la?i, b?ng ca?ch thay vi? nh?ng do?ng lê?nh da?i t?i thay b?ng ca?ch go?i m?t macro kha?c (nh?ng macro ma? t?i ?a? kh??n khoa?ng ?ê? nghi? ca?c ba?n th??c hiê?n m?t ca?ch riêng re?, nh? sau (Tên la? do t?i a?p ???t, ca?c ba?n nên xem la?i):Macro xê?p CSDL theo nga?y (t?ng d??n) co? tên Sub XepNgay()Macro lo?c s?? liê?u theo nga?y co? tên Sub LocNgayBC()Macro lo?c s?? liê?u theo tha?ng co? tên la? Sub LocThang()Macro xê?p theo tha?ng co? tên Sub XepThang(), Vê? n??i dung macro na?y ba?n tham kha?o trong file ?i?nh ke?m! No? cu?ng gi??ng nh? XepNgay & tiê?n cho ai ?o? c??n xem xe?t, kiê?m tra. Nh? v??y macro ma? t?i co? ????c se? tr?? tha?nh nh? sau:Code:Sub BaoCao()501 Application.ScreenUpdating = 0: Sheets("CSDL").Select'Xê?p theo Nga?y XepNgay'Xo?a s?? liê?u cu?:503 Range("L2:M125", "O2:Q125").Select: Selection.ClearContents'Lo?c s?? liê?u nga?y:LocNgayBC 'Lo?c s?? liê?u tha?ng: LocThang'Xê?p theo tha?ng: XepThang'Ti?nh lu?y kê? ???u tha?ng:507 Dim Dat As Date: Dim StrC As String Dim Zj As Integer509 Dat = Range("H2").Value510 For Zj = 2 To 125511 StrC = "O" & CStr(Zj): Range(StrC).Select512 With Selection513 If Not IsDate(.Value) Or .Value > Dat Then Exit For514 End With515 Next Zj516 Range("O" & CStr(Zj) & ":Q125").ClearContents Sheets("BCao").Select518 Exit Sub'Hiê?n ca?c do?ng d?? liê?u: Selection.Rows.Hidden = False For Zj = 12 To 19 If Range("P" & CStr(Zj)).Value = 0 Then Rows(Zj).Hidden = True Next Zj End SubC?u lê?nh ???u tiên ta?i 501 du?ng ?ê? kho?i l??c l? ma?n hi?nh khi ta Select t?? sheets na?y sang sheets kia, hay t?? ???u CSDL ?ê?n ngày cu??i CSDL th??m chi? ?ê?n do?ng cu??i cu?a trang ti?nh. C?u th?? 2 trong do?ng ta ?a? biê?t;Hai c?u lê?nh trong do?ng 503 se? cho?n vu?ng g??m 2 kh??i & la?m tr??ng hoa?n toa?n ca?c ? trong no?./(ê? t?? c?u lê?nh 507 th??c s?? c??n kha?o sa?t ky?; trong do?ng ?o? co? c?u khai ba?o m?t biê?n Dat co? kiê?u d?? liê?u nga?y tha?ng; Kiê?u d?? liê?u na?y na na? v??i kiê?u d?? liê?i Long, vi? th??c ra nga?y tha?ng la? s?? nguyên kê? t?? 1/1/1900 ????c ??n ?i?nh la? 1, va? c?? thê?. . . c?? sau 1 nga?y t?ng 1 ??n vi?; Biê?n na?y ????c ga?n d?? liê?u ch??a trong ? H2 (t??t nhiên trong H2 pha?i ch??a d?? liê?u kiê?u nga?y hay t??ng t??.) th?ng qua c?u lê?nh 509;Do?ng lê?nh 510 & 515 ta cho qua?! Do?ng 511, ?? lê?nh ???u la?: ???i tri? trong biê?n Zj sang da?ng chu??i va? n??i v? ky? t?? ‘O’; VD Zj ?ang la? 35 thi? biê?n StrC se? ch??a chu??i ‘O35’ (kh?ng co? hai d??u nha?y ??n). Do?ng sau ba?o v??i VBA cho?n ? co? ?i?a chi? nh? v??y la?m ? hiê?n ha?nh. C?u lê?nh 512 & 514 ta qua lu?n?! C?u 513 no?i r??ng nê?u gia? tri? ch??a trong ? hiê?n ha?nh l??n h?n biê?n ch??a nga?y tha?ng (Dat) hay ? na?y kh?ng ch??a gia? tri? ? nga?y tha?ng thi? thoa?t kho?i vo?ng l??p; Ta?i sao pha?i co? hai ?K (?iê?u kiê?n)?; ?K ???u a?p du?ng cho tr??ng h??p nga?y BC nho? h?n nga?y sa?n xu??t & ?a? nh??p s?? liê?u; ?K sau ?ê? ?u?ng v??i tr??ng h??p ngày BC cu?ng la? nga?y nh??p s?? liê?u cu??i cu?ng. Nê?u thiê?u m?t trong hai co? lu?c ta bi? ba?o l??i kh?ng ng??. To?m la?i, vo?ng l??p 510 . . .515 se? l??n l???t duyê?t t?? ‘O2’ cho ?ê?n hê?t ? 125 ho??c g??p m?t trong hai ?iê?u kiê?n nêu trên ????c tho?a.Tuy ra kho?i vo?ng l??p r??i, nh?ng VBA v??n nh?? hoa?i gia? tri? Zj. Nh?? cho ?ê?n khi no? g??p ca?c mê?nh ?ê? nh? Exit Sub, End Sub, ho??c ta ga?n cho no? gia? tri? m??i . . . (u?ng nh?? v??y ma? ta viê?t ????c lê?nh 516: La?m tr??ng toa?n b?? ca?c ? trong vu?ng hi?nh ch?? nh??t. Ma? go?c trên tra?i nh??t cu?a hi?nh ch?? nh??t la? ? hiê?n ha?nh cho ?ê?n go?c pha?i th??p nh??t cu?a hi?nh ch?? nh??t la? Q125. Ma? ta?i sao la? 125 & c?? 125 ma?i v??y?! No? tu?y thu??c v? chu tri?nh sa?n xu??t cu?a ph?n x???ng II na?y; Khi ta la? ng???i ngoa?i l??p cho nh?n viên th?ng kê ph?n x???ng thi? ta pha?i ho?i s?? t??i ?a trong tha?ng ma? ca na?o ?o? co? thê? sa?n xu??t bao nhiêu sa?n ph??m.(/??y se? n??y sinh c?u ho?i: Nê?u sau na?y sa?n xu??t pha?t triê?n, g?y ra chuy?n v???t s?? 125 do?ng trong tha?ng thi? la?m ca?ch na?o?!Th??c tê?, ca?c La?o luyê?n trong VBA khuyên chu?ng ta trong tr??ng h??p na?y la? khai ba?o 1 h??ng s?? trong ph??n Declarations ?? trên cu?ng cu?a c??a s?? VBA, c?u lê?nh nh? sau:Const DongCuoi = 135Sau ?o? trong toa?n b?? ca?c macro trong ?o? co? thê? xa?i h??ng s?? na?y; M??t khi c??n ba?o tri? hay n?ng c??p, ta kho?i ti?m trong ca?c ?oa?n ma? m?t ca?ch kho? kh?n ma? chi? viê?c t?ng tri? cho h??ng s?? ma? th?i. Kê? ra no?i kh?ng sai r??ng ?i?nh lu??t ba?o toa?n cu?ng ?u?ng ca? trong tr??ng h??p nh? v??y!Ta?i vu?ng Declarations na?y ta co?n co? thê? khai ba?o nhiê?u th?? kha?c nhau, nh?S?? Pi: Ba?n th?n ma?y ?a? co? h??ng s?? na?y; nh?ng no? r??t da?i, ta co? thê? c??n s?? nh? 3,142 th?i:Const Pi = 3.142H??ng s?? co?n co? thê? la? chu??i ki? t?? nh? Const Schu = “Chu?c M??ng ?ê?n V??i VBA”?ê? sau ?o? ta l??p macro nh? sau:Code:Sub Auto_Open() MsgBox SchuEnd Sub/(/ê?u cu?ng ch?a tho?a ma?n theo kiê?u pha?i khai ba?o h??ng s?? thi? co? thê? du?ng vo?ng l??p Do. . . Loop thay cho vo?ng For . . . Next. Cu? pha?p ?ê? th??c hiê?n c?ng viê?c gi??ng v??i c?ng viê?c ma? for . . . next la?m nh? trên la? v??y:‘Thay cho c?u lê?nh 510 b?ng 3 c?u lê?nh 5100, 5101 & 5102: Code:5100 Zj =15101 Do5102 Zj= 1 + Zj511 512 513 ‘ C?u lê?nh na?y If Not IsDate(.Value) Or .Value > Dat Then Exit For ‘ ????c thay b?ng 5130 If Not IsDate(.Value) Or .Value > Dat Then Exit Do514 End With515 ‘ Next Zj ????c thay b?ng 5150 LoopBa?i t??p cu?a ba?i 5: Voo?ch cho ky? ca?ng file ?i?nh ke?mBài 6 Macro th??ng kê s?? liê?u. 1./ Th?ng kê sa?n l???ng ca?c ca t?? ???u tha?ng:Th??c ra TK (th?ng kê) na?y na?y ?a? tiê?m ??n, chi? co? ?iê?u ta ch?a cho no? xu??t ???u l?? diê?n ra ma? th?i. Ta?i sheets("BCao") vu?ng t?? P12-P20 co? c?ng th??c t??a nh? sau Trích:=SUMIF(CSDL!P$2:P124,"B1?",CSDL!Q$2:Q124) (/??y ?iê?u gi? se? xu??t hiê?n khi c?ng th??c trên ????c s??a la?i tha?nh: Trích:=SUMIF(CSDL!P$2:P124,"??A",CSDL!Q$2:Q124) va? nh??p v? ? na?o ?o? (VD $D$4 trong sheets ('ThKe')). C?ng th??c na?y cho ta SL (sa?n l???ng) ca A t?? ???u tha?ng. (Nê?u ba?n na?o co?n nghi ng?? nên xem la?i thêm ha?m SUMIF()!) /(/h? v??y ta chi? viê?c copy xu?ng d???i 2 do?ng n??a & chi?nh s??a la?i, la? ta co? ba?ng SL ca?c ca t?? ???u tha?ng Trong Sheets("BCao") ?a? co? SL t??ng ca trong nga?y. S?? liê?u ti?m ????c la? do c??ng d??n SL ca?c sa?n ph??m sa?n xu??t trong nga?y. Nê?u ca?c ba?n thi?ch xa?i ha?m SUMIF() thi? cu?ng co? c?ng th??c ?ê? ti?nh SL cu?a ca A nh? sau Trích:=SUMIF(CSDL!L$2:L124,"B?A",CSDL!M$2:M124) Ta co? thê? a?p c?ng th??c na?y v? ? $C$4 cu?a trang ti?nh th?ng kê & che?p xu?ng 2 ? co?n la?i, s??a ky? t?? 'A' tha?nh 'B' & 'C' t??ng ??ng se? co? s?? liê?u th?ng kê SL trong nga?y theo ca; Chu? y?: Trong ba?ng ba?o ca?o, SL ca?c sa?n ph??m cu?a t??ng ca ????c ti?nh theo ha?m VLOOKUP(); Tr??ng h??p gi? se? s??y ra khi ng???i nh??p liê?u nh??p 2 l??n m?t s?? liê?u: Ha?m VLOOKUP() chi? tra? vê? 1 kê?t qua?; nh?ng ha?m SUMIF() thi? c??ng ca? hai record na?y. Nh? v??y b?ng ca?ch na?y ta co? thê? kiê?m tra la?i kê?t qua? nh??p liê?u m?t ca?ch gia?n tiê?p! 2./ Th?ng kê sa?n l???ng t?? ???u tha?ng theo nga?y:Th??c ra ta chi? c??n m?t s?? thao ta?c t??ng t?? nh? trên se? co? s?? liê?u nh?ng nga?y sa?n xu??t cu?a ph?n x???ng II kia, th??t v??y: Ta?i c??t A, t?? A10 ?ê?n A40 ta nh??p ca?c s?? t?ng d??n kê? t?? 1 & sau ?o? cho ??n c??t A ?i! Ta?i B10 ta nh??p ha?m =DATE(YEAR(Nhap!B$2),MONTH(Nhap!B$2),A10) Ta?i C10 ta nh??p c?ng th??c =SUMIF(CSDL!O$2:O125,B10,CSDL!Q$2:Q125)Sau ?o? t? cho?n B10 & C10, che?p xu?ng ?ê?n ha?ng 40.Trong c?ng th??c ta?i c??t B v??a l??p, ? Nhap!B$2 la? ? ????c l??y la?m nga?y tha?ng cho ba?o ca?o ta?i sheet("BCao"). (Xem thêm c?ng th??c ta?i tiêu ?ê? ba?o ca?o.) Nh? v??y ta ?a? th??c hiê?n th?ng kê s?? liê?u nh? ?ê? mu?c ?a? nêu ma? kh?ng pha?i du?ng m?t c?u lê?nh na?o hê?t! H?n n??a vu?ng na?y lu?n se? ????c c??p nh??t nê?u ha?ng nga?y ta c??p nh??t ba?o ca?o b?ng nu?t lê?nh ' Ba?o ca?o' ta?i Sheets("Nhap");/(/h?ng s?? liê?u kh?ng tho?a ma?n chu?ng ta l??m, nh??t la? nh?ng nga?y ???u tha?ng v??i qua? nhiê?u s?? kh?ng trong d?? liê?u; Gi?? ??y macro m??i ra tay: la?m ??n ca?c do?ng ch??a d?? liê?u 0 trong vu?ng;Ba?n ha?y t?? thu m?t macro Sub An1Dong() theo ca?c b???c sau: - Cho?n do?ng b??t ky?;- V? menu Format -> Row -> HideVa? kê?t thu?c viê?c thu; nh??n ATL+F8 ?ê? m?? xem n??i dung macroCode:Sub An1Dong() Rows("40:40").Select: Range("B40").Activate Selection.EntireRow.Hidden = TrueEnd Sub?ê? ??n ca?c do?ng ma? ta?i c??t C cu?a do?ng ?o? co? tri? 0 ta pha?i du?ng vo?ng l??p. Vo?ng l??p se? cho?n l??n l???t t??ng ? kê? t?? C40 -> C10; khi na?o gia? tri? ta?i C(i) = 0 thi? cho ??n ?i. N??i dung cu?a no? nh? sau: Code:Sub AnDong() Dim jZ As Integer: Dim StrC As String Application.ScreenUpdating = False601 Sheets("ThKe").Select: Rows("10:40").Select602 Selection.EntireRow.Hidden = False For jZ = 39 To 9 Step -1 StrC = "C" & CStr(jZ): Range(StrC).Select With Selection If .Offset(1, 0).Value = 0 Then607 Rows(CStr(.Offset(1, 0).Row) & ":" & CStr(.Offset(1, 0).Row)).Hidden = True End If End With Next jZ End Sub?? ??y chi? co? ba v??n ?ê? t??ng ???i m??i c??n gia?i nghi?a:Ca?c c?u lê?nh 601:602 la? cho?n vu?ng g??m ca?c ha?ng t?? 10 ?ê?n 40 & cho hê?t ??n. Ta?i sao pha?i la?m v??y? B??i le? ?ê? pho?ng ai tr???c ?o? ?a? cho ??n m?t s?? do?ng b?ng macro na?y hay m?t macro kha?c siêu viê?t h?n. Ta?i sao vo?ng l??p la?i b??t ???u t?? ? 39 ma? kh?ng la? 40? Vi? chu?ng ta cho ??n kh?ng pha?i do?ng hiê?n ha?nh ma? la? do?ng d???i do?ng hiê?n ha?nh 1 do?ng. (Co?n ho?i tiê?p: Ta?i sao la?m v??y? – Thi?ch v??y, thê? th?i!). Do?ng 607 ????c diê?n di?ch la?: cho ??n do?ng ngay d???i do?ng hiê?n ha?nh. (?iê?u kiê?n ?a? nêu trong do?ng lê?nh trên : Nê?u d?? liê?u trong ? C cu?a no? b?ng kh?ng.) /(/h?ng macro na?y c??n ????c ca?i tiê?n, vi? co?n ch?a pha?i la? th??i ?a?i 2K (hay th??i @). Ta?i vi? gi??ng nh? ?i b??, thay vi? pha?i cha?y. . . T?i xin gi??i thiê?u m?t macro ??n m?t lu?c nhiê?u do?ng tr??ng, m?t khi chu?ng liên tu?c, nh? sau: Code:Sub AnNDong() Application.ScreenUpdating = False Sheets("ThKe").Select: Rows("10:40").Select Selection.EntireRow.Hidden = False Dim jZ As Integer, iBDau As Integer: Dim StrC As String For jZ = 40 To 10 Step -1 StrC = "C" & CStr(jZ): Range(StrC).Select With Selection608 If .Value = 0 Then 609 If iBDau = 0 Then iBDau = .Row610 Else611 If iBDau > 0 Then612 Rows(CStr(iBDau) & ":" & CStr(.Offset(1, 0).Row)).Hidden = True 613 iBDau = 0614 End If: End If End With Next jZEnd SubNê?u la? ng???i m??i v? nghê? di?ch thu??t thi? pha?i ke? bên mi?nh quyê?n t?? ?iê?n. Co?n chu?ng ta m??i v? nghê? ?o?c c?u lê?nh cu?ng pha?i co? chi? i?t c?y bu?t & t?? gi??y nha?p. Chu?ng ta se? ve? s? ??? kh??i cu?a nho?m lê?nh na?y! T?? phi?a d???i t?? gi??y ta ke? 1 ?oa?n th??ng & ghi s?? 40; Sau ?o? ghi trên no? gi??a ?oa?n th??ng la? s?? 0; (chi? nh?ng nga?y cu??i tha?ng cu?a tha?ng co? 31 nga?y m??i sa?n l???ng ma? th?i); C?u lê?nh 609 yêu c??u ga?n s?? ha?ng v? iBDau nê?u biê?n na?y ?ang ch??a gia? tri 0. (C??n nh?? r??ng sau khi khai ba?o iBDau, l??p t??c no? se? co? gia? tri? 0; Co?n khi kh??i ta?o biê?n da?ng chu??i no? se? ch??a chu??i r??ng "" (kha?c v??i chu??i tr??ng " ")). Ngoa?i ra ta co?n pha?i hiê?u thêm r??ng nê?u iBDau ?a? l??n h?n 0 thi? g??p ? gia? tri? 0 kê? tiê?p biê?n na?y cu?ng kh?ng thay gia? tri?. (Coi nh? c?u lê?nh ba?o ta re? tra?i) C?u lê?nh 610 no?i r??ng: tri? trong ? 'C(i)' <> 0 thi? th??c hiê?n ca?c lê?nh 611 ?ê? 613, (Coi nh? c?u lê?nh ba?o ta re? vê? ????ng bên pha?i go?i la? nha?nh (b)). Nh?ng ta?i nha?nh (b) na?y cu?ng la?i g??p nga? 3; H???ng re? tra?i (ta cho la? v??y), & la? h???ng chi?nh, ?o? la?: nê?u biê?n iBDau >0 thi? la? hai viê?c sau: a) La?m ??n ?i ca?c do?ng t?? d???i ngay do?ng hiê?n ha?nh cho t??i do?ng tru?ng v??i tri? trong biê?n iBDau ?ang l?u gi??; b) Sau khi cho ??n xong thi? ga?n cho t?i iBDau tr?? vê? 0Co?n h???ng re? pha?i: iBDau =0 thi? ?i tiê?p ( Co? nghi?a la? la?i tiê?p tu?c g??p do?ng ma? ta?i c??t C cu?a no? gia? tri? ch??a trong no? <> 0) Chu? y?: C?u lê?nh 609 ????c phe?p viê?t trên cu?ng m?t do?ng thay vi? pha?i ghi 3 do?ng; H?n n??a ta co? thê? ghi c?u lê?nh nh? sau: If Bdem = False then Ixxx = 0 Else Ixxx = 1?iê?u na?y i?t th??y, nh?ng cu?ng nêu lu?n ra ??y ?ê? cu?ng ghi nh??n: C?u lê?nh 614 th??c tê? la? 2 do?ng lê?nh, ????c ng?n ca?ch b??i ky? t?? ':'. Nh?ng khi g??p hai vo?ng l??p For l??ng v? nhau, ta co? thê? ghi nh? sau ma? kh?ng bi? pha?n ???i: Code:For Jz = 1 to 999 iDem = iDem +1 for Wj = 1 to 987 iDem = iDem -1Next Wj, JzNh? ca?c ba?n th??y biê?n ?ê?m vo?ng l??p trong ghi tr???c biê?n ?ê?m vo?ng l??p ngoa?i; Nê?u ng???c la?i thi? hai vo?ng l??p na?y kh?ng co?n l??ng v? nhau n??a, ma? ?ang ca?i nhau!3./ Xo?a do?ng trong sheetsTa thu macro xo?a m?t do?ng theo ca?c b???c nh? sau:V? menu Tool ->Macro -> Record New Macro. . . Va? ???t tên cho macro la? Xoa1DongCho?n do?ng 45 & v? menu Edit -> DeleteVa? b??m nu?t kê?t thu?c macro. Macro co? n??i dung nh? sau:Code:Sub Xoa1Dong() Rows("45:45").Select Selection.Delete Shift:=xlUpEnd Sub?ê? th??y macro na?y la?m viê?c ra sao ta pha?i t? ma?u nê?n ca?c ? t?? A45 cho ?ê?n A50 b??ng ca?ch b??m v? trang ti?nh, cho?n da?y ? & cho?n 1 trong ca?c ma?u do?ng cu??i trong biê?u t??ng Fill Color trên thanh c?ng cu?. Sau ?o? ta b??m v? CS (c??a s??) Microsoft Visual Basic & thu nho? no? la?i chi? chiê?m n??a pha?i ma?n hi?nh; ???t con tro? trong ca?c do?ng cu?a macro & nh??n phi?m F5 va?i l??n; C?? sau m??i l??n nh??n, ta se? th??y ca?c ? t? ma?u nê?n gia?m ?i m?t. Sau ?o? ta ?ê? con tro? sau ch?? Select & nh??n phi?m Delete ?ê? hai do?ng lê?nh tr?? tha?nh 1 Va? xo?a ch?? "Select" & "Selection." ?i. Ta tiê?p tu?c b??m {F5} ?ê? macro tiê?p tu?c xo?a ca?c do?ng co? ma?u co?n la?i. (?ng viê?c tiê?p theo se? th?? thay thê? macro ??n do?ng b?ng macro co? ch??a lê?nh xo?a do?ng. Ca?c b???c nh? sau: T? cho?n da?y ca?c ? t?? A10 ?ê?n C40 & che?p xu?ng A50 tr?? ?iTa?i ???u do?ng lê?nh 603 ta ?a?nh d??u nha?y ?ê? v? hiê?u ho?a ?i; ?ê?n cu??i do?ng lê?nh & b??m ENTER ta?o do?ng m??i. Nh??p v? ?o? c?u lê?nh: For jZ = 80 To 50 Step -1Tiê?p theo cu?ng la?m nh? v??y v??i c?u lê?nh 612 & nh??p c?u lê?nh m??iRows(CStr(iBDau) & ":" & CStr(.Offset(1, 0).Row)).Delete Shift:=xlUpThu nho? CS MVB co?n n??a pha?i ma?n hi?nh; b??m tro? chu??t lên macro AnNDong & nh??n phi?m {F5} ?ê? xem macro la?m viê?c; Sau khi th?? nghiê?m th?ng tha?o ta tra? macro AnNDong vê? nh? cu?. Vi? th??c tê? chu?ng ta c??n la? ??n do?ng, ch?? kh?ng c??n xo?a do?ng trong ba?o ca?o Ba?i t??p cu?a ba?i 6: Ta?i Sheets("Nhap") co? ComboBox "Sa?n l???ng". Ha?y pha?i chu??t v? ?o?, cho?n do?ng g??n cu??i Assign Macro. . . . Khi CS Assign Macro xu??t hiê?n ha?y cho?n nu?t Edit bên pha?i CS ?ê? xem n??i dung macro na?y. Ba?n co? hiê?u n??i dung kh?ng?Bài 7 Macro va? ??? thi?.1.D??ng ??? thi? da?ng c??t b?ng VBATh??t ra chu?ng ta se? thu Mc (macro) ta?o l??p m?t va?i loa?i ?T (??? thi?). Ta?i Sheets(“DoThi”) ta nh??p v? c??t A b??t ???u t?? A2 ca?c gia? tri? tu?y cho?n sau: 5, 4, 7, 9, 6, 7. Va? A1 la? chu??i ‘SL’. Ta th??c hiê?n ca?c b???c thu Mc t?? ??ng x?y d??ng ?T da?ng c??t, nh? sau:. V? menu Tool ->Macro-> Record New Macro & ???t tên cho Mc la? DoThi1. Cho?n vu?ng A2:A7 b??m v? biê?u t??ng Chart Wizard trên ToolBar. Se? xu??t hiê?n b???c 1 cu?a Chart Wizard (Chart Type). Ta ch??p nh??n theo g??i y? cu?a Excel b?ng ca?ch b??m Next. Chuy?n nhanh sang b???c 3 b?ng nu?t lê?nh Next m?t l??n n??a;. Ta?i giai ?oa?n ba ta v? ng?n Gridlines & bo? cho?n nu?t Major Gridlines. Chuy?n sang b???c b?n b?ng phi?m next & b??m nu?t lê?nh Finish ?ê? kê?t thu?c b???c b?n cu?a viê?c ve? ?T.. B??m pha?i chu??t v? vu?ng ma?u sa?m cu?a ?T & cho?n ha?ng trên cu?ng co? do?ng Format Pilot Area. . .. Trong h??p thoa?i na?y ta th??y phi?a pha?i co? h??p Area. Ta cho?n ma?u tr??ng thay vi? ma?u xa?m. Kê?t thu?c thu Mc.Ta m?? Mc ra tri?nh t?? se? s??a & cha?y la?i no? nh? sau:- V? hiê?u ho?a ca?c do?ng lê?nh sau Code: With ActiveChart.Axes(xlCategory) .HasMajorGridlines = False .HasMinorGridlines = False End With With Selection.Border .ColorIndex = 16 .Weight = xlThin .LineStyle = xlContinuous End With- Thu nho? CS (c??a s??) VB (Microsoft Visual Basic) ?ê? nhi?n th??y m?t n??a ??? thi?; Thiê?t ???t tro? chu??t trên Mc v??a s??a & b??m phi?m {F5} cho Mc cha?y. Nê?u Excel kh?ng ??a ra l??i pha?n ???i na?o thi? ta co? hai ??? thi?; ba?n th?? bo? b??t m?t ca?i;/(hi ?o? Mc se? co? n??i dung nh? sau:Code:Sub DoThi1() Range("A2:A7").Select Charts.Add ActiveChart.ChartType = xlColumnClustered ActiveChart.SetSourceData Source:=Sheets("DoThi").Range("A2:A7"), PlotBy:= _ xlColumns ActiveChart.Location Where:=xlLocationAsObject, Name:="DoThi" With ActiveChart.Axes(xlValue) .HasMajorGridlines = False .HasMinorGridlines = False End With ActiveChart.PlotArea.Select With Selection.Interior .ColorIndex = 2 .PatternColorIndex = 1 .Pattern = xlSolid End WithEnd Sub2.D??ng ??? thi? da?ng ?oa?n th??ng & la?m cho Mc nh??n th?ng s?? ta trao choNê?u ta?i do?ng th?? ba ta v? hiêu ho?a no? b?ng d??u nha?y ???u do?ng; sau ?o? ta?o do?ng & nh??p v? do?ng m??i na?y c?u lê?nh sau:ActiveChart.ChartType = xlLineMarkersCho cha?y la?i Mc v??i do?ng lê?nh m??i na?y, ba?n se? thu ????c m?t ?T da?ng ?oa?n th??ng g??p khu?c;(Do?ng lê?nh na?y se? co? trong Mc nê?u thu nh? Mc DoThi2 nh? ?? ph??n ???u cu?a ba?i, nh?ng ?? b???c 1 ta cho?n loa?i ??? thi? ?oa?n th??ng)Nh? v??y ta co? thê? nh??n hai loa?i ?T trên m?t Mc; Nh?ng co?n m?t ?iê?u b??t tiê?n la? m??i l??n c?? pha?i ???i do?ng lê?nh hay sao?! Co? ca?ch na?o ?ê? Mc t?? ?i ?u?ng h???ng ta c??n kh?ng?. Co? & ?o? la? ca?ch chu?ng ta trao cho Mc m?t biê?n (m?t tham s??) ?ê? no? th??c hiê?n; Biê?n ?o? tu?y lu?c nh??n m?t trong hai s?? liê?u quy ???c cu?a excel ma? no? hiê?u ????c, cu? thê? ?? ??y la? xlColumnClustered & xlLineMarkers; (ca?c biê?n na?y thu??c kiê?u d?? liê?u Integer)Ta thay Mc ?o? nh? sauCode:Sub DoThi1(LoaiDT As Integer) Range("A2:A7").Select Charts.Add‘ ActiveChart.ChartType = xlColumnClustered ActiveChart.ChartType = LoaiDT ‘xlLineMarkers. . . . . . . . End SubSau khi s??a & l?u Mc na?y la?i, tr?? vê? ba?ng ti?nh & b??m t?? h??p phi?m ALT+{F8} ta kh?ng co?n th??y tên Mc DiThi1 ????c liê?t kê trong danh sa?ch. Nh?ng no? kh?ng m??t ??u ca?c ba?n! Nê?u ba?n ?a? l??p m?t Mc na?o kha?c thi? b??m v? ?o?; b?ng kh?ng ba?n b??m ALT+{F11} thi? CS VB se? xu??t hiê?n ?ê? ba?n xem xe?t & thao ta?c v??i no? nê?u c??n!Ca?ch go?i Mc DoThi1 na?y khi ?ê?n mu?c 4 cu?a ba?i se? ?ê? c??p ?ê?n. Co?n ta?i th??i ?iê?m na?y, mu??n kiê?m tra s?? s??a ch??a cu?a ba?n ?a? ?a?ng yên t?m ch?a, ta v? CS VB nh? v??a nêu trên. Sau ?o? thu nho? CS VB na?y co?n chiê?m n??a ma?n hi?nh. Tiê?p theo v? menu View -> Immediate Window. Ta se? th??y CS m??i xu??t hiê?n & khiêm t??n n??m bên d???i CS VB. Ta ??n chu??t v? thanh tiêu ?ê? CS Immediate na?y & ke?o cho n??m trung t?m cu?a CS VBBa?n b??m tro? chu??t lên CS Immediate & nh??p do?ng lê?nh DoThi1 xlColumnClustered Kê?t thu?c b?ng phi?m ENTER ?ê? Mc ????c th??c hiê?n v??i tham s?? xlColumnClustered. Nê?u kê?t qua? my? ma?n, ba?n ghi tham s?? th?? hai v? & kiê?m ch??ng l??n n??a ?ê? hoa?n toa?n yên t?m.Sau ??y ta l??p thêm m?t Mc biê?u ??? hi?nh ba?nh ??n gia?n n??a. Vi? sao t?i no?i ??n gia?n, vi? chu?ng ta ch?a tinh chi?nh cho ca?c ?T dê? nhi?n h?n m?t ty? te?o na?o ca?!3.D??ng ??? thi? da?ng hi?nh ba?nh ??n gia?n & co? miê?ng ta?ch r??iTa ta?o Mc co? tên DoThiB b?ng ca?ch v? menu Tool ->Macro->Record New Macro. . . nh? t??ng quen thu??c. Th??c hiê?n ca?c b???c tiê?p theo cu?ng r??t quen v??i chu?ng ta, ?o? la?:- Que?t cho?n vu?ng d?? liê?u t?? A2 ?ê?n A7; b??m v? biê?u t???ng ta?o ?T trên thanh c?ng cu?;- Ta?i b???c 1 cu?a 4 b???c ta?o ?T, chu?ng ta cho?n Pie trong CS Chart Type; Ta?i CS Chart Sub-Type bên pha?i xu??t hiên 6 loa?i ba?nh; ta cho?n loa?i gi??a ha?ng trên;- Ch??p nh??n m??c ?i?nh cu?a ca?c b???c hai & ba & ??n ngay phi?m Finish ?? b???c 4;- Ta?i ?T hi?nh ba?nh m??i xu??t hiê?n, ta ki?ch hoa?t ca?c ba?nh & sau ?o? cho?n m?t ba?nh (khi ????c cho?n, trên viê?n viên ph?n ?o? xu??t hiê?n 6 nu?t ?a?nh d??u; ta ??n chu??t v? viên ph?n ?o? & ke?o rê ra xa t?m cu?a ba?nh m?t chu?t- Ta kê?t thu?c thu Mc ta?i ??y;/(/ê?u Mc cu?a ba?n gi??ng nh? d???i ??y la? t??t r??i; Ta?i hai do?ng cu??i cu?a Mc ?ê? c??p no?i lên viên ph?n th?? m??y trong ca?c viên ph?n ????c cho?n & ke?o ra kho?i ca?c t??p h??p cu?a chu?ngCode:Sub DoThiB() Range("A2:A7").Select Charts.Add ActiveChart.ChartType = xl3DPie ActiveChart.SetSourceData Source:=Sheets("DoThi").Range("A2:A7"), PlotBy:= _ xlColumns ActiveChart.Location Where:=xlLocationAsObject, Name:="DoThi" ActiveChart.HasTitle = False ActiveChart.SeriesCollection(1).Select ActiveChart.SeriesCollection(1).Points(4).Select Selection.Explosion = 30End SubGhi chu?: Vi? ta ghi Mc b?ng nh?ng ha?nh ??ng th??t ??n gia?n nên ca?c ba?n t?? suy lu??n & di?ch ng?n ng?? VBA hai Mc na?y!Nê?u ba?n na?o kh?ng t?? ta?o ????c Mc cho mi?nh thi? ca?ch cu??i cu?ng la? che?p hai Mc na?y v? CS VB cu?a ba?n ?ê? xa?i ta?m;Trong th??c tê?, viê?c chi?nh da?ng ?T kh?ng lu?c na?o la? kh?ng th??c hiê?n; nh?ng ?? ??y chi?nh la? chu?ng ta quan t?m ?ê?n viê?c ta?o ?T b?ng VB. Co?n sau khi ?a? tha?nh thu?c thi? n?ng ??? kho? cu?a Mc la? chuy?n cu?a ba?n. H?n n??a sau khi cha?y Mc v??i nh?ng s?? liê?u kha?c nhau, ba?n pha?i chu??t v? ph??n ?T c??n chi?nh s??a & hoa?n thiê?n chu?ng cu?ng kh?ng mu??n.3.Du?ng OptionButton go?i th??c hiê?n m?t Mc/(/o?i tr???c la? trong excel co? hai loa?i OB (Option Button); Loa?i ???u tiên ta se? th??y ngay sau ??y; loa?i th?? hai ?? trong thanh c?ng cu? Forms. Mu??n nhanh cho?ng th??y thanh c?ng cu? na?y ta pha?i chu??t lên vu?ng tr??ng cu?a ToolBar & cho?n do?ng Forms.(o?n mu??n la?m viê?c v??i loa?i ???u tiên ta cu?ng pha?i chu??t v? vu?ng nh? trên; Sau ?o? cho?n do?ng Control Toolbox. Khi ?o? xu??t hiê?n trên ma?n hi?nh thanh c?ng cu? Control Toolbox g??m th??ng 15 nu?t. Nu?t chu?ng ta quan t?m la? nu?t khi ta ?ê? chu??t v? no? m?t th??i gian ?u? l?u, se? hiê?n lên do?ng Option Button.Ta nh??p chu??t lên nu?t & ?ê?n vu?ng na?o ?o? co?n tr??ng ma? ba?n mu??n ???t nu?t na?y lên. ??n tra?i chu??t & ke?o ve? hi?nh ch?? nh??t chiê?m tro?n 4 ? (VD B9:C10); b??m lên ch?? tr??ng trên trang ti?nh. Sau ?o? ba?n pha?i chu??t lên nu?t lê?nh ?ê? xem menu t??t cu?a no?. Trên no? co? do?ng View code ta ??n v? ?o?. L??p t??c CS VB m?? ra & co? do?n s??n cho ta b??a diê?m t?m g??m: Code:Private Sub OptionButton1_Click() End SubTrích:Do?ng lê?nh ta thêm v? gi??a hai do?ng na?y: msgbox “1”,,”OK” Xong ta ?o?ng CS VB b?ng t?? h??p ATL+QTh??c hiê?n l??p la?i v??i 1 OB n??a; nh?ng l??n na?y v??i do?ng lê?nh msgbox “2”, , “OK”Tiê?p tu?c pha?t huy chiên qua? v??i OB th?? ba, chi? kha?c do?ng lê?nh gi?? la? dothib (?o? la? tên Mc ta?o ?T da?nh ba?nh ma? ta ?a? thu. Nê?u kh?ng sai thi? VBA se? s??a tên cu?a MC ta v??a go? tr?? tha?nh ?u?ng cu?a no? (?o? la? DoThiB)Tr?? vê? trang ti?nh, sau m?t va?i phu?t (suy) nghi?, ta tiê?p tu?c pha?i chu??t v? cac OB & cho?n format Control; v? ng?n Properties bo? cho?n nu?t Print Object, nh?ng la?i cho?n nu?t Don’t move or size with Cells. (Viê?c na?y nên th??c hiê?n cho ca? ba OB m??i co? i? nghi?a)La?i pha?i chu??t v? OB, cho?n do?ng OptionButton Object => Edit; Con tro? nha?y lên ca?c ch?? m??c ?i?nh cu?a Excel; Ta s??a chu?ng l??n l???t la?: ??? thi? da?ng c??t; ??? thi? ?oa?n th??ng & ??? thi? da?ng ba?nh.Kê?t thu?c c?ng viê?c xem ra m??i me? & ko? ?a na?y b?ng ca?ch thoa?t vê? windows ?ê? l?u mo?i thao ta?c cu?a ta la?i;Sau ?o? la?i m?? trang ti?nh Dothi ?o? ra trong excel; chu?ng ta th?? cho?n lên l??n l???t t??ng nu?t OB xem ?iê?u gi? sa?y ra?!; Pha?i la? v??y:??n lên nu?t (1) se? hiê?n lênh h??p thoa?i Do?ng tiêu ?ê? co? ch?? ‘OK’, d???i no? la? do?ng ‘1’ & nu?t ‘OK’; Ba?n pha?i b??m v? no? m??i la?m viê?c kha?c ????c!Nu?t th? hai cu?ng t??ng t??; Nu?t th?? ba bi? cho?n se? xu??t hiê?n ?T hi?nh ba?nh!4. M??t Mc truyê?n th?ng s?? cho m?t McTa biê?t r??ng Mc DoThi1 c??n ????c nh??n l??n l???t hai biê?n kha?c nhau ?ê? ve? lên hai da?ng ??? thi? kha?c nhau; Ta ?a? co? 2 OB; nh? v??y viê?c co?n la?i se? nh? con tho? ?n co? ma? th?i:Tr???c tiên ma? c??n biê?t ti?m nhanh 3 ca?i Mc VB ta?o ra chu?ng n??m ??u?Ta pha?i chu??t v? ? DoThi cu?a thanh liê?t kê trang ti?nh (go?c tra?i d???i ma?n hi?nh;Ta v? th?m nh?ng gi? co? trong do?ng View Code; Se? ?u?ng nê?u ta la?i th??y ba ca?i anh cha?ng mà ta & VB ?a? cu?ng nhau n??n ra hi?nh ha?iTa s??a hai anh ???u th?i, ?ê? co? n??i dung sau: Code:Private Sub OptionButton1_Click() DoThi1 xlColumnClusteredEnd Sub Private Sub OptionButton2_Click() DoThi1 (xlLineMarkers) End SubChu? y?: · Sau khi l?u & m?? la?i sheets(“DoThi”) ta kh?ng thê? pha?i chu??t v? ca?c OB ?ê? s??a nh?ng sai lê?ch ????c n??a; (VD chuy?n t?? tên go?i ‘??? thi? ba?nh’ sang ‘??? thi? da?ng ba?nh’); Chi? co? ca?ch la? cho hiê?n thanh c?ng cu? Control Toolbox; B??m v? nu?t co? hi?nh ê ke co? Tool Tip la? Design Mode, sau ?o? cho?n OB c??n hiê?u chi?nh,. Sau khi hiê?u chi?ng xong ta la?i b??m biê?u t??ng th???c ê ke m?t l??n n??a, lu?c na?y ph??n ???u cu?a Tool Tip co? thêm ch?? Exit · Th??c ra hai ca?ch truyê?n tham s?? nh? trên cu?ng ????c VB ch??p nh??n, ta nên cho?n m?t ca?ch na?o th??y thu??n tiê?n! ?ê?n th??i ?iê?m na?y se? pha?t sinh ca?c c?u ho?i:1. Nê?u nhu c??u truyê?n nhiê?u h?n m?t tham s?? thi? sao?2. Ch?? Private kia tr???c ch?? Sub co? nghi?a gi??3. Co? ca?ch na?o khi Mc go?i lê?nh th??c ha?nh Mc DoThi1 ma? quên (hay vi? li? do gi? ?o? kh?ng ti?m ra th?ng s?? ?ê?) truyê?n tham s?? thi? Mc Dothi1 c?? l??y m?t tham s?? na?o ?o? & cha?y hay kh?ng?Nh??ng v??n ?ê? na?y se? ?ê? c??p t??i trong nh?ng l??n sau, nê?u co? di?p. Nh?ng ca?c ba?n co? thê? t?? ti?m hiê?u ?? ??u ?o? tr???c xem sao?. .Bài 8 Macro l??p PivotTable. 1. Ta?o d??ng m?t PivotTable nh? macro??u tiên chúng ta c?n t?o ra CSDL (c? s? d? li?u) nh? trong file Bai8.XLS ?ính kèm. CSDL trong sheets(“PiVot”) có 7 tr??ng: Ngay, TenHang, NhaCungCap, SoLuong, Tinh, DonGia, TTien ?? qu?n l? hàng xu?t nh?p c?a các ??n v? thành viên ? Tp HCM & ba t?nh l?n c?n.Ta thu Mc (macro) c?ng nh? các l?n tr??c. Nh?ng v?i nh?ng ai ít thao tác t?o PivotTable thì ph?i nhu??n nhuy?n tr???c các b??c sau ??y:T?i trang tính ‘PiVot’, ta v? menu Tool ->Macro -> Record New Macro. . . . T?i CS (c?a s?) v?a xu?t hi?n ta ??t tên Mc là PiVotTable & b?m OK ?? v? trang tính & thu ti?p các b??c sau:· Ta b?m v? ? A11 (là ? có d? li?u c?a CSDL) & ?n t? h?p CTRL+* (phím d?u sao). Khi ?ó toàn b? kh?i d? li?u ???c ch?n.· V? menu Data -> PivotTable and PivotChart Wizard – Step 1 of 3. trong CS s? có hai dòng m?c ??nh ???c ch?n, ?ó là: Microsoft office Excel list or databasePivot TableTa b?m v? phím Next ?? qua giai ?o?n 2; n?u toàn CSDL ?? ???c li?t kê ta ch?n b?m ti?p nút Next ?? qua giai ?o?n 3. · T?i ??y ta ?n v? nút Layout (trái nh?t c?a CS). Màn hình thi?t k? trang PivotTable xu?t hi?n; Ta kéo tr??ng NCC v? vùng PAGE;T??ng t? tr??ng Tinh ???c kéo v? vùng COLUMN; kéo tr??ng THg v? vùng ROW và cu?i cùng là tr??ng TTien v? vùng DATA. Nh?p ?úp lên chính tr??ng này trong vùng v?a th? ?? v? CS PivotTable Field; ch?p nh?n các th?ng s? m?c ??nh là tính t?ng; nh?p ti?p v? nút Number. . . bên phía ph?i CS và ch?n ??nh d?ng cho t?ng thành ti?n có 1 ch? s? sau d?u ph?y & ta c?n ph?n cách ph?n ngàn. Xong b?m hai l?n hai nút OK k?t thúc ph?n t?o l?p PivotTable;· Trên màn hình hi?n ra b?ng t?ng h?p theo ta yêu c?u; Bên c?nh tr??ng THg có hình m?i tên xu?ng r?t ??m; ta b?m v? ?? th?y li?t kê danh sách m? hàng; ta b? ch?n m?t m?t hàng có m? là RDE & b?m OK tr? v? trang tính; khi ?ó m?t m?t dòng trên b?ng bi?u t?ng h?p.· K?t thúc ghi McMc c?a chúng ta thu có nh?ng dòng l?nh sau:Code:Sub Pivot_Table() Range("A11").Select ‘Ta kh?i ??ng Mc t?i Sheets(“PiVot”) 802 Selection.CurrentRegion.Select ‘ Ch?n toàn vùng CSDL‘V?i M?c??nh version 10, m?t PivotTable ?ích có tên “PivotTable1” t? d? li?u ngu?n‘t?i Sheets(“PiVot”) b?t ??u t? ? trái trên là dòng 10 c?t 1 cho ??n ? pha?i d???i dòng 50 c?t 7‘ ???c t?o thêm:803 ActiveWorkbook.PivotCaches.Add(SourceType:=xlDatabase, SourceData:= _ "Pivot!R10C1:R50C7").CreatePivotTable TableDestination:="", TableName:= _ "PivotTable1", DefaultVersion:=xlPivotTableVersion10‘L?y ? (3,1) cu?a trang ti?nh v??a l??p làm n?i b?t ??u d?ng Pivottable:804 ActiveSheet.PivotTableWizard TableDestination:=ActiveSheet.Cells(3, 1) ActiveSheet.Cells(3, 1).Select ‘’(Ba?n hiê?u r??i!)‘T??ng h??p theo NCC, v??i ca?c danh sa?ch c??t trong tr???ng [Tinh], ca?c ha?ng la? tr???ng [THg]‘v? trang ti?nh co? tên ‘PivotTable1’ (Trang na?y do VB ga?n cho):806 ActiveSheet.PivotTables("PivotTable1").AddFields RowFields:="THg", _ ColumnFields:="Tinh", PageFields:="NCC"‘ V??i tr???ng [TTien] trong ‘PivotTable1, tiê?n ha?nh ?i?nh da?ng di?nh da?ng d?? liê?u kê?u s??‘ v??i 1 ky? s?? ?? ph??n th??p ph?n: With ActiveSheet.PivotTables("PivotTable1").PivotFields("TTien")808 .Orientation = xlDataField: .NumberFormat = "#,##0.0" End With‘ Ph?n c?u l?nh làm ?n m?t hàng co? ma? RDE With ActiveSheet.PivotTables("PivotTable1").PivotFields("THg")810 .PivotItems("RDE").Visible = False End WithEnd SubTh??ng nh?ng c?u l?nh t?o PivotTable, Advanced Filter,. . . ??u dài. Nh?ng c?u nh? v?y có khi d? hi?u h?n nh?ng c?u ng?n, & kh?ng ??n n?i làm ta kh?ng th? hi?u.2. Xo?a m?t PivotTable nh? macro?ê? xo?a 1 trang ti?nh (VD nh? trang PivotTable) m??t ca?ch t?? ???ng, ta pha?i l??i du?ng ti?nh t?? ???ng ga?n tên trang ti?nh khi Excel kh??i ta?o; Mu??n v??y ta ???i tên ca?c trang ti?nh co? tên m??c ?i?nh ?i, ?ê? tra?nh bi? xo?a nh??m.Sau ?o? ta cha?y Mc PiVotTable ?ê? no? ta?o ra 1 ba?ng t??ng h??p;Th??c hiê?n thu Mc ?ê? xo?a ba?ng v??a ta?o co? tên XoaTrang. No? co? hai c?u lê?nh nh? sauCode:Sub XoaTrang() Sheets("Sheet1").Select: ActiveWindow.SelectedSheets.DeleteEnd SubMc na?y co?n va?i khiê?m khuyê?t: No? chi? biê?t xo?a trang ti?nh co? tên ‘Sheet1’ ma? th?i; Kh?ng nh??ng thê? no? co?n hay ho?i l?i th?i! ?ê? th??y ?iê?u na?y ba?n th?? cho cha?y Mc PivotTable & sau ?o? xo?a th?? trang ti?nh v??a ta?o b??ng Mc se? biê?t ngay!Chu?ng ta se? ta?c ???ng ?ê?n Mc na?y ?ê? co? n?ng l??c xo?a 9 trang ti?nh nê?u co? trên workbook cu?a ta & se? c??m ???u la?m th?i, kho?i ho?i n??a! N??i dung Mc se? nh? sau:Code:Sub ClearTable() On Error GoTo LoiMacro Dim iJ as Integer: Dim StrC As String Application.DisplayAlerts = False For iJ = 1 To 9 StrC = "Sheet" & CStr(iJ): Sheets(StrC).Select Worksheets(StrC).Delete Next iJerrMacro: Application.DisplayAlerts = True Err = 0: Exit Sub ‘ ===*===*=== LoiMacro: If Err = 9 Then Resume errMacro If iJ < 9 Then Resume Next Else MsgBox "Ban Hay Tu Xoa PivotTable Vua Tao!": Resume errMacro End IfEnd SubTrong Mc na?y nhiê?m vu? chu? yê?u la?: nê?u g??p ca?c trang ti?nh co? tên Sheet(i) ma? i=1-9 thi? xo?a ?i, N??i dung cu?a no? ????c thê? hiê?n trong vo?ng l??p For . . .. . Next.?ê? tra?nh viê?c ho?i la?i, ma? c?? xo?a hê?t ta ?a? du?ng c?u lê?nh:Application.DisplayAlerts = FalsePhi?a sau c?u lê?nh na?y, VB se? kh?ng ho?i chu?ng ta n??a cho ?ê?n khi g??p la?i c?u lê?nhApplication.DisplayAlerts = True?ê? tra?nh l??i, trong Mc co? b?? ph??n ba?y & x?? ly? l??i & di?ch c?u lê?nh ???u tiên trong Mc la?: LoiMacro la? n?i ?ê?n nê?u g??p l??i V??y ca?i n?i ma? pha?i ?ê?n na?y la?m nh??ng viê?c gi??a.) Nê?u ba?n bi? l??i co? ma? l??i la? 9 (Err = 9) thi? ?ê?n ?i?a chi? errMacro ?ê? gia?i quyê?t; (Th??c ra ?ê?n ??y ?ê? r??a kiê?m & nghi? ?o? th?i: )b.) Nê?u ma? l??i <> 9 thi?: Se? th??c thi m??t trong hai tr???ng h??p sau:o Nê?u iJ < 9 thi? th??c hiê?n ca?c c?u lê?nh tiê?p sauo Nê?u iJ =9 thi? ??a ra l??i khuyên: Ha?y t?? xo?a PivotTable v??a ta?o & tiê?p nh? a.)Tr???ng h??p gi? se? diê?n ra nê?u t?i co? ba trang ti?nh v??i ca?c tên: ‘Sheet1’, ‘Sheet2’ & ‘Sheet4’? Khi cha?y Mc ClearTable no? se? ch??a la?i trang ti?nh cu??i, ?ê? ta la?m ky? niê?m!?ê? VB gia?i thi?ch cho ro? thêm vê? l??i co? mang ma? s?? 9 (cu?ng nh? ca?c ma? kha?c n??a) ta cho hiê?n CS Immediate nh? ba?i tr???c ?a? nêu. Go? v? ?o? do?ng lê?nh: ? Error$(9) & ??n ENTER ?ê? biê?t thêm. 3. Ng???i du?ng t?? cho?n l??a ca?c tr???ng/(/ê?u ta ?i qua ba b???c ta?o PivotTable cu?ng kha? m??t th??i gian, nh??t la? chi? c??n kha?o sa?t nh??ng chi? tiêu m??t ca?ch ??n gia?n nh?ng le? la?ng.Tiê?p theo chu?ng ta se? kê?t h??p Mc & s?? h?? tr?? cu?a ComboBox & listBox trong thanh c?ng cu? Forms thi? t?ng t??c ?a?ng kê? viê?c ta?o PivotTable;?ê? ????c v??y, tr???c tiên ta ta?o Sheet co? tên ‘CrTab’ theo file ?i?nh ke?m. Trên no? ta g??n 1 LB (listbox) (ta?i ???u c??t H) & d???i no? la? m??t CB (ComboBox);. G??n s??n thêm m??t nu?t lê?nh ?ê? cha?y Mc ta?o PT (PivotTable) (Nu?t ?ang co? nha?n ‘New Pivot’).Khi trên LB hiê?n t?? Row, nê?u cho?n tr???ng na?o ?o? trong CB thi? Mc ??n trong CB se? ga?n tên tr???ng ?o? v? ? B3 (?ê? Mc ta?o PT l??y la?m ha?ng). T??ng t?? nê?u LB co? t?? Column thi? se? ga?n ?ê?n C2 tên tr???ng du?ng ?ê? la?m c??t cho PT & se? la? DATA nê?u ta?i LB la? Data.N??i dung hai Mc ?o? nh? sau:Code:Sub ChonTruong() Dim Truong As Integer, SRng As String Truong = Range("E1").Value ‘---->’E1’ la? ? n??i kê?t v??i LB Select Case Truong Case 1 SRng = "B3" Case 2: SRng = "C2" Case 3: SRng = "C3" Case Else: Exit Sub End Select Range(SRng).Value = Application.VLookup(Range("E3").Value, Range("F1:G8"), 2)End Sub Sub AddPivotTable() On Error Resume Next ‘ C?u lê?nh na?y ?a? ????c ?ê? c??p ?ê?n Dim sRField As String, sCField As String, sDField As String Dim iRange As Range ‘<= Khai ba?o biê?n co? kiê?u d?? liê?u la? range Application.ScreenUpdating = 0sRField = Range("B3").Value ‘? Th??c hiê?n ca?c phe?p ga?n gia? tri? cho ca?c biê?n: sCField = Range("C2").Value: sDField = Range("C3").Value Sheets("PiVot").Select: Range("B12").Select Selection.CurrentRegion.Select ‘ <= Cho?n vu?ngSet iRange = Selection ‘ <= Vu?ng cho?n ?em ga?n v? biê?n iRange (?a? khai ba?o) 830 ActiveSheet.PivotTableWizard SourceType:=xlDatabase, SourceData:=iRange, _ TableName:="PivotTable6" With ActiveSheet.PivotTables("PivotTable6")832 .AddFields RowFields:=sRField, ColumnFields:=sCField, PageFields:=sDField833 .AddDataField ActiveSheet.PivotTables("PivotTable6").PivotFields(sDField), "Sum of " _ & sDField, xlSum End With Application.ScreenUpdating = TrueEnd SubChu? y?: C?u lê?nh cu??i cu?ng trong Mc trên ????c di?ch la?: Kê?t qua? cu?a ha?m VLOOKUP() v??i ca?c tham s?? tu?ng ??ng trong ??ng du?ng cu?a Excel ?em ga?n la?m d?? liê?u cu?a vu?ng co? ?i?a chi? ??ng v??i SRng So v??i lê?nh ta?o PT ma? ta ghi th?ng qua b?? thu Mc thi? ?? ??y (do?ng lê?nh 830) kh??i ta?o PT b??ng m??t ca?ch t??ng ???i kha?c. Di?ch do?ng lê?nh ?o? la?: PivotTable6 se? la? tên, vu?ng d?? liê?u ch??a trong biê?n irange la?m ngu??n, kh??i ta?o 1 PivotTale thu??c loa?i c? s?? d?? liê?u. R??i sau ?o? m??i ?i?nh ra ca?c thu??c ti?nh cu?a PT ?o? nh?: (832) L??y d?? liê?u trong biê?n sDField la?m PageField, l??y d?? liê?u trong biê?n sCField la?m ca?c c??t; l??y d?? liê?u trong biê?n sRField la?m ca?c ha?ng;(833): Ti?nh t??ng la? t??ng ch??a trong biê?n sDField, t??ng h??p d?? liê?u ch??a trong biê?n sDField va? ??a v? la?m tr???ng d?? liê?u trong PT.Bài 9 C??a s?? Microsoft Visual Basic.1. C??a s?? VB (Microsoft Visual Basic) cu?a sheetsCho ?ê?n tr???c ba?i na?y, khi mu??n xem xe?t n??i dung m??t Mc (macro) na?o ?o? ta th???ng v? menu Tool->Macro ->Macros. . . ( hay cu?ng lu?c 2 phi?m no?ng ALT+{F8} ?ê? v? CS (c??a s??) Mc.Nh?ng co? lu?c cu?ng ?a? ?ê? c??p ?ê?n ca?ch nhanh ?ê? v? VB riêng re? cu?a m?t sheet cu? thê? na?o ?o? b??ng ca?ch pha?i chu??t v? tên sheet ?o? trên thanh liê?t kê tên sheets. ?ê? mu?c na?y chu?ng ta se? nghiên c??u s?u h?n vê? ca?c tha?nh ph??n s??n co? trong CS VB cu?a m??t sheet na?y.Ha?y m?? la?i ba?ng ti?nh cu?a ba?n vê? ba?i ??? thi? (ba?i 7); trong ?o? co? ca?c Mc da?ng sau:Code:Private Sub OptionButtonN_Click()DoThi1 [ThongSo]End Sub(Ma? ?? ??y N=1-3); V??n ?ê? quan t?m cu?a chu?ng ta lu?c na?y kh?ng pha? la? ca?c Mc na?y, ma? la? CS VB hiê?n ha?nh; Ba?n kiê?m la?i xem co? pha?i no? nh? d???i ??y kh?ng?Thanh tiêu ?ê? CS co? ghi Microsoft Visual Basic – [WordBookName] – [SheetN (Code)]; D???i ?o? la? thanh menu & thanh c?ng cu?; D???i thanh c?ng cu? co? hai CS; CS bên tra?i go?i la? Object; Ca?i kia: Procedure. Ta chu? t?m v? ca?c CS na?y./(/ê?u b??m v? mu?i tên h???ng xu??ng trong CS tra?i ta th??y liê?t kê ngoa?i tên 3 Mc trên co?n co? hai do?ng: (General) & WorkSheet a./ Nê?u cho?n do?ng trên cu?ng thi? CS bên pha?i xu??t hiê?n do?ng (Declarations)Ta?i vu?ng na?y chu?ng ta co? thê? khai ba?o ca?c h??ng s?? cu?ng nh? ca?c biê?n du?ng chung trong ca?c Mc bên d???i. Ta?i ??y ta co? thê? khai ba?o ca?c tu?y cho?n nh?: Option ExplicitTu?y cho?n na?y b??t bu??c ca?c biê?n pha?i ????c khai ba?o tr??c khi dùng; ?iê?u na?y r??t nên la?m, nh??t la? nh??ng ng???i m??i vo? ve? vê? VBA.?ê? a?p ???t mo?i biê?n pha?i lu?n ????c khai ba?o trong excel, ta?i CS VB ta v? menu Tool -> Option. Trong ng?n Editor cu?a h??p thoa?i Option ta ?a?nh d??u cho?n v? ha?ng th?? hai: Require Variable Declaration & ??n OK ?ê? thiê?t ???t chu?ng kê? t?? th??i ?iê?m na?y. Khi thi?t ??t nh? v?y, toàn b? CS VBA c?a các modules, c?ng nh? các sheets & workbook s? có dòng Option Explicitb./ Nê?u cho?n do?ng cu??i cu?ng thi? bên pha?i se? co? 9 ?ê? mu?c hiê?n lên. Ta se? th?? biê?t ca?c loa?i hi?nh nghê? thu??t m??i me? na?y:Nê?u ta ?n chu??t lên do?ng ???u; l??p t??c ta?i CS VB se? co? 2 do?ng cole xu??t hiê?nCode:Private Sub Worksheet_Activate()End Sub?ê? tiê?t kiê?m th??i gian ta se? nh??p v? hê?t 6 Mc na?y c?u lê?nh co? cu?ng da?ng nh? sauMsgbox “[T??ng ??ng]” v? gi??a 2 do?ng lê?nh trênNh? tr???ng h??p (1) trên se? la? MsgBox “Activate”; Tr???ng h??p (3) – “Right Click”; A?p du?ng nh? v??y cho ca?c do?ng tiê?p theo (tr?? do?ng 7 & 8)Nh? v??y do?ng (9) se? la? MsgBox “SelectionChange. L?u & thoa?t vê? trang ti?nh b??ng menu cu?a VB hay b??ng phi?m ALT+Q. Ta th?? b??m v? m??t ? tr??ng b??t ky?, se? th??y h??p thoa?i t??ng ??ng xu??t hiê?nTiê?p theo ta nh??p v?? ?o? 1 gia? tri? 9 & b??m ENTER se? co? 2 h??p thoa?i hiê?n lên ma? ca?i tr???c ghi la? ‘Change’;Tiê?p n??a, trong h??p d???i s?? 9 ta nh??p v? c?ng th??c = [9] + 13 & ENTER ?ê? kiê?m ch??ng th?? t?? cu?a 3 h??p thoa?i; Sau ?o? ta pha?i chu??t v? ? ch??a c?ng th??c v??a l??p xem sao?!Co? nghi?a la? ?ê?n gi?? ba?n g??p kh?ng i?t phiê?n toa?i khi pha?i di chuyê?n trong trang ti?nh, ?i ??u cu?ng bi? ho?i ‘gi??y t??’! ?ê? b??t ?i n??i phiê?n mu??n ta v? hiê?u ho?a Mc co? ch??a h??p thoa?i SelectionChange ?i.Ba?n ti?m ca?c ca?ch ?ê? hiê?n hê?t 6 h??p thoa?i & t?? ru?t ra kê?t lu??n cho mi?nh;Sau khi ba?n ?a? nhuyê?n v??i 6 h??p thoa?i ta v? hiê?u ho?a chu?ng ?i vi? chi? g?y phiê?n phu?c. Xin gi??i thiê?u ca?c ba?n m??t ??ng du?ng ky? diê?u cu?a v??n ?ê? na?y trong c?ng viê?c nh??p liê?u cu?a chu?ng ta. T?i co? ba?ng ti?nh l?u gi?? CSDL (c? s?? d?? liê?u) g??m ca?c tr???ng [TT], [Ngay], [MaHg], [SoLg], [Dgia], [Ttien]. . . .T?i mu??n chi? c??n nh??p ma? ha?ng thi? VB se? t?? nh??p cho t?i d?? liê?u tr???ng [Ngay] (ghi nga?y tha?ng n?m nh??p/xu??t ha?ng). Mc co? n??i dung nh? sau:Code:Private Sub Worksheet_Change(ByVal Target As Range)'Ha?m S?? Du?ng T??t Trong Tr???ng H??p Nh??p/Xu??t Ha?ng Ho?a Theo Nga?y/Tha?ng901 If Not Intersect(Target, Range("C:C")) Is Nothing Then902 If Not IsEmpty(Target) Then903 Target.Offset(0, -1).Value = Date -1 Else905 Target.Offset(0, 1).Value = Empty End If: End If End Sub?? ??y Target ta hiê?u la? m??t biê?n, nh?ng kh?ng pha?i cu?a ta, vi? ta ch?a khai ba?o bao gi??. Ma? pha?i hiê?u la? cu?a VB; & nh??ng gi? cu?a VB thi? nên tra?ch xa, nê?u kh?ng s?? bi? ?o?n! Biê?n na?y se? ?a?i diê?n cho ? ma? ta ?ang mu??n thay ???i gia? tri? no? ch??a;C?u lê?nh 901 trong Mc ta?c gia? ?a? du?ng ph??ng th??c Intersect ( Range1, Range2[,. . . ]). ?ê?n th??i ?iê?m na?y ta chi? c??n hiê?u no? nh? sau: Ph??ng th??c kiê?m tra xem vu?ng ? Range1 co? giao ( g??p, c??t, thu??c ,bao ha?m . . .) v??i vu?ng ? Range2 hay kh?ng?C?u lê?nh 901 ????c di?ch la?: nê?u kh?ng la? kh?ng giao gi??a c??t C v??i ? ?ang bi? thay ???i thi? (th??c hiê?n lê?nh 901 – 905) (Mê?nh ?ê? phu? ?i?nh cu?a phu? ?i?nh ch?? kh?ng hê? ?a?nh ma?y nh??m ??u!)902: Nê?u ? bi? thay ???i na?y kh?ng r??ng (v??a nh??p ma? ha?ng m??i) thi? (th??c hiê?n lê?nh 903)903: D?? liê?u nga?y tha?ng h?m qua ga?n v? ? bên tra?i liê?n kê? v??i ? ?ang bi? thay ???iNh? v??y khi ? ?ang thay ???i co? nh??p gia? tri? & no? thu??c c??t ‘C’ thi? ga?n v? ? c??t B liê?n kê? gia? tri? nga?y tha?ng. Nh? v??y VB ?a? thay ta nh??p gia? tri? nga?y tha?ng ta c??n;Chu? y?: ?iê?u gi? se? diê?n ra khi ta thêm v? cu??i do?ng 903 lê?nh sau: (Co? d??u ‘:’): Trích:Target.Offset(0, -2).Value = 1 + Target.Offset(-1, -2).Value 2. C??a s?? Project – VBA Project/(hi ?ang trong CS VB, ta v? menu View & cho?n tiê?p Project Explorer (CTRL+R) ta se? th??y xu??t hiê?n bên tra?i m??t CS Project – VBAProject, ma? trong no? hiê?n s? ??? nha?nh c?y liê?t kê ca?c ???i t???ng cu?a workbook g??m 2 do?ng chi?nh:Code:Microsoft Excel ObjectsModulesTrong ha?ng ???u liê?t kê t??t ca? nh??ng worksheets, nh?ng tên chu? yê?u la? cu?a Excel ga?n cho (Co?n tên ta ga?n la? th?? yê?u nên ?ê? trong d??u ngo??t). Nh? ta nh??p ?u?p v? tên na?o ?o?, thi? bên CS chi?nh se? hiê?n lên ca?c Sub cu?a sheet ?o?.Nê?u chu?ng ta b??m ?u?p v? do?ng Modules thi? se? hiê?n liê?t kê nh??ng modules ?? [b]co? trong workbook (VD module1, Module2. . . . .)Ta b??m v? ha?ng ThisWorkbook ( phi?a trên do?ng Modules) Va? ?o?ng CS Project b??ng nu?t Close go?c pha?i phi?a trên cu?a no?. CS na?y c??u tru?c gi??ng nh? ta ?a? t??ng g??p (cu?a sheets). Nh?ng khi ta cho?n Workbook bên CS Object, thi? bên Procedure xu??t hiê?n r??t nhiê?u ph??ng th??c l??a cho?n. Ta nh??p do?ng lê?nh sau v? ph??ng th??c Open: Code:Private Sub Workbook_Open() MsgBox "Open WB"End SubSau ?o? ta thoa?t vê? Excel & la?i m?? la?i WorkBook na?y ?ê? xem la?m viê?c cu?a Mc.Chu? y?: M??t ca?ch nhanh nh??t ?ê? ?ê?n CS ch??a module cu?a WorkBook la?: Bên tra?i h?n cu?a menu File (CS Microsoft Excel) co? biê?u t???ng excel; Nê?u ta pha?i chu??t v? no?, do?ng cu??i cu?a menu ??? xu??ng se? la? View Code; Ta b??m cho?n do?ng na?y ta se? ?? ngay CS VB cu?a workbook;Ta thay do?ng lê?nh Msgbox “Open WB” nêu trên b??ng do?ng lê?nh sau:Code:Application.OnTime Now + TimeValue("00:00:09"), "MyMacro"Diê?n di?ch c?u lê?nh na?y nh? sau: Cha?y Macro co? tên MyMacro sau 9 gi?y n??a.Tuy nhiên ?ê?n th??i ?iê?m na?y ta ch?a viê?t Mc MyMacro. H?n n??a Mc na?y nên co? ta?i CS VB chu??n. T?? CS module cu?a WorkBook ta vê? CS module chu??n theo 1 trong 2 ca?ch:- ?o?ng CS module na?y la?i & ta?i Ms Excel Ta nh??n Atl +{F8}- Cho hiê?n CS Project – VBAProject nê?u no? ch?a hiê?n (menu View->Project Explorer) -> Modules -> module1Ta?i CS na?y ta nh??p m??t Mc ??n gia?n nh? sau:Code:Sub MyMacro() Dim StrC as String StrC = CHR(10) & CHR(13) & “XIN CHAO MUNG!” MsgBox "My Macro!" & StrC, , ”9’ Da Qua!”End SubDo?ng lê?nh co? ch??a CHR(13) ch??ng qua la? lê?nh n??i chu??i ky? t??. Ba?n th?? Mc la?m viê?c cu?ng b??ng ca?ch ?o?ng WorkBook la?i & m?? ra m??t ca?ch bi?nh th???ng nh? trên.Ta?i sao no?i m?? ra m??t ca?ch bi?nh th???ng?, vi? nê?u ta?i CS excel Ta ??n gi?? phi?m SHIFT & m?? file ch??a Mc na?y thi? Mc Workbook_Open kh?ng ????c excel ?ê?m xi?a ?ê?n!Ta nghiên c??u tiê?p m??t Mc cu?a WorkBook nu?a, tr???c khi sang ph??n kha?c. Tr???c tiên ta pha?i chu??t v? biê?u t???ng tra?i h?n cu?a menu File & cho?n do?ng View Code;Nê?u trong CS Object bên tra?i co? do?ng Workbook; thi? ta ti?m do?ng NewSheet & ??n cho?n no?. Cu?ng nh? tr???c ??y. M??t Mc s??n co? xu??t hiê?n, ch?? ta nh??p lê?nh v?:Code:Private Sub Workbook_NewSheet(ByVal Sh As Object)End Sub?? ??y Sh la? m??t biê?n ???i t???ng do VB khai ba?o và truy?n cho Mc này. T??t nhiên nê?u chu?ng ta c??n dùng, chu?ng ta co? thê? khai ba?o & s?? du?ng loa?i biê?n na?y nh? th???ng, nh?ng th??t c?n nh??c vi? hao tiê?n t??n cu?a l??m!M??t biê?n ???i t???ng co? thê? ch??a hi?nh a?nh, ch??a ma?ng gia? tri?, th?m chi? ch??a ca? workbook cu?a excel lu?n!. . . Nh?ng lu?c c??n ta se? xem xe?t sau; Co?n gi?? ??y chu?ng ta nh??p ca?c do?ng na?y v? gi??a hai do?ng lê?nh trênCode:Application.displayAlerts = FalseMsgbox “Sorry, you can’t add any more sheet to this workbook!”Sh.deleteapPlication.displayalerts= -1Do?ng lê?nh 1 phu?c vu? cho do?ng lê?nh 3: kh?ng cho hiê?n ca?nh ba?o khi xo?a Sh;Do?ng lê?nh cu??i: phu?c h??i la?i chê? ??? ca?nh ba?o; Do?ng co?n la?i ba?n t?? di?ch l??y!M?t v?n ?? n?a theo t?i là m?i xu?t hi?n, ?ó là ByVal. ??y, c?ng nh? ByRef là nh?ng t? khóa ch? ra bi?n ???c truy?n là lo?i bi?n gì & ??i x? v?i nó ra sao!M?c ??nh (n?u ta kh?ng có t? khóa nh? bài tr??c ??y ?? g?p) là truy?n tham bi?n. Khi ?ó ch??ng trình con nh?n lo?i bi?n này có th? ??i hay gán cho nó giá tr? khác. Ng??c l?i khai báo ByVal tr??c bi?n có ngh?a là ch??ng trình cha g?i nó (ch??ng trình con) truy?n bi?n lo?i tham tr?. Tuy ch??ng trình con có th? dùng & bi?n ??i nó; nh?ng khi k?t thúc ph?n ch??ng trình con thì bi?n này ? ch??ng trình chính v?n mang giá tr? tr??c lúc truy?n.3. T? macro ??n functionN?u t? CS excel ta ?n ATL+{F11} ta s? ??n CS VBE (Visual Basic Editor). N?u ??y là m?t workbook m?i, thì có th? ch? xu?t hi?n CS Project – VBAProject phía bên trái màn hình; còn bên ph?i, ph?n ch? y?u c?a CS VBE có th? ch?a có gì (ngoài m?t màu sám). ?? có th? nh?p tr?c ti?p m?t Mc , tr??c tiên ta v? menu Insert -> Module. CS so?n th?o c?a VBE th?c s? hi?n ra, nó c?ng t??ng t? nh? SC mà ta ?? th?y nh? ??u bài ?? nêu.Ta nh?p Mc sau:Code:Sub FuncTion_() Sheets("C0").Select Range("E4").Value = Range("A4").Value + 9 End SubSau ?ó ta l?u & ?n t? h?p ALT+Q ?? ?óng CS này l?i; Tr? v? excel, ta l?i v? menu Tool -> Macro->Macro ?? gán phím nóng cho Mc này b?ng t? h?p CTRL+SHIFT+F. Xong ta tr? v? trang tính, t?i A4 ta nh?p c?ng th?c: =INT(8 * RAND()) & ENTER ?? ? A4 hi?n m?t giá tr?. Sau ?ó ta nh?n vài l?n t? h?p kích ho?t Mc. Sau m?i l?n nh?n t? h?p phím ta xem thay ??i k?t qu? t?i các ? mà Mc ?? c?p ??n.Ti?p theo ta s? x?y d?ng hai Mc ?? giao & nh?n giá tr? giao , nh? sau:Code:Option ExplicitSub GiaoBien() ‘ Dim SoSo = InputBox("HAY NHAP MOT SO:")If IsNumeric(So) Then FuncTion_ (So)End SubSub FuncTion_(lSo As Long) Sheets("C0").Select: Range("E4").Value = Range("A6").Value + lSo End Sub( Ch? c?n s?a Mc Function_ l?i ?? nó có th? nh?n 1 bi?n s? lo?i Long.)Sau khi ta nh?p m?t giá tr? b?t k? v? ? A6 , ta ?? nháy v? trong vùng Mc GiaoBien & ?n {F5} ?? ch?y 2 Mc & xem k?t qu? t?i ? E4 trên sheets(“C0”)Chúng ta làm t?t c? t? n?y ??n gi? ?? làm gì?. ?? th?y r?ng chúng ta c?n ph?i vi?t m?t hàm t? t?o là c?n thi?t. Vì Mc có th? nh?n bi?n ta giao, nh?ng nó ch? cho ra k?t qu? t?i ? c? ??nh (?ó là E4). N?u ta vi?t hàm ng??i dùng thì s? hi?n th? k?t qu? n?i nào ta mu?n; Th?t v?y, Các b?n h?y nh?p v? hàm sau:Code:Function Function0( Bien0, Optional Bien7) If Bien7 = 0 then Bien7 = 9 Function0 = Bien0 + Bien7End FunctionSau ?ó tr? v? trang tính; T?i m?t ? ch?a có d? li?u nào ?ó ta nh?p d?u ‘=’ & v? menu Insert -> Function. Trong CS Or select a category ta ch?n hàng User Defined. Trong CS Select a function ta s? th?y & ch?n tên Function0. ??n ??y b?n thao tác nh? nh?ng hàm c?a Excel khác; Sau khi ch?n 2 ? d? li?u làm ??i s? c?a hàm ta nh?n ENTER s? ra k?t qu? t?i ? ?ang kích ho?t.T? khóa Optional cho phép ta ch?n ? th? hai là ? kh?ng ch?a d? li?u, nh?ng hàm Function0 bi?t cách t? xoay s?. B?n h?y ki?m nghi?m ph?n này!Bài 10 : cách dùng VBA t??ng t? nh? trong các tr??ng h?p ta v??menu Edit -> Goto -> SpecialPh??n gi??i thiê?u ngu??n ta?i nguyên trên ma?ng:The SpecialCells Method in Excel VBAOne of the most beneficial Methods in Excel (in my experience) is the SpecialCells Method. When used, it returns a Range Object that represents only those type of cells we specify. For example, one can use the SpecialCells Method to return a Range Object that only contains formulae. In fact, we can, if we wish, even narrow it down further to have our Range Object (containing only formulae) to return only formulae with errors.The syntax for the SpecialCells Method is;expression.SpecialCells(Type, Value)Where "expression" must be a Range Object. For example Range("A1:C100"), ActiveSheet.UsedRange etc.Type=XlCellType and can be one of these XlCellType constants.xlCellTypeAllFormatConditions. Cells of any formatxlCellTypeAllValidation. Cells having validation criteriaxlCellTypeBlanks. Empty cellsxlCellTypeComments. Cells containing notesxlCellTypeConstants. Cells containing constantsxlCellTypeFormulas. Cells containing formulasxlCellTypeLastCell. The last cell in the used range. Note this XlCellType will include empty cells that have had any of cells default format changed.xlCellTypeSameFormatConditions. Cells having the same formatxlCellTypeSameValidation. Cells having the same validation criteriaxlCellTypeVisible. All visible cellsThese arguments cannot be added together to return more than one XlCellType.Value=XlSpecialCellsValue and can be one of these XlSpecialCellsValue constants.xlErrorsxlLogicalxlNumbers xlTextValuesThese arguments can be added together to return more than one XlSpecialCellsValue.The SpecialCells Method can be used in a wide variety of situations when you only need to work with cells housing specific types of data. For example, the code below would return a Range Object representing all formulae on the active Worksheet.ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas)If we wanted, we could narrow this down further to only return a Range Object representative of all formulae that are returning numbers.ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas,xlNumbers)Once we have the specific Range Object type returned we can then work with only those cells. This can often be done in one line of code, or you may need to loop through the range. See examples below;Sub ColorAllFormulae() ActiveSheet.UsedRange.SpecialCells _ (xlCellTypeFormulas).Interior.ColorIndex = 36End SubSub NegativeAllNumberFormula()Dim rRange As Range, rCell As Range Set rRange = ActiveSheet.UsedRange.SpecialCells _ (xlCellTypeFormulas, xlNumbers) For Each rCell In rRange rCell = rCell.Value * -1 Next rCellEnd Sub Although I have used a loop on the second macro, so that all returned numbers are converted to their negative counterparts, we could make use of PasteSpecial to do so without looping and allow the formulae to remain in the cells. That is; Sub NegativeAllNumberFormula2() With Range("IV65536") .Value = -1 .Copy ActiveSheet.UsedRange.SpecialCells _ (xlCellTypeFormulas, xlNumbers).PasteSpecial _ xlPasteValues, xlPasteSpecialOperationMultiply .Clear End With End Sub SpecialCells Gotcha!If you are familiar with Excel and it's built in features, such as SpecialCells, you will know that when/if one specifies only a single cell (via Selection or Range) Excel will assume you wish to work with the entire Worksheet of cells. For example, the 2 macros below would both select ALL blank cells on a Worksheet.Sub SelectAllBlanks() ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).SelectEnd SubSub SelectAllBlanks2() Range("A1").SpecialCells(xlCellTypeBlanks).Select End Sub So, as you can see, specifying only a single cell Range can give unwanted results.SpecialCells for Formulae & ConstantsWhile we cannot specify more than one XlCellType (e.g. xlCellTypeConstants+xlCellTypeFormulas would fail) we can use the SpecialCells method to return only used cells housing numbers on a Worksheet (formulae & constants) and omit any cells containing text (formulae & constants). Sub AllNummericCells()Dim rCcells As Range, rFcells As RangeDim rAcells As Range 'Set variable to all used cells Set rAcells = ActiveSheet.UsedRange On Error Resume Next 'In case of no numeric formula or constants. 'Set variable to all numeric constants Set rCcells = rAcells.SpecialCells(xlCellTypeConstants, xlNumbers) 'Set variable to all numeric formulas Set rFcells = rAcells.SpecialCells(xlCellTypeFormulas, xlNumbers) 'Determine which type of numeric data (formulas, constants or none) If rCcells Is Nothing And rFcells Is Nothing Then MsgBox "You Worksheet contains no numbers" End ElseIf rCcells Is Nothing Then Set rAcells = rFcells 'formulas ElseIf rFcells Is Nothing Then Set rAcells = rCcells 'constants Else Set rAcells = Application.Union(rFcells, rCcells) 'Both End If On Error GoTo 0 rAcells.SelectEnd Sub You should take note of the On Error Resume Next statement in the above code. This is needed as when the SpecialCells Method condition cannot be met an error occurs. As you may, or may not know, a non valid Range Object returns the Nothing keyword. After Setting a Range variable to the SpecialCells Method we need to then check that we have been able to pass a Range Object to our Range variable. It is the If Statement (and 2 ElseIf) that checks this in the code above. giu?p ??? trong c??a s?? VBA:Ba?n v? CS (c??a s??) VBA b??ng t?? h??p fi?m ALT+{F11} & nh??p ca?c ki? t?? sau: [color =”Blue”] ‘ SpecialCells. Sau ?o? b?i toa?n b?? tên ph??ng th??c & nh??n {F1} ?ê? ????c excel gia?i thi?ch; Tuy nhiên gia?i thi?ch na?y co? thê? la?m chu?ng ta ca?m th??y kh?ng ?u? so v??i nh??ng gi? ?a? ghi trên diê?n ?a?n ?a? nêu nh? trên; Nh??ng a?p du?ng cu? thê? A. Ta xem la?i l??n l???t ca?c vi? du? nêu trên:1.- T? ma?u nê?n cho ca?c ? tr??ng trong vu?ng s?? du?ngGia? du? trên trang ti?nh tr??ng ta nh??p ‘Nam’ v? ? B2; ‘Thanh’ v? C3 & ‘Chanh’ v? ? D4 & cho cha?y macro ColorAllFormulae ?ê? biê?t xem nh??ng ? na?o ????c t? ma?u nê?n?!2.- ???i d??u d?? liê?u cu?a ca?c ? c?ng th??c B??ng ca?ch s?? du?ng m??t trong hai macro ?a? nêu NegativeAllNumberFormula & NegativeAllNumberFormula23.- Ca?c tr???ng h??p ?ê?m ca?c ? kh?ng ch??a d?? liê?u?ê? hiê?u ro? h?n vê? c?u lê?nh UsedRange.SpecialCells(x) ta xe?t ?ê?n vi? du? sau: Ta co? trang ti?nh tr??ng; Ta?i D4 ta nh??p tên ‘Lê’; ? D5 nh??p ‘Hoa’ & ? D6 ta nh??p =D4 & “ “ & D5. Sau ?o? cho cha?y macro sau: Sub CountAllBlanks() ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).Select: MsgBox Selection.Count Range("A1").SpecialCells(xlCellTypeBlanks).Select: MsgBox Selection.CountEnd Sub 4.- Cho?n vu?ng d?? liê?u ch??a c?ng th??c hay tri? kiê?u s?? B??ng macro AllNummericCells B. Ta xem ca?c ph??ng a?n ??ng du?ng kha?c nhau trong 1 macro sau ??y:Sub FillBlanks() Dim Rng As Range: Dim iZ As Integer iZ = InputBox("CHON PHUONG AN:", , "9") Select Case iZ Case 1 ’a: Nh??p tri? ‘0’ cho toa?n thê? ca?c ? tr??ng trong vu?ng cho?n Range("C1:D9").SpecialCells(xlCellTypeBlanks).Value = 0 Case 2 ’b: Xo?a gia? tri? ca?c ? trên c??t ‘A’ t??ng ??ng v??i ca?c ? trên c??t B la? tr??ng Columns("B:B").SpecialCells(xlCellTypeBlanks).Offset(0, -1).ClearContents Case 3 ‘c: ??n/Xo?a ca?c do?ng trong vu?ng t?? 10 ?ê?n 40 khi ? trên c??t A t??ng ??ng la? tr??ng Set Rng = Range("A10:A40").SpecialCells(xlBlanks).EntireRow Rng.Hidden = True ' Range("A10:A40").SpecialCells(xlBlanks).EntireRow.Delete Case 4 ‘d: Hiê?n s?? do?ng & ?i?a chi? cu?a chu?ng, khi chu?ng kh?ng ??n Set Rng = ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Rows MsgBox ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Rows.Count, , Rng.AddressCase 5 ‘?: Xo?a gia? tri? ca?c ? ch??a s?? liê?u, nh?ng kh?ng la? c?ng th??c ActiveSheet.Cells.SpecialCells(xlCellTypeConstants, 23).ClearContents Case 6 ‘e: Xo?a gia? tri? ca?c ? ch??a s?? liê?u trong vu?ng ???t tên ‘ConstantRef’ On Error Resume Next Range("ConstantRef").SpecialCells(xlCellTypeConstants).ClearContents On Error GoTo 0case else End SelectEnd Sub C. T?? nghiên c??u macro sau ??y:Sub CountBlanks() Dim lCount As Long On Error Resume Next lCount = Range("C9:H9,L9:Q9").SpecialCells(xlCellTypeBlanks).Cells.Count On Error GoTo 0 Select Case lCount Case 0 To 1 Exit Sub Case 2 'Do stuff Case 6 'Do stuff Case Else 'Do stuff End SelectEnd SubD. Ca?c macro co? thê? g??p trong th??c tê? sau ??y:1./ ??n hay xo?a do?ng d?? liê?u theo ca?c ?iê?u kiê?n M??t khi ta mu??n xo?a (hay la?m ??n ?i) m??t s?? do?ng d?? liê?u theo nhiê?u ?iê?u kiê?n kha?c nhau ta co? thê? nh?? ?ê?n Mcr (macro) DeleteRowsWithSpecifiedData sau ??y. Sub DeleteRowsWithSpecifiedData()29 Dim Rng As Range1 Sheets("S3").Select: Columns(1).EntireColumn.Insert 2 With Range("A1:A" & ActiveSheet.UsedRange.Rows.Count) 3 .FormulaR1C1 = _ "=IF(AND( OR(ISTEXT(RC[1]), ISBLANK(RC[1]), LEFT(RC[4],4)=""PAGE"") , LEFT(RC[5],5)<>""TOTAL""),NA(),FALSE)"4 .Value = .Value21 If Rng Is Nothing Then22 Set Rng = .SpecialCells(xlCellTypeConstants, xlErrors).EntireRow23 Else24 Rng = Union(Rng, .SpecialCells(xlCellTypeConstants, xlErrors).EntireRow)25 End If9 On Error Resume Next'11 .SpecialCells(xlCellTypeConstants, xlErrors).EntireRow.Delete 5 End With6 On Error GoTo 028 Rng.Hidden = True7 Columns(1).EntireColumn.DeleteEnd SubThu? tu?c na?y g??p chung cu?a hai ph??ng a?n, ?o? la? la?m ??n hay xo?a do?ng d?? liê?u. Hiê?n ta?i thu? tu?c a?p du?ng trong ph??ng th??c ??n ca?c do?ng d?? liê?u tho?a ca?c ?iê?u kiê?n. Khi mu??n Mcr th??c thi ph??ng a?n xo?a do?ng d?? liê?u ta pha?i:a./ V? hiê?u ho?a ca?c do?ng lê?nh co? s?? l??n h?n 20 (b??ng ca?ch thêm d??u nha?y ??n v? tr???c do?ng lê?nh)b./ Hiê?u l??c ho?a do?ng lê?nh s?? 11 (bo? ?i d??u nha?y ??n ???u do?ng lê?nh)Ta xe?t cu? thê? tr???ng h??p Mcr la?m ??n ca?c do?ng d?? liê?u theo ?iê?u kiê?n nêu ta?i do?ng lê?nh 3, nh? sau: Tr???c tiên, Mcr thêm 1 c??t v? trang ti?nh, tr?? tha?nh c??t A m??i; Tiê?p theo la? do?ng lê?nh yêu c??u kha?o sa?t vu?ng A1:A(i), ?? ??y i la? do?ng cu??i cu?ng cu?a trang ti?nh co? ch??a d?? liê?u;(Do?ng lê?nh th?? 3 kho?i diê?n di?ch! H?n n??a trong th??c tê? no? se? bi? thay ???i theo yêu c??u cu? thê? cu?a ta) Ca?c do?ng lê?nh t?? 21..25 no?i r??ng: Nê?u biê?n Rng ch?a ????c ga?n tri? thi? ga?n b??ng do?ng co? ? A(j) hiê?n ha?nh ?ang ch??a gia? tri? l??i (NA()) Ng???c la?i, nê?u Rng ?a? ????c ga?n thi? thêm v? no? m??t do?ng n??a (b??ng ph??ng th??c UNION). Do?ng lê?nh 28 la?m ??n vu?ng ?i?a chi? ch??a trong biê?n Rng;Cu??i cu?ng la? xo?a c??t phu? ma? Mcr ?a? ta?o, ?ê? tra? vê? tra?ng tha?i ?i?a chi? ? cu?a trang ti?nh ban ???u.2./ Kh?? l??n l???t ca?c ? tr??ng trong 4 c??t ???u tiên cu?a d?? liê?u Sub DeleteBlanks() Dim intCol As Integer For intCol = 1 To 4 [Color=”Blue” '* * * Cols A to D Range(Cells(2, intCol), Cells(333, intCol)).SpecialCells(xlCellTypeBlanks).Delete Shift:=xlUp Next intColEnd Sub B??t ???u t?? c??t A, Mcr se? che?p d?? liê?u phi?a d???i lên ? tr??ng m??t ca?ch liên tu?c.Vi? du? c??t A t?? A2 ?ê?n A336 co? hai ? tr??ng thi? sau khi Mcr cha?y g??n n??a ?oa?n ????ng, thi? ta?i c??t A d?? liê?u se? co? t?? A2 ?ê?n A3343./ Xo?a ca?c do?ng tho?a m??t trong hai ?iê?u kiê?n ta?i hai c??tGia? du? ta co? 1 c? s?? d?? liê?u vê? ho?c sinh. Cu??i n?m c??n l??p DS (danh sa?ch) nh??ng em ????c lên l??p; DS chi? la? nh??ng ho?c sinh ta?i tha?nh ph?? (tr???ng [TINH] ta?i c??t ‘N’ hiê?n co? ca?c ma? HCM, DN, LA, BD & BT); Ho?c sinh ?? la?i l??p ?a? ????c ghi chu? v? c??t ‘O’. g??m co? ‘HK Kem’, ‘O Lai’, ‘Nghi Hoc’ & ‘Bo Hoc’. Mcr d???i ??y se? th??c thi nhiê?m vu? m??t ca?ch hoa?n ha?o:Sub XoaDongTheoDuLieu() Dim RngTest As Range, RngSelect As Range, rng As Range 'Fill any blank in column "O" with formula Set RngTest = Intersect(ActiveSheet.UsedRange, Columns("N:O")) RngTest.Columns(2).SpecialCells(xlCellTypeBlanks).FormulaR1C1 = "=rc[-1]" 'Selects all cells in columns "N" and "O" that match For Each rng In RngTest If rng = "LA" Or rng = "DN" Or rng = "BT" Or rng = "BD" Or rng = "HK Kem" _ Or rng = "O Lai" Or rng = "Nghi Hoc" Or rng = "Bo Hoc" Then If RngSelect Is Nothing Then Set RngSelect = rng Set RngSelect = Union(RngSelect, rng) End If Next rng 'Deletes rows that matchRngSelect.EntireRow.DeleteEnd Sub Trong thu? tu?c co? du?ng hai ph??ng th??c Intersect & Union. Hai ph??ng th??c na?y mi?nh ?a? co? gi??i thiê?u m??t ba?i trên diê?n ?a?n. (Ti?m kiê?m b??ng t?? kho?a Intersect)4./ Biê?n ca?c ? c?ng th??c trong vu?ng cho?n tha?nh d?? liê?u Sub ValuesOnly() Dim rRange As Range, RngSC As Range: Dim lCalc As Long On Error Resume Next3 Set rRange = Application.InputBox(Prompt:="Select the formulas", Title:="VALUES ONLY", Type:=8)4 Set RngSC = rRange.SpecialCells(xlCellTypeFormulas) If RngSC Is Nothing Then Exit Sub6 Set rRange = Application.Intersect(rRange, RngSC) If rRange Is Nothing Then Exit Sub On Error GoTo 09 With Application .ScreenUpdating = False: lCalc = .Calculation .Calculation = xlCalculationManual12 End With Set RngSC = Nothing14 For Each RngSC In rRange RngSC = RngSC.Value ' rRange = rRange.Value16 Next RngSC17 With Application If Not lCalc = 0 Then .Calculation = lCalc .ScreenUpdating = True20 End With21 Set rRange = Nothing: Set RngSC = NothingEnd Sub C?u lê?nh 3 yêu c??u ta nh??p v? chu??i biê?u thi? vu?ng d?? liê?u c??n thiê?t biê?n t?? da?ng c?ng th??c sang da?ng d?? liê?u, vi? du?: ‘A1:B99’ hay ‘A$9:$B500’ ho??c ‘$A$2:$U$78’C?u lê?nh 4: Ca?c ? ch??a c?ng th??c trong vu?ng cho?n trên ????c ?em ga?n v? biê?n RngSC ?a? khai ba?o.C?u lê?nh 6: Ca?c ? na?o tho?a v??i ph??ng th??c Intersect gi??a ? c?ng th??c (c 4) & vu?ng cho?n ban ???u (c3) ????c ga?n la?i v? biê?n rRange;Ca?c c?u lê?nh 5, 7 du?ng ?ê? thoa?t kho?i ch??ng tri?nh khi kh?ng co? ? na?o tho?a ?iê?u kiê?n;C?u lê?nh 15 chi?nh la? c?u biê?n ca?c ? ch??a c?ng th??c tha?nh ca?c ? ch??a tri?;Cu??i cu?ng, c?u lê?nh 21 du?ng ?ê? ba?o la? chu?ng ta kh?ng xa?i ca?c biê?n thu??c loa?i Range n??a; Mu?c ?i?ch chu? yê?u la? thu h??i b?? nh??, tra?nh la?ng phi? ta?i nguyên.5./ Sao che?p vu?ng lo?c sang m??t Sheet m??iTrong Mcr sau chu?ng ta co? di?p xem xe?t ?ê?n ca?ch s?? du?ng ph??ng th??c SpecialCells ???i v??i trang ti?nh ?a? qua lo?c. Sau khi th??c hiê?n lo?c t?? ca?c do?ng d?? liê?u, chu?ng ta mu??n chuyê?n chu?ng sang m??t sheet kha?c ?ê? la?m ba?o ca?o, thi? Mcr CopyAFilter se? phu?c vu? ba?n m??t ca?ch miê?n phi?: Sub CopyAFilter() Dim Rng As Range With Sheet3 If Not .FilterMode Then MsgBox "AutoFilter?": Exit Sub End If Set Rng = .AutoFilter.Range.Offset(1, 0).Resize(.AutoFilter.Range.Rows. _ Count - 1).SpecialCells(xlCellTypeVisible) 'set a range = to visible cells (excluding the header) Rng.Copy Destination:=Sheet4.Range("A1") End WithEnd Sub6./ Ca?c ba?n t?? ti?m hiê?u 3 Mcr na?y:Sub DeleteStuff() Dim Rng As Range Set Rng = Range("Q2:Q" & Cells(65536, "Q").End(xlUp).Row) If ActiveSheet.AutoFilterMode Then Cells.AutoFilter Columns("Q").AutoFilter Field:=1, Criteria1:="=" On Error Resume Next 'in case nothing found to delete Rng.SpecialCells(xlCellTypeVisible).EntireRow.Delete On Error GoTo 0 ActiveSheet.AutoFilterMode = FalseEnd Sub Sub MAreas1() If ActiveSheet.FilterMode = True Then 'Select first row below heading ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Areas(2).Select ' * Will tell you the actual row number of the second visible row MsgBox ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Areas(2).Rows(1).Row End IfEnd SubSub MAreas2() If ActiveSheet.FilterMode = True Then 'Select cell in 3rd row first column ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Areas(3).Columns(1). _Cells(1, 1).Select ' * Will tell you the actual row number of the third visible row MsgBox ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Areas(3).Rows(1).Row End IfEnd SubBài 11. Ti?m hiê?u ca?c ph??n t?? t??p h??pNê?u ca?c ba?n ch?a co? kha?i niê?m vê? toa?n cao c??p thi? khi ?o?c nh??ng trang na?y c??n liên hê? m??t thiê?t v??i ca?c v??t thê? t??n ta?i quanh ta. T?? ?o? se? giu?p chu?ng ta cu?ng nhau hiê?u ca?c ph??n t?? trong excel dê? h?n.[B]1./ Ph??n t?? la? gi?? [/b][I]a./ Ph??n t?? thu??c vê? t??p h??p:[/I] Trong thê? gi??i quanh ta, thi? tha?nh ph??, c? quan, c?ng s??, tr???ng ho?c, ph?n x???ng, c?ng nh?n viên. . . ?ê?u la? ca?c ph??n t??. Ph??n t?? co? thê? ch??a ca?c loa?i ph??n t?? kha?c. Ty? nh? tha?nh ph?? co? nhiê?u tr???ng & trong tr???ng co? nhê?u l??p ho?c, trong l??p la?i co? nhiê?u ho?c sinh.M??i nh?n viên la? m??t ph??n t?? thu??c vê? m??t loa?i ph??n t?? kha?c: c?ng s?? (c? quan). ?ê? xa?c ?i?nh m??t nh?n viên, ba?n co? thê? chi? ra tên ( anh Tr??n An), chi? vi? tri? (???ng nghiê?p ng??i go?c pha?i cu??i pho?ng), chi? ti?nh ch??t (ba?n m??c a?o xanh & ???i no?n ma?u cam). Tuy nhiên t??p h??p t??t ca? ca?c nh?n viên cu?ng la? m??t ph??n t??.Ta m?? ch??ng tri?nh excel 2003, ?ê? xu??t hiê?n m??t ba?ng ti?nh tr??ng duy nh??t. No?i la? duy nh??t, vi? nê?u ba?n co?n ba?ng ti?nh na?o kha?c thi? nên ?o?ng no? la?i (du?ng lê?nh Unhide trong menu window ?ê? a?p du?ng cho ca? ba?ng ti?nh ??n)Trong excel cu?ng v??y, m??i ba?ng ti?nh la? m??t ph??n t??. Ba?n co? thê? chi? ra ba?ng ti?nh b??ng tên (m?? BaiTap.XLS), b??ng vi? tri? (ki?ch hoa?t ba?ng ti?nh th?? ba trong DS (danh sa?ch)), chi? tr??c tiê?p (khi l?u ba?ng ti?nh hiê?n ha?nh). . . .t??p h??p ca?c ba?ng ti?nh cu?ng la? m??t ph??n t? thu??c loa?i kha?c, ta ta?m go?i la? ph??n t?? ‘ca?c ba?ng ti?nh’.(u?ng ?u?ng nh? v??y ???i v??i ca?c trang ti?nh, ca?c vu?ng, ca?c ? trong trang ti?nh. . . .[I]b./ Ph??n t?? co? ti?nh ch??t:[/I] Ha?y nh?? la?i hi?nh a?nh cu?a ba?n tr???c ??y m??t con gia?p: m??t c?/c??u be? cao khoa?ng 1,55m, b??n a?o tr??ng, ng??i gi??a d??y tra?i cu?a l??p ho?c, to?c kh?ng da?i & ma?u ?en, m??t kh?ng m??. . .Chiê?u cao, ma?u a?o, vi? tri?, ma?u & ??? da?i to?c, tra?ng tha?i m??t. . . la? ca?c ti?nh ch??t cu?a ph??n t??. C? ba?n kê? bên cu?ng co? ca?c ti?nh ch??t ?o?, vi? c? ??y cu?ng la? ph??n t?? thu??c loa?i ho?c sinh. Chiê?c ghê? c? ta ng??i cu?ng co? ti?nh ch??t chiê?u cao, vi? tri?, c?n n??ng, nh?ng kh?ng co? ti?nh ch??t vê? ??? da?i to?c, nh?ng ng???c la?i, no? co? ti?nh ch??t n?i sa?n xu??t ma? ba?n & c? kê? bên kh?ng co?. Nh? v??y ca?i ghê? la? ph??n t?? thu??c loa?i kha?c, va? ca?c ph??n t?? thu??c ca?c loa?i khác nhau kh?ng co? ti?nh ch??t gi?ng hê?t nhau.T??p h??p ‘ca?c ho?c sinh trong l??p’ ho?c cu?ng la? m??t ph??n t??. No? kh?ng co? ti?nh ch??t vê? chiê?u cao, c?n n??ng. . . , nh?ng no? co? ti?nh ch??t kha?c: T??ng s??, s?? nam, s?? n??, s?? co? m??t. . . . Nh? v??y, ph??n t?? ‘ca?c ho?c sinh’ thu??c loa?i kha?c v??i ph??n t?? ho?c sinh vi? chu?ng co? ti?nh ch??t kha?c nhau.M??t s?? ti?nh ch??t co? thê? thay ???i ????c. Ba?n thay ???i tra?ng tha?i ti?nh ca?m khi sê?p khen/chê tr???c t??p thê?, ma?u to?c cu?a ba?n sau m??t con gia?p n??a se? kh?ng co?n ?en. . . Nh?ng cu?ng co? nh??ng ti?nh ch??t la? b??t di b??t di?ch: Nga?y sinh (trong pha?m vi hoa?t ???ng bi?nh th???ng cu?a t??p h??p ‘l??p’ hay ‘tr???ng’ ?iê?u na?y la? kh?ng kha? thi).(a?c ph??n t?? trong excel cu?ng co? ti?nh ch??t. M??i ba?ng ti?nh ?ê?u co? nga?y sinh, nga?y hiê?u chi?nh l??n cu??i, do m??t vi? nh?n, hay do m??t tên ng??c na?o ?o? ti?nh c?? l??p ra . m??i ha?ng, m??i c??t, ?ê?u co? chiê?u cao & ??? r??ng. M??i menu ?ê?u co? tiêu ?ê?, ng???i ta liê?t kê s?? trang cho m??i trang ti?nh; m??t s?? ti?nh ch??t r??t dê? bi? t??n th??ng nh? tên cu?a trang ti?nh, nh?ng m??t s?? kha?c la?i kho? h?n: thay ???i t??ng s?? ? trong m??t trang ti?nh.[I]c./ Ph??n t?? co? ph??ng pha?p:[/I] M??i nh?n viên ?ê?u co? thê? ?o?c sa?ch & ?o?c ta?i liê?u, m??i sinh viên ?ê?u co? thê? go? & nh??p ha?m =DSUM() v? ? trang ti?nh. ?? m??t th??i ?iê?m na?o ?o? co? thê? nh?n viên na?y ?ang ?o?c thi? d??ng s?? kha?c ?ang viê?t th? ?iê?n t??. . .Nh?ng quan tro?ng la? v??n ?ê? co? kha? n?ng ?o?c & co? kha? n?ng g??i th? ?iê?n t??. Nh??ng ha?nh ???ng ?o?c, viê?t n??y no? ?o? ta go?i la? ph??ng pha?p cu?a ph??n t?? ?o? (co? nhiê?u ng???i hay du?ng ph??ng th??c thay vi? ph??ng pha?p)Ph??ng pha?p la?m thay ???i ti?nh ch??t. Khi Lê Chanh th??c hiê?n ph??ng pha?p ??? n???c lên ???u mi?nh, thi? ti?nh ch??t chiê?c a?o se? bi? ???t.M??t t??p h??p ca?c ph??n t?? co? ca?c ph??ng pha?p kha?c v??i ca?c ph??ng pha?p cu?a t??ng tha?nh ph??n cu?a no?. Khi m??t nh?n viên m??i v? th?? viê?c, thi? ph??ng pha?p thêm va?o la? ph??ng pha?p cu?a ph??n t?? ‘c? quan’ kh?ng thê? b??t c?? ph??n t?? ‘nh?n viên’ riêng re? na?o th??c hiê?n ????c ph??ng pha?p na?y. M??t ph??ng pha?p quan tro?ng cu?a ph??n t?? t??p h??p la? chi? ra m??t ph??n t?? thu??c vê? no?. Khi gia?ng viên go?i: “Em Thanh, lên ba?ng!” Ta?c ???ng go?i ra m??t ph??n t?? trong m??t t??p h??p & do ?o? ta?o ra m??t liên hê? v??i ph??n t?? ?o? la? m??t ph??ng pha?p cu?a ca?c ph??n t??, ch?? tuyê?t nhiên kh?ng pha?i la? ph??ng pha?p cu?a ph??n t?? ‘Em Thanh’ na?y. ?? ??y la? pha?i hiê?u la? gia?ng viên go?i v??i ca? l??p, ch?? kh?ng pha?i chi? ta?c ???ng lên ph??n t?? ‘Thanh’. Vi? m??t hiê?n nhiên la? ca? l??p ?ê?u nghe c? go?i & th??y kê?t qua? cu?a ph??ng pha?p go?i na?y. (H?n n??a nê?u chi? co? gia?ng viên & ‘Thanh’ thi? ch?a ch??c gia?ng viên go?i nh? v??y!)M??i t??p h??p ca?c ph??n t?? trong excel ?ê?u co? ph??ng pha?p Add ?ê? thêm ca?c ph??n t?? cho mi?nh. Trong trang ti?nh co? ph??ng pha?p Calculate ?ê? ti?nh la?i gia? tri? trong ca?c ?. ??? thi? co? ph??ng pha?p ChartWizard ?ê? thay ???i nhanh cho?ng ca?c ti?nh nê?t cu?a ??? thi?.S?? ph?n biê?t gi??a ph??ng pha?p & ti?nh ch??t cu?ng r??t mong manh. Khi bi? Sê?p m??ng, nh?n viên ‘Hoa’, ‘Hoa’ th??c hiê?n ph??ng th??c tr??ng m??t (m??t ha?nh ???ng), hay c? ta ga?n m??t gia? tri? m??i cho ti?nh ch??t cu?a m??t (ti?nh da?n ???ng t??). Cu?ng co? lu?c ta se? g??p khi m??t ph??ng pha?p tra? vê? m??t gia? tri?.Ha?y xem ph??ng pha?p Intersect sau:[code][B]Function AntiRange(LRng As Range, NRng As Range) As Range [/B] Dim NewRng As Range, CurrCell As Range For Each CurrCell In LRng.Cells If Intersect(CurrCell, NRng) Is Nothing Then If NewRng Is Nothing Then Set NewRng = CurrCell Else Set NewRng = Union(NewRng, CurrCell) End If End If Next Set AntiRange = NewRng Set NewRng = Nothing : Set CurrCell = Nothing [B]End Function[/B] [/code][B]2./ Ti?m hiê?u ca?c ba?ng ti?nh [/B]a./ Thêm m??t ba?ng ti?nh: T?? ba?ng ti?nh ?ang m??, ta se? co? i?t nh??t la? hai ca?ch ?ê? m?? CS (c??a s??) Microsoft VB (Visual Basic), nh? sau:Pha?i chu??t v? vu?ng tr??ng trên thanh Toolbar & cho?n t?? DS ??? xu??ng mu?c Visual Basic, khi thanh c?ng cu? na?y hiê?n ra ta cho?n biê?u t???ng Visual Basic EditorNh??n t?? h??p phi?m Atl + {F11}T?? CS na?y ta v? menu View -> Immediate ?ê? co? thêm m??t CS ‘nghiê?p vu?’ m??i. Tiê?n ha?nh thu nho? CS MVB (Microsoft Visual Basic) co?n ph?n n??a ?ê? th??y ????c CS workbook bên d???i.Trong CS Immediate, ta go? nh??p c?u lê?nh:[code]WorkBooks.Add [/code]Va? ??n ENTER. Ba?n nên ti?m ??u ?o? trên ma?n hi?nh kê?t qua? viê?c VBA th??c hiê?n lê?nh cu?a ba?n. Ph??ng pha?p Add ?a? thêm m??t ph??n t?? ba?ng ti?nh m??i v?? t??p h??p ca?c ba?ng ti?nh cu?a ba?n./(/h? v??y la? vu?ng Immediate na?y h??u du?ng ?ê? chu?ng ta ti?m hiê?u vê? tha?nh ph??n, ph??ng th??c . . . cu?a VBA no?i riêng & Excel n??a./(/ê?u thi?ch ba?n co? thê? l??p la?i lê?nh na?y, b??ng ca?ch gia?n tiê?n h?n, ?o? la? ??n tro? chu??t v? do?ng lê?nh trên & ??n ENTER m??t l??n n??a. b./ ?ê?m s?? ba?ng ti?nh: Chu?ng ta v??a a?p du?ng ph??ng pha?p Add lên ph??n t?? ‘ca?c ba?ng ti?nh’. Ph??n t?? na?y cu?ng co? nh??ng ti?nh ch??t. M??t trong nh??ng ti?nh ?o? la? ?ê?m. Trong CS Immediate ta go? nh??p lê?nh:[code]?workbooks.count [/code]Va? th??c hiê?n ??n ENTER xu??ng do?ng. T??c th??i ta?i do?ng hiê?n ha?nh xu??t hiê?n con s?? chi? ra s?? ba?ng ti?nh co? trong t??p h??p [QUOTE]CS Immediate co?n la? n??i thoa?i ma?i vo?c cu?a d?n t??p tê?nh ?ê?n VBA, na?y nha:Ba?n v??a ta?o ra m??t kiê?t ta?c UDF v??a y? ?, thi? ha?y ?em ?ê?n ??y th?? ca?c kê?t qua? ha?m tra? vê?;Ba?n mu??n kiê?m nghiê?m ca?c ha?m trong VBA ?, n?i na?y cu?ng la? n?i t??t, ch??ng ha?n: ?1 + Date() [/QUOTE] va? ??n ENTER xem sao(?)/(/h? v??y ta th??y, mu??n ?ê?m s?? ba?ng ti?nh ta du?ng ph??ng thu?c Count, nh?ng ph??ng th??c na?y kh?ng la?m t?ng/gia?m s?? ba?ng ti?nh; mu??n t?ng ta du?ng ph??ng th??c Add. Nh? v??y, ti?nh ch??t Count thu??c loa?i ti?nh ch??t chi? ?o?c (read-only), kh?ng kha?c m??y v??i ti?nh ch??t nga?y sinh tha?ng ?e? cu?a ph??n t?? ‘nh?n viên’ na?o ?o?.c./ ?o?ng ba?ng ti?nh: /(/goa?i ph??ng pha?p Add, ph??n t?? WorkBooks co? thêm ph??ng pha?p Close ?ê? ?o?ng ba?ng ti?nh. Go? v? CS Immediate lê?nh [Code] WorkBooks.Close [/code] va? nh??n ENTER, tra? l??i ‘No’ khi ????c ho?i ?iê?u gi? ?o?./(hi ?o? mo?i ba?ng ti?nh ?ê?u biê?n m??t. Nh? v??y ph??ng pha?p Close ta?c ???ng lên ph??n t?? WorkBooks (t??p h??p ca?c ba?ng ti?nh); Co? nghi?a la? no? ?o?ng toa?n b?? t?p h??p na?y.Ba?n th?? th??c hiê?n la?i lê?nh ?WorkBooks.Count xem sao (?)/(/h? v??y ro? m??t ?iê?u, ti?nh ch??t Count ?a? bi? ph??ng pha?p Add & Close thay ???i kh?ng th??ng tiê?c.d./ Chi? ?i?nh m??t ba?ng ti?nh: Ph??ng pha?p Close nh? trên ??i khi b??t l??i, nê?u khi ta chi? c??n ?o?ng m??t hay m??t va?i ba?ng ti?nh cu? thê? na?o ?o?. Gi??ng nh? gia?ng viên mu??n go?i em Chi lên ba?ng, thi? pha?i chi? m??t ???t tên ?o? la? ph??n t?? na?o trong t??p h??p ?ang co?. ?ê?n ??y ba?n nên th??c hiê?n kh?ng d???i 7 l??n lê?nh WorkBooks.Add ?ê? ta?o nhiê?u ba?ng m??i.La? CS soa?n tha?o nên trong Immediate ta co? thê? nh??n cu?ng lu?c CTRL+{ENTER} ?ê? la?m gi? ba?n th??y ngay ???y; Go? nh??p v? do?ng tr??ng c?u lê?nh sau: [Code] ?WorkBooks.Item(1).Name [/code] va? ??n ENTER. Ta?i do?ng ???i thoa?i se? xu??t hiê?n m??t ca?i tên ma? ba?n t?? suy ng??m.Theo nh? quyê?n ghi che?p “Ch??p ch??ng ?ê?n VBA” ta ?o?c c?u lê?nh trên t?? pha?i sang tra?i nh? sau:Tên cu?a ph??n t?? th?? nh??t cu?a ‘ca?c ph??n t??’ ba?ng ti?nh la? gi?(?)T?? ‘Name’ la? ti?nh ch??t cu?a m??t ph??n t?? ba?ng ti?nh (WorkBook)Ba?n xem th?? ph??n t?? WorkBooks co? ti?nh ch??t na?y kh?ng (?)Tiê?p theo ba?n go? [code] Workbooks.Item(2).close [/code] va? ??n ENTER.. Se? co? m??t ba?ng ti?nh na?o ?o? bi? biê?n kho?i t??m m??t./(/ê?u gi?? ba?n nh??p lê?nh [code] ?WorkBooks.Item(2).Name [/code] ?ê? xem hai tên ????c go?i co? liê?n kê? hay ca?ch r??i nhau kh?ng?Item la? m??t ph??ng pha?p ma? mo?i ph??n t?? t??p h??p ?ê?u ch??p nh??n. Ph??ng pháp na?y ???t liên hê? ?ê?n m??t ph??n t?? ????c xa?c ?i?nh ro? cu?a t??p h??p ?o?. Co? thê? chi? ra vi? tri? trong t??p h??p ?o? (nh? ca?c vi? du? trên), co? thê? chi? b??ng tên cu? thê? ( se? ch?? m??t chu?t tiê?p sau)Trong ca?c c?u lê?nh VB, ba?n kh?ng thê? du?ng ca?ch bo? ch?? ‘s’ ?ê? chi? ph??n t?? trong t??p h??p (ch??ng ha?n bo? ch?? ‘s’ trong ch?? WorkBooks ?ê? chi? ph??n t?? riêng re? na?o cu?a ‘ca?c ph??n t??’ workbooks). Mu??n chi? m??t ph??n t?? cu? thê? na?o ta pha?i du?ng ph??ng pha?p Item; Nh? ?ê? ?o?ng workbooks th?? 5 ta du?ng lê?nh WorkBooks.Item(5).Close (kh?ng thê? du?ng Workbook(5).Close)e./ Xa?c ?i?nh m??t ba?ng ti?nh b??ng tên: Chu?ng ta v??a m??i xa?c ?i?nh m??t ba?ng ti?nh b??ng vi? tri? cu?a no? trong m??t t??p h??p (La? vi? tri? tu??n t?? pha?t sinh cu?a no?). M??t ph??n t?? nh??t thiê?t pha?i ????c xa?c ?i?nh theo tên cu?a no? trong m??t t??p h??p. Cho r??ng ?ê? tiê?p tu?c ba?n c??n ph?i t?o va?i ba ba?ng ti?nh ?ang hiê?n h??u. Dùng thanh cu?n d?i ??n cu?i CS Immediate, l?a tên 1 b?ng tính ? gi?a d?y b?ng tính b?n ?ang có (VD là Book9). G? dòng l?nh [Code]WorkBooks.Item(“Book9”).Activate [/code] và ?n ENTER. D??i tác ??ng c?a l?nh này Book9 s? ???c ?i?u ??ng lên n?m ??u d?y các b?ng tính.Activate là m?t trong nh?ng ph??ng pháp c?a m?t ph?n t? b?ng tính. Và quan tr?ng ? ??y là ta ?? ch? ra ph?n t? ?ó b?ng tên c?a nó. Chúng ta th?y, khi dùng tên, ph?i ?? tên trong d?u ngo?t kép. B?n h?y t? mình dùng c?u l?nh cho bi?n ph?n t? này kh?i t?m m?t c?a chúng ta.Sau ?ó thi hành l?nh Activate nêu trên, thì Excel s? d?n d?i & báo l?i có còn b?ng tính ‘Book9’ n?a ??u mà kích ho?t nó!f./ Làm vi?c v?i b?ng tính ?ang ???c kích ho?t:Gi? s? c?n th?c hi?n vi?c gì ?ó lên b?ng tính ?ang kích ho?t (hi?n hành) nên ta có th? tác ??ng lên nó b?ng nh?ng l?nh h?i khác h?n, ví d? [Code] ActiveWorkBook.Close [/Code] s? làm cho b?ng tính này s? ?i v? d? v?ng.g./ Thay ??i giá tr? tính ch?t c?a b?ng tính:Các tính ch?t Count & Name c?a ph?n t? workBooks & WorkBook t??ng ?ng là các tính ch?t ch? ??c. Các tính ch?t này b?n có th? xem ???c nh?ng s? kh?ng cho b?n tr?c ti?p thay ??i giá tr? c?a chúng. Nh?ng c?ng có nh?ng tính ch?t thu?c lo?i ??c-ghi cho phép b?n thay ??i giá tr? c?a chúng. Tính ch?t Saved c?a ph?n t? workbook là m?t tính ch?t nh? v?y. Trong CS Immediate ta t?o thêm t?i thi?u 3 workbooks b?ng cách ?n 3 l?n dòng l?nh WorkBooks.AddSau ?ó ta thêm các dòng l?nh sau: [Code] WorkBooks.Item(1).ActivateRange(“B2: C4”).Value=”N2” ActiveWorkBook.Close [/Code]Dòng l?nh th? hai ta ?? gán giá tr? v? m?t s? ? c?a b?ng tính hi?n hành;Sau khi ?n ENTER c?a dòng l?nh th? ba, thì Excel s? h?i ta có l?u nh?ng thay ??i v?a qua hay kh?ng? C?u tr? l?i chúng ta là kh?ng! (Nh?ng nh? r?ng là chúng ta ?? ???c h?i th?m!)Nh?ng ?? Excel kh?ng h?i gì cho t?n hao th?i gian & ti?n c?a, thay vì c?u l?nh 3 ng?n nh? trên ta thêm cho dài ra m?t chút. Và ?? ??i ch?ng ta nh?p & th?c hi?n l?i các dòng l?nh nh? sau:[Code] WorkBooks.Item(1).ActivateRange(“B1: B2”).Value=”L.T. Th?m, Ki?n An N0 -17” ActiveWorkBook.Close SaveChanges := False [/Code]Sau khi ?n ENTER, chúng ta có b? h?i han n?a kh?ng v?y?!M?t ?i?u nên nh? là n?u chúng ta ?? cho macro làm gì ?ó trên b?ng tính. Sau ?ó mu?n ?óng l?i thì nên ?n ??nh giá tr? thu?c tính l?u cho excel hi?u vi?c mình ph?i làm, trách ?? Excel h?i han l?i l?i th?i. Vì trong nhi?u tr??ng h?p sau này chúng ta kh?ng bi?t mình ?? làm gì ?? b? h?i han!Bài 12:KH?I NI?M V? PH?N T? RANGE[code]Ph?n này d?a ch? y?u v? bài vi?t c?a ch? HANDUNG107 t?i?: [/code]Là m?t ?, m?t hàng, m?t c?t, ho?c có th? là m?t vùng ch?n c?a các ?, ch?a m?t hay nhi?u vùng ? k? nhau, hay 3-D rangeCách th?c s? d?ng ph?n t? rangeCác tính ch?t (thu?c tính) và ph??ng th?c (ph??ng pháp) s? tr? v? ph?n t? range ???c li?t kê nh? sau ??y:Thu?c tính Range (Range property )Thu?c tính Cells (Cells property )Range and Cells Thu?c tính Offset (Offset property )Ph??ng th?c Union (Union method )Chúng ta s? xét ??n t?ng thu?c tính & ph??ng th?c nêu trên c?ng nh? m?t s? thu?c tính có h? hàng v?i chúng.Thu?c tính RangeChúng ta s? d?ng Range(arg), ? ??y arg là tên c?a range, s? ???c tr? v? m?t ??i t??ng Range là m?t ? ??n (cell) hay vùng các ?. Ví d? sau ??y s? gán giá tr? c?a ? B1 v? ? C5 [code] Worksheets("Sheet1").Range("C5").Value = _ Worksheets("Sheet1").Range("B1").Value[/code]Ví d? ti?p theo s? gán các s? ng?u nhiên t? 1 ??n 9 v? vùng ? t? D1:F8. [Code]Worksheets("Sheet1").ActivateRange("A1:H8").Formula = "= 1 + 8 * Rand()" ‘Range is on the active sheet [/code]Còn ví d? th? ba sau, s? xóa d? li?u trong vùng có tên là Criteria. [Code]Worksheets(1).Range("Criteria").ClearContents [/Code]N?u ta s? d?ng ??i s? d?ng text trong ??a ch? vùng, chúng ta ch? ???c dùng lo?i kí hi?u A1 (chúng ta kh?ng th? dùng lo?i R1C1)Thu?c tính CellsTa s? d?ng thu?c tính Cells(row, column), ? ??y row là ch? s? hàng & column là ch? s? c?t, s? ???c tr? v? m?t ? ??n. Ví d? ta gán giá tr? 34 v? ? B2. [Code]Worksheets(1).Cells(2, 2).Value = 34[/code]Hay ch?a t?ng 1 vùng v? ? A2, nh? sau:. [Code]ActiveSheet.Cells(2, 1).Formula = "=Sum(B1:B5)" [/Code]Ví d? d??i ??y s? l?p b?ng tiêu ?? c?t & tiêu ?? hàng cho m?t trang tính. Qua ví d? này, chúng ta c?ng th?y ???c s? khác bi?t nho nh? trong cách dùng thu?c tính Range & thu?c tính Cells. [php] Option ExplicitSub SetUpTable() Dim TheYear As Byte, TheQuarter As Byte Worksheets("Sheet1").Activate For TheYear = 1 To 5 Cells(1, 1 + 2 * TheYear).Value = 2000 + TheYear Next TheYear For TheQuarter = 1 To 4 Range("B" & TheQuarter + 2).Value = "Q" & TheQuarter Next TheQuarterEnd Sub[/php]N?u ta s? d?ng d?ng th?c expression.Cells(row, column) , mà ? ??u bi?n expression là m?t bi?n ???c tr? v? là m?t ??i t??ng Range, và row & column có m?i liên h? v?i góc trái nh?t c?a Range, thì s? tr? v? m?t ph?n c?a Range. Ví d? sau ??y s? áp ??t c?ng th?c v? ? D5. [code]Worksheets(1).Range("C5:F9").Cells(1, 2).Formula = "=Rand()" [/code]Range and CellsN?u s? d?ng Range(cell1, cell2), mà cell1 & cell2 là ??i t??ng Range, ??t tr?ng c?a các ? ??u & ? cu?i, thì s? tr? v? là 1 ??i t??ng Range. Ví d? sau ??y s? t?o ???ng vi?n cho các ? B2:I9. [Code]With Worksheets(1) .Range(.Cells(2, 2), .Cells(9, 9)) _ .Borders.LineStyle = xlThickEnd With [/Code]Ti?p theo, chúng ta kh?o sát ?o?n m? l?nh sau. Yêu c?u sau khi kh?o sát, b?n h?y cho bi?t bi?n Rng ch?p nh?n ch??i nào trong các chu?i sau:‘A1B5’; ‘A:A’; ‘1:1’; ‘B:X’; ‘Ax1:A1’; ‘5:9’; ‘$A4:b$7’; ‘4 4’[php]Sub RangeFromInputbox() Dim Rng As Range Set Rng = Application.InputBox _ (Prompt:="Select any range", Title:="Demo", Type:=8) MsgBox Rng.AddressEnd Sub[/php]Thêm m?t ví d? n?a, ?? th?y vi?c dùng các thu?c tính ?ang nêu:[code]Sub LastRowAndColumn() Dim lRow As Long, iCol As Integer lRow = Range("A65432").End(xlUp).Row iCol = Cells(2, 255).End(xlToLeft).Column MsgBox Cells(lRow, 1).Address, , Range(Chr(64 + iCol) & 2).Address End Sub[/code](Chúng ta cho macro ch?y trên m?t trang tính có d? li?u ?? xác ??nh tính ?úng ??n c?a macro này!Có th? kh?ng thích xái thu?c tính range ta xài thu?c tính Cells, và ng??c l?i? Ta xét ??n ví d? sau: [php]Sub AllLoop()1 Dim Clls As Range 2 For Each Clls In Cells 3 If Clls.Value = "@" Then 4 Clls.Activate: Exit For 5 End If 6 Next CllsEnd Sub [/php]V?y b?n th? ??i ch? ‘Range’ trong dòng l?nh 1 thành ‘cells’ xem sao. Sau khi ta nh?p xong, VBE c?ng chuy?n ch? này thành ‘Cells’, Nh?ng khi b?m ch?y macro thì nh?n ???c th?ng báo l?i! T??ng t?, n?u ta thay ch? ‘Cells’ c?a dòng l?nh 2 b?ng ch? ‘range’. Thì c?ng nh?n ???c k?t qu? t?i t? kh?ng kém, Thu?c tính OffsetS? d?ng thu?c tính Offset(row, column), mà khi ?ó row & column là s? hàng & s? c?t khác l?ch c?a range ???c thu?c tính tr? v? so v?i ??a ch? nguyên th?y tr??c ?ó. ?? r? h?n ta xét ví d? sau: [php]Worksheets("Sheet1").Activate 'Can't select unless the sheet is active’Selection.Offset(3, 1).Range("A1").Select [/php]Chúng ta xét thêm m?t ví d? n?a, sau ??y: [code]Sub OffsetRanges() MsgBox Range("A2:B3").Offset(2, 4).Address, , Range("A2:B3").Address End Sub [/code]Các b?n cho macro ch?y & t? rút cho mình k?t lu?n c?n thi?t.C?ng gi?ng trong excel, chúng ta có th? kh?ng ghi 1 trong 2 bi?n c?a thu?c tính này. Trong VBA chúng ta có th? th?y các dòng l?nh sau[code] Set Rng = Range(“B” & Range(“B65432”).End(xlUp).Row).Offset(1) Temp = Range(“C1”).Offset(,Range(“B65432”).End(xlUp).Row) [/code]Ph??ng th?c UnionS? d?ng ph??ng th?c Union(range1, range2, ...) ?? ???c tr? v? m?t h?n h?p vùng —?là vùng g?p chung gi?a hai hay nhi?u h?n nh?ng kh?i ?. Thí d? sau ??y s? t?o ra ??i t??ng xác ??nh b?i ph??ng th?c Union hai vùng A2:B3 and C3:D4, và sau ?ó ch?n nó. [php]Sub UnionMethodDim r1 As Range, r2 As Range, myMultiAreaRange As RangeWorksheets("sheet1").ActivateSet r1 = Range("A1:B2"):Set r2 = Range("C3:D4")Set myMultiAreaRange = Union(r1, r2)myMultiAreaRange.Select End Sub[/php]N?u chúng ta c?n làm vi?c v?i vùng ch?n, mà vùng này bao g?m h?n 1 vùng riêng r?, t?t h?n ta dùng thu?c tính Areas. V? thu?c tính Areas xin ch?a ?i s?u trong bài vi?t này! ?? hi?u r? h?n v? ph??ng th?c Union, xin các b?n tham kh?o thêm bài vi?t t?i: ;Có b?n trên di?n ?àn chúng ta ??t c?u h?i:Có 2 vùng: A=Range("A1:G20"); B=Range("C3:D4")Làm sao xác ??nh ???c vùng C=A-B (là vùng A mà lo?i b? các ? trong vùng B) b?ng VBA ?T?i xin gi?i thi?u m?t trong nh?ng cách ?ó là dùng ph??ng th?c UNION(), nh? sau: [php]Option ExplicitSub Range11() Dim Rng As Range, RngA As Range, RngB As Range, RngC As Range Set RngA = Range("A1:E16") Set RngB = Range("B7:C10") For Each Rng In RngA If Intersect(Rng, RngB) Is Nothing Then If RngC Is Nothing Then Set RngC = Rng Else Set RngC = Union(RngC, Rng) End If: End If Next Rng MsgBox RngC.AddressEnd Sub [/php](?o?n m? trên dùng ?? xét t?ng ? trong toàn b? các ? c?a vùng A; Khi g?p 1 ? nào ?ó kh?ng thu?c vùng B thì gán v? bi?n vùng C b?ng ph??ng th?c union(). Nh? v?y ?? hi?u th?t k? cách th?c trong khi th?c thi C = A – B ta ph?i hi?u thêm ph??ng th?c INTERSECT(). Mong các b?n t? tham kh?o thêm)Thu?c tính Resize N?u trong c?a s? (CS) VBE (b?ng cách nh?n các phím Atl+{F11} hay t? CS Immediate ta nh?p ch? Resize, b?i ch?n toàn b? và nh?n {F1}, ph?n tr? giúp c?a excel v? ??t tính này nh? sau: Resizes the specified range. Returns a Range object that represents the resized range.expression.Resize(RowSize, ColumnSize)expression??? Required. An expression that returns a Range object to be resized.RowSize??? Optional Variant. The number of rows in the new range. If this argument is omitted, the number of rows in the range remains the same.ColumnSize??? Optional Variant. The number of columns in the new range. If this argument is omitted, the number of columns in the range remains the same.ExampleThis example resizes the selection on Sheet1 to extend it by one row and one column.Worksheets("Sheet1").ActivatenumRows = Selection.Rows.CountnumColumns = Selection.Columns.CountSelection.Resize(numRows + 1, numColumns + 1).SelectThis example assumes that you have a table on Sheet1 that has a header row. The example selects the table, without selecting the header row. The active cell must be somewhere in the table before you run the example.Set tbl = ActiveCell.CurrentRegiontbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, _ tbl.Columns.Count).Select(Xin phép cho t?i mi?n d?ch ph?n v?a r?i, vì có khi d?ch kh?ng t?t b?ng nguyên b?ng). ?? hi?u r? h?n v? thu?c tính này, ta xét thêm vài ví d? sau ??y:Ta có macro (Mc) dùng ?? m? r?ng vùng ch?n, nh? sau [php]Sub ExpandingArray() Dim xRng As Range, TrRng As Range Set xRng = Range("c2:d9"): Set TrRng = Range("b4:c35") Set xRng = xRng.Resize(xRng.Rows.Count, xRng.Columns.Count + 5) MsgBox xRng.Address, , "A" Set TrRng = TrRng.Resize(xRng.Rows.Count + TrRng.Rows. _ Count, TrRng.Columns.Count) MsgBox TrRng.Address, , "B"End Sub [/php]Các b?n cho Mc ch?y, khi ?ó l?n l??t xu?t hi?n 2 h?p tho?i, cho ta th?ng tin ??a ch? vùng ?? ???c m? r?ng d??i tác ??ng c?a ??c tính Resize.??n ??y t?i th?y c?n ph?n bi?t gi?a hai thu?c tính OFFSET() & RESIZE()Chúng ta xem xét ??n macro sau: [php]Sub OffsetAndResize() Dim Rng As Range Set Rng = Range(“B2”).Offset(, 1) MsgBox Rng.Resize(2,2).Address,, Rng.AddressEnd Sub [/php]Sau khi ta ??c d? li?u trong h?p tho?i & ??i chi?u v?i các ch? s? trong các thu?c tính, ta s? r?ch ròi h?n xíu v? cách th?c c?a 2 thu?c tính trên.Thi?t ngh? c?ng c?n nêu l?i v?n ?? danh sách tiêu ?? c?a vùng d? li?u nh? ví d? sauSub TableDataHeaders()Dim rTable As Range Set rTable = Sheet1.Range("A1").CurrentRegion Set rTable = rTable.Resize(rTable.Rows.Count - 1) MsgBox rTable.Address, , "1" Set rTable = rTable.Offset(rTable.ListHeaderRows) MsgBox rTable.Address, , "2"End SubMacro này ta ?? g?p khi nghiên c?u v? thu?c tính CurrentRegion. (b?n nào c?n xen l?i, có th? nh? m?c tìm ki?m c?a GPE)Bài 13:UsedRange1./ Mc sau ??y s? t? màu các ? c?ng th?c trong vùng s? d?ng c?a trang tính ?ang kích ho?tSub ColorAllFormulae() ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas).Interior.ColorIndex = 6End Sub 2./ Vùng giao nhau v?i các c?t cho tr??c & ??t tên 1 vùng d? li?uTa kh?o sát ti?p Mc sau:Sub UsedRange()Dim lRow As Long, bCol As Byte 2lRow = Worksheets("S1").UsedRange.Rows.Count3bCol = Worksheets("S1").UsedRange.Columns.CountWith ActiveSheet5 MsgBox Intersect(.Range("c:q"), .UsedRange).AddressEnd With7ThisWorkbook.Names.Add "Matrix", "=!r2c2:r" & lRow & "c" & bCol'expression.Add(Name, RefersTo, Visible, McType, ShortcutKey, Category, NameLocal, _ RefersToLocal, CategoryLocal, RefersToR1C1, RefersToR1C1Local)End Sub Dòng l?nh 2 ???c hi?u là s? dòng ch?a d? li?u c?a Sheets(“S1”) ?em gán v? bi?n lRowT??ng t? dòng l?nh 3: bi?n bCol s? ch?a s? c?t có d? li?u;Dòng 5 cho ta bi?t ??a ch? gioa nhau gi?a vùng ch?a d? li?u & các c?t t? ‘C’ ??n ‘Q’;Dòng 7 các ? t? dòng 2, c?t 2 ??n ? cu?i ph?i nh?t ???c gán tên là ‘Matrix’3./ Duy?t các ? trong 1 hàng & trong t?t c? các c?t c?a vùng ch?a d? li?uSub OutputAddress() Dim myRange As Range, rRng As Range, cRng As Range Dim intUnit As Integer Dim StrR As String, StrC As String, Xh As String Xh = Chr(10) & Chr(13) Set myRange = ActiveSheet.UsedRange For Each rRng In myRange.Rows StrR = StrR & rRng.Address & Xh For Each cRng In rRng.Cells StrC = StrC & rRng.Address Next Next MsgBox StrR, , "Row" End Sub4./ Nh?n toàn b? các ? ch?a c?ng th?c s? v?i 1 giá tr?Sub NegativeAllNumberFormula2() On Error Resume Next With Range("IV65536") .Value = -1 .Copy ActiveSheet.UsedRange.SpecialCells _ (xlCellTypeFormulas, xlNumbers).PasteSpecial _ xlPasteValues, xlPasteSpecialOperationMultiply .Clear End With End Sub5./ Xóa dòng theo ?i?u ki?n c?a 1 c?t (‘D’) ch?a ? tr?ngSub DeleteRowsWithSpecifiedData()'Looks in Column D and requires Column IV to be clean Columns(4).EntireColumn.Insert With Range("D1:D" & ActiveSheet.UsedRange.Rows.Count) .FormulaR1C1 = "=IF(RC[1]="""",NA(),IF(RC[1]=""Not Needed"",NA()))" .Value = .Value On Error Resume Next .SpecialCells(xlCellTypeConstants, xlErrors).EntireRow.Delete End With On Error GoTo 0 Columns(4).EntireColumn.DeleteEnd Sub6./ Phóng ??i vùng ch?a d? li?u khi sheet ???c kích ho?t Private Sub Worksheet_Activate() Application.EnableEvents = True Application.WindowState = xlMaximized ActiveSheet.UsedRange.Select ActiveWindow.Zoom = TrueEnd Sub7./ L?p danh sách ??a ch? vùng ch?a d? li?uPrivate Sub Workbook_BeforeSave _ (ByVal SaveAsUI As Boolean, Cancel As Boolean)'Put in the UsedRange Address of Sheet1 Book1.xls (this workbook) Sheet2.Cells(Cells(65432).End(xlUp).Row + 1, 1) = Sheet1.UsedRange.AddressEnd SubBài 14:CurrentRegion Property (An hem sinh ??i c?a usedRange)1./ S? khác bi?t gi?a CurrentRegion & UsedRangeGi? d? chúng ta có trang tính ‘S1’ ?ang ???c kích ho?t, T?i c?t A, t? A1 ??n A9 & B1 ??n B9 có d? li?u ?? nh?p, ta thêm vài giá tr? v? ? i14 & i15;Khi ?ó ta ch?y macro ( Mc)Sub UsedRange() Dim rTable As Range Set rTable = Sheet1.UsedRange MsgBox rTable.Address, , "0"End Sub Trong h?p tho?i s? là $A$1:$I$15; Còn khi ch?y Mc có n?i dung Sub CurrentRegion1() Dim rTable As Range Set rTable = Sheet1.Range("A1").CurrentRegion MsgBox rTable.Address, , "1" Set rTable = Sheet1.Range("i13").CurrentRegion MsgBox rTable.Address, , "2" With Sheet1 Set rTable = .Range(.Range("c2"), _ .Cells(65536, .Range("IV1").End(xlToLeft).Column).End(xlUp)) End With MsgBox rTable.Address, , "3"End SubS? xu?t hi?n l?n l??c 3 h?p tho?i sau 1: $A$1:$B$9 2: $I$13:$I$15 3: $B$2:$C$9 Nh? v?y 3 h?p tho?i cu?i ??a ra 3 ??a ch? hoàn toàn khác so v?i vùng s? d?ng (do Mc ??u tiên ??a ra). Nh?ng ??a ch? này hoàn toàn tùy thu?c vào v? trí ta ?ang ??ng & b?t ??u g?i th?c hi?n CurrentRegion.2./ ?i?u kì di?u c?a CurrentRegionTi?p ??n ta xét ??n m?t ?i?u kì di?u & v? cùng th?ng minh c?a excel. ?? v?y, chúng ta nh?p ti?p các tên ng??i v? c?t E, b?t ??u t? E2 ??n E9; Còn t? F2 ??n F9 là nh?ng con s? b?t k?;Sau ?ó ta cho ch?y Mc sau:Sub TableWithHeaders()Dim rTable As Range: Dim lHeaderRow As Long Set rTable = Sheet1.Range("E1").CurrentRegion lHeaderRow = rTable.ListHeaderRows MsgBox rTable.Address, , "A" If lHeaderRow > 0 Then Set rTable = rTable.Resize(rTable.Rows.Count - lHeaderRow) MsgBox rTable.Address, , "B" Set rTable = rTable.Offset(1) MsgBox rTable.Address, , "C" End If End Sub N?u th?c hi?n ?úng các thao tác nh? ?? nêu, các b?n ch? nh?n ???c 1 h?p tho?i duy nh?t mang k? hi?u ‘A’, v?i n?i dung nh? sau: $E$1:$F$9 (Gi?ng tr??ng h?p h?p tho?i s? (2) nh? trên);Ti?p theo ta s?a n?i dung c?a ? F2 thành chu?i: ‘SoTien’L?n ch?y l?i Mc k? này, ta thu thêm 2 h?p tho?i m?i (B): $E$1:$F$7 (C): $E$2:$F$8? ??y tr??ng h?p (C) dùng ph??ng th?c OFFSET() c?a m?t vùng nên vùng m?i t?ng so v?i vùng tr??c nó (ch?a dùng ph??ng th?c OFFSET()) m?t dòngCác v?n ?? còn l?i, các b?n ng?n ngh? & t? rút ra k?t lu?n cho chính mình;What Constitutes a Heading/Header RowIf your table is numeric data and you headings are text (or vice verca), Excel will assume row 1 of the table as a header row. However, if your data AND headings are both numeric, or both text, Excel will consider your table as having NO headers. The way to overcome this is to make your headings different to that of the data. This can be done via bolding, font color/size etc.Or, should you simply know for a fact that row 1 of the table IS a header row you can use the code below; (Các b?n th?ng c?m cho v?n ti?ng anh bé t?o c?a m?nh & t? ??c l?y nha!)3./ Truy xu?t t?ng c?t d? li?u trong vùng CurrentRegion?? làm r? h?n v?n ?? truy xu?t d? li?u c?a 1 c?t nào ?ó, chúng ta xét ti?p 1 Mc n?a, sau ??y:Sub LoopColsSheet() Const Cot = 2 Dim wSh As Worksheet: Dim Rng As Range For Each wSh In Worksheets Select Case UCase(wSh.Name) Case "S2", "S1" 'Do nothing Case Else For Each Rng In wSh.Range("A5").CurrentRegion.Columns(Cot).Cells MsgBox Rng , , “4” Next Rng End Select Next wShEnd SubN?u ta cho Mc ch?y, ta s? thu ???c th?ng tin d? li?u cùa c?t 2 N?u ta thay Cot = 9, & cho ch?y l?i Mc, ta v?n thu ???c t?ng ?y h?p tho?i 4 mà th?i.4./ Bi?n ch?a vùng CurrentRegionT??ng t? nh? v?y, ta xét thêm tr??ng h?p sauSub Matric() Dim Mang, iJ As Long Mang = Sheets("S1").Range("a1").CurrentRegion.Resize(, 3).Value For iJ = 1 To UBound(Mang, 1) MsgBox Mang(iJ, 2), , "5" Next iJ Exit Sub: End SubTrong Mc có 2 giá tr? là 3 & 2; Ta ch?y th? nhi?u l?n v?i các giá tr? này t?ng d?n xem sao. Mình ng? r?ng k?t qu? s? nh? Mc trên nó! 5./ CurrentRegion & copy các c?t d? li?uVí d? ta có d? li?u c?a n?m tr??c t?i c?t A:C B?t ??u t? c?t E cách ??u 4 c?t là d? li?u c?a các tháng trong n?m hi?n th?i; (M?i tháng g?m 3 c?t d? li?u & cách tháng sau nó 1 c?t tr?ng)Nhi?m v? ?? ra là chép 12 tháng d? li?u v? ba c?t l?u d? li?u n?m tr??c (t?i c?t A:C)Nhi?m v? này chúng ta giao cho Mc sau:Sub Copy3Columns() Dim Rng As Range: Dim lRow As Long Set Rng = Range("E1") lRow = Range("A" & Rows.Count).End(xlUp).Row + 1 While Rng.Value <> "" Rng.CurrentRegion.Copy Range("A" & lRow) lRow = lRow + Rng.CurrentRegion.Rows.Count Rng.Resize(, 4).EntireColumn.Delete Set Rng = Range("E1") Wend Set Rng = NothingEnd SubMc Copy3Columns có dòng l?nh 1: khai báo hai bi?n s? dùng; D2: Ta ch?n & kích ho?t ? ‘E1’ D3?: thêm 1 v? giá tr? dòng cu?i c?a d? li?u l?u gán v? bi?n lRow ?? khai báo?;D4 & D9?: Thi?t l?p vòng l?p cho ??n khi th?a ?i?u ki?n giá tr? ch?a trong bi?n Rng là tr?ng?;D5?: Vùng d? li?u l?u ???c chép thêm t? vùng CurrentRegion?;D6?: Xác ??nh l?i dòng cu?i c?a d? li?u l?u (?? + 1)D7?: Xóa 4 c?t v?a chép?;D8?: Xác l?p l?i vùng ch?nBài 15?:B??c ??u v? ph??ng th?c Intersect Trong c?a s? VBA ta g? Intersect , quét ch?n toàn b? và nh?n {F1} ta s? nh?n ???c ph?n tr? giúp v? ph??ng th?c Intersect nh? sau:Intersect Method Returns a Range object that represents the rectangular intersection of two or more ranges.expression.Intersect(Arg1, Arg2, ...)expression Optional. An expression that returns an Application object.Arg1, Arg2, ... Required Range. The intersecting ranges. At least two Range objects must be specified.ExampleThis example selects the intersection of two named ranges, rg1 and rg2, on Sheet1. If the ranges don't intersect, the example displays a message.Worksheets("Sheet1").ActivateSet isect = Application.Intersect(Range("rg1"), Range("rg2"))If isect Is Nothing ThenMsgBox "Ranges do not intersect"Elseisect.SelectEnd IfTi?p t?c ta xem thêm m?t s? ví d? sau:1./ Ví d? khi thay ??i tr? c?a m?t ? trong vùng Private Sub Worksheet_Change(ByVal Target As Range) StrC = "The active cell does " If Intersect(ActiveCell, Range("A1:A9")) Is Nothing Then MsgBox StrC & "NOT Intersect A1:A9", , Target.Address Else MsgBox StrC & "Intersect A1:A9", , Target.Address End If If Not Intersect(Target, Range("A2,B1:B9,C4:D9")) Is Nothing Then MsgBox "Hello", , "A2,B1:B10,C5:D9" ElseIf Not Intersect(Range(“A1:D9”,Target) Is Nothing then MsgBox "A1:D9" ,, "Hello!" End IfEnd Sub2./ Liên quan ??n vùng ???c ??t tên:N?u ta ?? ??t tên cho vùng nào ?ó trong b?ng tính là "MyRang" thì khi ta ??ng ??n 1 ? trong vùng ?ó, s? nh?n ???c th?ng báo:Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim MyName As Name On Error Resume Next If Range("MyRang") Is Nothing Then Exit Sub On Error GoTo 0 If Not Intersect(Target, Range("MyRang")) Is Nothing Then MsgBox Range("MyRang").Name, , "Hello" End IfEnd Sub3./ T? màu n?n c?a vùng ???c nh?p các s? ng?u nhiênKhi ta ch?n vùng t? A7 ??n A35, sau ?ó nh?p v? thanh c?ng th?c chu?i: =INT(19*RAND())+32. Chúng ta k?t thúc b?ng t? h?p CTRL+ENTER thì ?o?n m? sau s? t? màu n?n theo tr? trong ? Private Sub Worksheet_Change(ByVal Target As Range) Dim rgArea As Range, rgCell As Range Dim iColor As Integer ' Get the intersect of the target & the proper range Set Target = Intersect(Target, Range("A6:A62")) If (Not Target Is Nothing) Then For Each rgArea In Target.Areas For Each rgCell In rgArea.Cells With rgCell If .Value < 56 Then .Interior.ColorIndex = .Value End With Next rgCell, rgArea End If Exit Sub: End Sub4./ Ph??ng th?c Union() song hành:Code:Private Sub Worksheet_Change(ByVal Target As Excel.Range) Dim Rang As Range Set Rang = Union([A1], [A3], [A5], [A7], [A9], [B1], [B3], [B5], [B7], [B9], [C1], [C3], [C5], [C7], [C9]) Set Rang = Union(Rang, [E2], [E4], [E6], [E8], [F2], [F4], [F6], [F8], [G2], [G4], [G6], [G8], [H2]) If Intersect(Target, Union(Rang, [D3], [D5])) Is Nothing Then Exit Sub If Not Intersect(Target, Rang) Is Nothing Then With Target.Offset(0, 1) .Value = .Value + Target End With ElseIf Not Intersect(Target, [D4]) Is Nothing Then With Range("E4") .Value = .Value + [D4] End With Else With Range("E5") .Value = .Value + [D5] End With End IfEnd Sub?oa?n code sau cho phe?p ta che?p ca?c ha?ng intersect v??i vu?ng la? m??t s?? ? trong 1 c??t, ma? ca?c ha?ng na?y co? ? trong c??t cho?n kh?ng ch??a gia? tri:(Cu? thê?: ta cho?n vu?ng t?? 'J3:J9' ma? trong ?o? gia? tri? ta?i J5 & J8 = ""; thi? khi cha?y macro chu?ng ta se? co? hai do?ng d?? liê?u 5 & 8 bên sheets('S2')): Code: Sub CopyRows() Dim UniRange As Range, Rng As Range For Each Rng In Selection With Rng If .Value = "" And .Offset(0, 1).Value <> "" Then If UniRange Is Nothing Then Set UniRange = .EntireRow Else Set UniRange = Application.Union(UniRange, .EntireRow) End If: End If End With Next Rng ' MsgBox UniRange.Address UniRange.Copy Destination:=Sheets("S2").Range("A65536").End(xlUp).Offset(1, 0) Exit Sub: End Sub 5./ M?t cách khác ?? bi?n các chu?i nh?p v? c?t ‘D’ ??u vi?t hoa.Private Sub Worksheet_SelectionChange(ByVal Target As Range) Dim Rang As Range: Dim StrC As String Set Rang = Union([A1], [A3], [A5], [A7], [A9], [B1], [B3], [B5], [B7], [B9], [C1], [C3], [C5], [C7], [C9]) Set Rang = Union(Rang, [E2], [E4], [E6], [E8], [F2], [F4], [F6], [F8], [G2], [G4], [G6], [G8], [H2], [H4]) StrC2 = "D1:D999"‘ !!!***!!! If Target.Cells.Count > 1 Or Target.HasFormula Then Exit Sub On Error Resume Next Application.EnableEvents = False If Not Intersect(Target, Union(Rang, [h6], [h8], [i2], [i4], [i6], [i8])) Is Nothing Then Target.Value = UCase(Left(Target.Value, 1)) & Mid(Target.Value, 2) ElseIf Not Intersect(Target, Range(StrC2)) Is Nothing Then Target.Value = UCase(Target.Value) End If Application.EnableEvents = True On Error GoTo 0End Sub6./ M?t cách nh?p t? ??ng ngày hi?n hành v? tr??ng [NgThang] c?a CSDLN?u ta có CSDL mà c?t B ch?a [MaHg] & c?t C ch?a ngày nh?p, c?t F ch?a ngày xu?t thì ?o?n m? sau s? cho phép t? ??ng nh?p ngày hi?n hành khi ta nh?p v? c?t tr??c nó là m? v?t t?, hàng hoá nh?p hay xu?t.Private Sub Worksheet_Change(ByVal Target As Range) If Not Intersect(Target, Range("B:B,E:E")) Is Nothing Then If Not IsEmpty(Target) Then Target.Offset(0, 1).Value = Date Else Target.Offset(0, 1).Value = Empty End If End If End Sub7./ Ph??ng th?c Intersect và copy vùng d? li?uDùng ph??ng th?c Intersect ?? ki?m tra vùng d? li?u khi c?n copy?Tr??ng h?p A:Code:Sub ShtChange() Dim Rang0 As Range, IntersectRng As Range Sheets("S4").Select: Set Rang0 = Range("J3:J16") Set IntersectRng = Intersect(Selection, Rang0) If IntersectRng Is Nothing Then Exit Sub CopyC IntersectRng End SubPrivate Sub CopyC(Target As Range) Dim lRow As Long Application.ScreenUpdating = False: Application.EnableEvents = 0 lRow = Target.Row ' lRow = IntersectRng.Row 'Xoá 1 dòng ch?a d? li?u Range("A" & lRow & ":J" & lRow).ClearContents Range("A" & lRow + 1 & ":I16").Copy '& Copy Các dòng d??i lên thay ch? Range("A" & lRow & ":I15").PasteSpecial xlPasteValues Range("A16:I16").ClearContents Application.EnableEvents = True: Application.ScreenUpdating = -1 End SubTr??ng h?p BCode:Sub CopyCol() Dim iRow As Integer iRow = ActiveCell.Row If Not Intersect(ActiveCell, Range("$C$3:$M$3000")) Is Nothing Then Application.EnableEvents = False If Range("B" & iRow) = "" Then Range("O" & iRow) = "P" Else Range("B" & iRow).Select Selection.Copy Range("Q7").Select If Not Range("Q7") = "" Then Range("Q6:Q150").Select Selection.End(xlDown).Offset(1, 0).Select 'Selection.Offset(1, 0).Select End If Selection.PasteSpecial Paste:=xlValues, Operation:=xlNone, _ SkipBlanks:=False, Transpose:=False Application.CutCopyMode = False Range("B" & iRow) = "": Range("O" & iRow) = "P" End If Else Range("O" & iRow).Interior.ColorIndex = xlColorIndexNone End If Application.EnableEvents = True End SubTr??ng h?p CCode:Sub Copy_Stuff() On Error GoTo ExitSub Dim rCols As Range, CheckCells As Range, rCell As Range, CopyRange As Range Dim bDem As Long Set rCols = Sheet1.Range("A:I, L:R") Set CheckCells = Intersect(Sheet1.Range("L9:L65536"), Sheet1.UsedRange) For Each rCell In CheckCells If rCell.Value > 0 Then bDem = bDem + 1 If bDem = 1 Then Set CopyRange = rCell.EntireRow Else Set CopyRange = Union(CopyRange, rCell.EntireRow) End If End If Next rCell Set CopyRange = Intersect(rCols, CopyRange) For Each rCell In CopyRange.Areas bDem = Sheet3.Rows.Count Set rCols = Sheet2.Cells(bDem, rCell.Column).End(xlUp).Offset(1, 0) rCell.Copy rCols Next rCellExitSub: End SubTr??ng h?p DCode:Sub Get_Data()On Error Resume Next Dim vRange As Range, MatchCells As Range, cell As Range Dim NgDau As Date, NgCuoi As Date Sheets("S2").Select NgDau = #9/16/2006#: NgCuoi = 9 + NgDau Set vRange = Range("D:D", "F:F") For Each cell In vRange.SpecialCells(xlConstants, xlNumbers) If cell.Value >= NgDau And cell.Value <= NgCuoi Then If MatchCells Is Nothing Then Set MatchCells = cell.EntireRow Else Set MatchCells = Union(MatchCells, cell.EntireRow) End If End If Next cell Intersect(MatchCells, vRange).Copy Sheets("S3").Range("G2").PasteSpecial (xlValues) Application.CutCopyMode = False: Sheet2.Select MsgBox Intersect(MatchCells, vRange).Address, , MatchCells.Address Selection.Offset(0, 1).SpecialCells(xlConstants, xlTextValues).ClearContents End SubTr??ng h?p ECode:Sub GenerateSht() 'The following will generate the Over/Under worksheet 'Range copied will depend on whether or not the value in column 11 is greater than 0 'Columns 9 and 10 are not to be copied.Dim Cols As Range, SearchCell As Range, CopyRange As RangeDim wSheet As Object, LastRow As Long, lDem As Long With Application .ScreenUpdating = False: .Calculation = xlCalculationManualEnd WithSet wSheet = Sheets("DNgh"): wSheet.Range("A9:T999").ClearContentsSheets("S4").SelectSet Cols = Range("A:I, L:S"): Set SearchCell = Range("B9")Set wSheet = Sheets("S4")With wSheet Do While Len(SearchCell) > 1 'Bat Dau Tu B9 den khi Len(B(i)) > 1 If SearchCell.Offset(0, 10) <> 0 Then lDem = lDem + 1 If lDem = 1 Then Set CopyRange = SearchCell.EntireRow Else Set CopyRange = Union(CopyRange, SearchCell.EntireRow) End If End If Set SearchCell = SearchCell.Offset(1, 0) 'Set SearchCell Variable for next loop LoopEnd WithSet CopyRange = Intersect(Cols, CopyRange)Set wSheet = Sheets("DNgh") 'ReleaseFor Each SearchCell In CopyRange.Areas 'insert the copied values on the DNgh sheet lDem = wSheet.Rows.Count Set Cols = wSheet.Cells(lDem, SearchCell.Column).End(xlUp).Offset(1, 0) SearchCell.Copy: Cols.PasteSpecial (xlValues)Next SearchCellWith wSheet 'Inserts the underscore in the empty cells J & K of the DNgh sheet LastRow = .Range("B" & Rows.Count).End(xlUp).Row 'Set variable to the specified range .Range("B9:B" & LastRow).Offset(0, 8).Resize(, 2) = "_________"End WithSet wSheet = Nothing 'Release the variable from memoryWith Application .ScreenUpdating = True: .Calculation = xlCalculationAutomaticEnd WithEnd Sub 'END GenerateSht(Ph?n ??c thêm: ??y là ph?n d?ch c?a b?n sinh viên trong ph?n tr? giúp v? ??i t??ng/ph?n t? Application )Application ObjectPh?n t? Application chính là b?n th?n excel. Nó là b?n ch?t c?a m?i ph?n t? trong excel. Ph?n t? Application bao g?m:? Application-wide settings and options (many of the options in the Options dialog box (Tools menu), for example).? Methods that return top-level objects, such as ActiveCell, ActiveSheet, and so on.? Các kh? n?ng thi?t l?p và tùy ch?n th?ng s? phong phú cho ph?n t? (ph?n l?n các tùy ch?n ? trong h?p tho?i Options (menu Tools))? Các ph??ng th?c ?? ch? ??nh các ??i t??ng hi?n hành, nh? ActiveCell, ActiveSheet, v.v.Using the Application ObjectThao tác v?i ph?n t? ApplicationUse the Application property to return the Application object. The following example applies the Windows property to the Application object.S? d?ng các thu?c tính c?a ph?n t? Application ?? thao tác v?i ??i t??ng Application. Trong ví d? sau ta thao tác v?i thu?c tính Windows c?a Application.Application.Windows("book1.xls").ActivateThe following example creates a Microsoft Excel workbook object in another application and then opens a workbook in Microsoft Excel.Còn trong ví d? sau ??y ta t?o ra m?t ??i t??ng workbook c?a Microsoft Excel?Set xl = CreateObject("Excel.Sheet")xl.Application.Workbooks.Open "newbook.xls"RemarksL?u ?Many of the properties and methods that return the most common user-interface objects, such as the active cell (ActiveCell property), can be used without the Application object qualifier. For example, instead of writing Application.ActiveCell.Font.Bold = True, you can write ActiveCell.Font.Bold = True.Có nhi?u thu?c tính và ph??ng th?c ch? ??nh ??n các ??i t??ng th??ng dùng, nh? ??n cell hi?n hành (thu?c tính ActiveCell), các thu?c tính này có th? dùng mà kh?ng c?n t? khóa Application. Ví d?: thay vì vi?t Application.ActiveCell.Font.Bold = True, ta có th? vi?t ActiveCell.Font.Bold = True. Bài 16:T?M HI?U V? PH?N T? APPLICATIONTrong các macro tr??c ??y, chúng ta ?? th?y các c?u l?nh ?? c?p ??n ph?n t? Application, ví d? :PHP Code:1?Application.ScreenUpdating?=?False?2?Vloop?=?Application.VLookup(List,?Rng,?4,?False)??3?Set?myRange?=?Worksheets("Sheet1").Range("A1:C10")?4?answer?=?Application.WorksheetFunction.Min(myRange)?MsgBox?answer??Ph?n t? Application chính là b?n th?n microsoft excel. Nó là bao trùm, là v? tr? c?a m?i ph?n t? trong excel.N?u chúng ta ??m các tính ch?t & ph??ng pháp c?a ph?n t? này thì nhi?u v? k?. ?? tìm hi?u các tính ch?t & ph??ng th?c c?a nó, ta có t?i thi?u 2 cách sau:1./ V? CS (c?a s?) Object Browser.2./ ??n gi?n h?n, sau khi v? CS VBE, ta nh?p t? “Application.”, sau khi ta nh?p d?u ch?m, s? có danh sách ?? xu?ng, ghi h?u h?t các ph??ng th?c & tính ch?t c?a v? tr? excel này.B?i l? do nhi?u quá nh?ng ph??ng th?c & tính ch?t, nên có m?t s? ng??i ?? ph?n lo?i chúng theo các nhóm sau :1* Các tính ch?t & ph??ng th?c toàn c?c (global)?: ?ó là trên 40 tinh ch?t & ph??ng pháp dùng tr?c ti?p, kh?ng c?n dùng t? Application ? tr??c. Chúng ta s? nói k? nhóm này ? phía d??i ;2* Các hàm c?a trang tính; N?u m?t ai ch?a bi?t các hàm này, thì ch?a th? g?i là ?? bi?t v? excel; Chúng ta xem l?i các dòng l?nh 2 & 4 nêu trên. T?i dòng l?nh 2, bi?n Vloop s? ch?a k?t qu? tr? v? c?a hàm VLOOPKUP(). Dòng l?nh 4, bi?n answer s? ch?a giá tr? th?p nh?t trong m?ng giá tr? ???c chúng ta gán tên là myRange?3* Các thi?t ch? cho m?i tr??ng làm vi?c: B?n có th? nh?n {F9} ?? tính toán l?i b?ng tính hi?n hànhPHP Code:5??Worksheets("Sheet1").UsedRange.Columns("A:C").Calculate?6??Application.Calculation?=?xlCalculationManual??(N?u ta c?n di?n d?ch dòng l?nh 5, thì nên ??c t? ph?i qua trái, nh? sau:?Tính l?i c?t A ??n c?t C c?a vùng s? d?ng trên trang tính có tên ‘Sheet1’Cách d? ti?p thu h?t các l?nh lo?i này là ta dùng b? thu macro ?? bi?t m?t s? hành ??ng c?a chúng ta tác ??ng lên trang tính ???c vi?t b?i ng?n ng? VBA là nh? th? nào4* Các th?ng tin v? m?i tr??ng làm vi?c. Excel có kho?ng h?n 30 tính ch?t nh? v?y. Chúng cho ta bi?t các th?ng tin nh? B?n ?ang làm vi?c trong windows hay kh?ng, b?n còn bao nhiêu b? nh? kh? d?ng. . .Ví d?:PHP Code:MsgBox?"Welcome?to?Microsoft?Excel?version?"?&?_??????Application.Version?&?"?running?on?"?&??Application.OperatingSystem?&?"!"?ActiveWorkbook.Windows(1).Caption?=?"Consolidated?Balance?Sheet"?ActiveWorkbook.Windows("Consolidated?Balance?Sheet")?_?????.ActiveSheet.Calculate??5* Các thi?t ??nh v? macro: Ví d? nh? c?u l?nh trên cùng c?a bài, dùng ?? kh?ng thay ??i màn hình khi macro ch?y. ?i?u này r?t c?n thi?t & kh?ng nên quên khi ta ph?i duy?t m?t s? l??ng l?n các record (Tìm m? m?t hàng, h? tên h?c sinh trong m?t c? s? d? li?u l?n. . .). Thêm th?ng báo ? dòng tr?ng thái trong macro sauPHP Code:Sub?Statusbar()??Dim?oldStatusBar,?StrC?As?String??Dim?iDem?As?Integer,?iZ?As?Long,?jW?As?Long????oldStatusBar?=?Application.DisplayStatusBar??Application.DisplayStatusBar?=?True??StrC?=?"************"??For?iZ?=?1?To?60000?????Cells(iZ,?1)?=?iZ?????For?jW?=?1?To?10?^?4?????Next?jW?????If?iZ?Mod?6000?=?0?Then?????????iDem?=?iDem?+?1?????????Application.Statusbar?=?Left(Left(StrC,?iDem)?&?"..........",?10)?????End?If??Next?iZ?????Application.Statusbar?=?False??Application.DisplayStatusBar?=?oldStatusBar?End?Sub??6* Nh?ng tính ch?t & ph??ng th?c khó x?p v? m?t nhóm nào. Nh? ??i ??n v? ?o l??ng, g?i th? ?i?n t?, g?i h? tr? giúp . . .Ví d?:PHP Code:?Application.Help?"OTISAPP.HLP",?65527??Trong cú pháp l?nh này, g?m 2 ??i s? tùy ch?n; ??i s? ??u là tên file tr? giúp; ??i s? sau là ch? m?c c?a file. N?u ta kh?ng ??a ra ch? m?c thì h?p tho?i tr? giúp c?a excel s? hi?n ra!PHP Code:?Worksheets("Sheet1").PageSetup.LeftMargin?=?_?????????Application.InchesToPoints(2.5)?Worksheets("Sheet1").PageSetup.LeftMargin?=?_?????????Application.CentimetersToPoints(5)??Bài 17:C?C T?NH CH?T & PH??NG PH?P TO?N C?C.Trong các c?u l?nh macro, có nh?ng t? có th? ??ng m?t mình, trong khi ?ó c?ng có nh?ng t? c?n ph?i ??ng sau m?t t? khác ch? r? t?p h?p b? m? c?a chúng; Ví d?:PHP Code:MsgBox?Cells.Item(9).Address,?,?Range("B1:C9").Item(3).Address??Trong ví d? trên t?p h?p cha m?, trong tr??ng h?p th? nh?t là toàn b? các ? trên trang tính; trong tr??ng h?p th? hai là 18 ? trên trang tính nào ?ó ?ang ???c kích ho?tWorksheets("Sheet1").Cells.ClearContentsC?u l?nh này dùng ?? xóa toàn b? n?i dung các ? trong trang tính ???c nêu tên.T??ng t? nh? trên, các t? Boder hay Interior, . . . c?ng ph?i ?i kèm v?i cha, m? c?a chúng; kh?ng.th? ??ng riêng m?t mình ???c.Nh?ng c?ng có m?t s? t? có th? ??ng riêng, nh? Selection, WorkBooks, . . .?Sao l?i nh? v?y?Chúng ta ph?i liên t??ng ?? các c?u sau:“ ?ng Ch? Nhà Tr?ng ?? tuyên . . . .”“Ngày mai t?i s? bay t? Hà n?i ??n Pari. . .”? c?u ??u, ta bi?t ngay, ?ó là t?ng th?ng M?; ? c?u hai, ng??i nghe s? bi?t ngay là anh/ch? này ?? có h? chi?u ??n Pháp.?Ta xét tr??ng h?p Selection, nh? sau:?PHP Code:Sub?DongTrongXuongDuoi()?'Assumes?the?list?has?a?heading'??On?Error?Resume?Next?????With?Selection?????????.Sort?Key1:=.Cells(2,?3),?Order1:=xlAscending,?_?????????????Header:=xlYes,?OrderCustom:=1,?MatchCase:=False,?_?????????????Orientation:=xlTopToBottom?????End?With?End?Sub??V?i tr??ng h?p workbooks, ta có ví d? sau:PHP Code:Sub?workbooks_()?Dim?Wh?As?Workbook?For?Each?Wh?In?Workbooks?????If?Wh.Name?<>?ThisWorkbook.Name?Then?????????Wh.Close?savechanges:=True?????End?If?Next?Wh?End?Sub??? tr??ng h?p sau cùng, macro s? ?óng t?t c? các workbooks ?ang m?, ch? tr? workbook có ch?a macro. Và ta ???c bi?t thêm m?t s? ?i?u r?ng,?A*) Ph??ng th?c colse có thêm ??i s? cho nó.?Và n?u kh?ng có ??i s?, nh? trong tr??ng h?pWorkbooks.Close, thì khi excel g?p c?u l?nh này, excel s? ??a ra cho ta h?p tho?i, ?? h?i chúng ta có l?u nh?ng tác ??ng thay ??i c?a chúng ta lên các trang tính hay kh?ng? N?u ch??ng trình chúng ta ch? là m?t m?u c?n con, chúng ta còn có th? nh? & bi?t t?i sao excel l?i làm v?y. Nh?ng n?u chúng ta có m?t macro ?? s?. Khi ?ó chúng ta kh?ng th? bi?t t?i sao excel l?i h?i. ?? kh?i b? b?t ng? trong nh?ng tr??ng h?p nh? v?y, chúng ta nên ch?n cách an toàn nh?t (cho chúng ta c?ng nh? cho nh?ng ng??i s? d?ng sau này!)B*) Ph??ng th?c Close còn tác ??ng lên các c?a s?. ?i?u này giành cho các b?n nghiên c?u th?ng qua ph?n tr? giúp c?a CS VBE trong excel.?N?u chúng ta coi ph?n t? Application là qu? ??t c?a chúng ta, thì Workbooks nh? m?t n??c Nga, hay n??c M? nào ?ó; & Selection nh? n??c Vi?t nam. ? ??y chúng ta ph?i hi?u ng?m r?ng, ngày mai anh bay t? Toky? ??n ??n Hoa th?nh ??n; c?ng là nói ngày mai anh ?y s? bay t? Nh?t b?n sang M? v?y. Nói ??n workbooks là ta ph?i ng?m ??nh ngay nó là t?p h?p con ngay k? v?i t?p h?p Application.Kh?ng bi?t ph?i vì t?m quan tr?ng, hay vì cái gì khác, mà m?t s? ng??i l?i ph?n nhóm nh? cho các tính ch?t & ph??ng pháp toàn c?c này:1*/ Các tính ch?t ?? ch? ??nh: Selection,ThisWorkbook & các tính ch?t ‘Active’, nh? ActiveCell, ActiveSheet, ActiveWindow, ActiveWorkBook ActiveChart, ActiveDialog, ActiveMenuBar, ActivePrinter,. . ..(C?n nói r? r?ng, tính ch?t ThisWorkbook s? ch? ??n b?ng tính có ch?a macro, ch? nó kh?ng yêu c?u b?ng tính này ?ang ???c kích ho?t hay kh?ng)2*/ Các t?p h?p vùng, các ph??ng pháp ph? bi?n nh?t tr? v? ph?n t? vùng, nh? Range, Union, Intersect, Cells, Rows & Columns, . . .Nhóm các ph??ng pháp & thu?c tính này chúng ta ?? ?? c?p t?i bài ??u.3*/ Các t?p h?p trang: Các ph??ng pháp hay tính ch?t tr? v? các t?p h?p trang khác nhau trong b?ng tính, nh? Sheets, Worksheets, Charts, DialogSheets, Modules, Excel4MacroSheets, Excel4IntlMacroSheets, . .?4*/ C?c t?p h?p khác, nh? AddInt, MenuBars, Names, ShortcutMenus, Toolbars, Windows & workbooks, . . .5*/ Các l?nh, c?ng nh? các ph??ng pháp dùng ?? th?c hi?n các vi?c th?ng th??ng, nh? Calculate, Evaluate, Run & Sndkeys; Cùng v?i các l?nh dùng cho DDE (liên k?t d? li?u ??ng). Cái này qu? là cao c?p & xa x? ??i v?i nhi?u ng??i, trong ?ó có t?i!?? k?t lu?n, xin ???c nh?c l?i là, nh?ng tính ch?t & ph??ng pháp toàn c?c này, tuy kh?ng ?i kè v?i Application, nh?ng ?ó là b? ?? ra chúng.?Bài 18:??T TH?A S? CHUNG CHO C?C ?O?N M? T??NG T? NHAU TRONG MACRO.Gi? s? nhi?m v? ?? ra là ta f?i vi?t macro ?? theo d?i vi?c cung c?p hàng hóa t? nhà cung c?p nh? b?ng ???c trích ra nh? sau:?NgayNhaCCMaTenGiaMuaSoLgTtien??1/9/2010Th?mANL?o NL?n45.0005225.000??1/9/2010ThàANL?o NL?n50.00010500.000??2/9/2010HoaATE?o Tr? em30.0005150.000??3/9/2010MyQNLQu?n NL?n60.0005300.000??3/9/2010Th?mQNLQu?n NL?n70.0005350.000??3/9/2010ThàANL?o NL?n50.000150.000???. . .?. .??. . .?C? th? nhi?m v? là c?n bi?t trong 1 ngày nào ?ó hay c? tháng ?ng A hay bà C ?? cung c?p bao nhiêu m?t hàng, ho?c ngày nào ?ó b?t k? có bao nhiêu nhà cung c?p ?? nh?p hàng.K?t qu? th?ng kê này s? cho ra trang tính có tên ‘Phieu’ (trong file ?ính kèm).Mà t?i trang tính này ng??i ta ?? thi?t l?p 2 combobox t?i [C4] & [H4] ?? l?c ch?n nhà cung ?ng hay ngày tháng c? th? nào ?ó c?n kh?o sát.N?u t?i [C4] ?? tr?ng, b?ng k?t qu? th? hi?n toàn th? các nhà cung c?p trong ngày;N?u [H4] ?? tr?ng, b?ng k?t qu? s? là toàn b? s? hàng – ti?n c?a ng??i ?ó ?? cung c?p trong tháng.Macro ?ó có n?i dung nh? sau:PHP Code:Option?Explicit??Dim?Sh?As?Worksheet,?Rng?As?Range,?sRng?As?Range???Private?Sub?Worksheet_Change(ByVal?Target?As?Range)??Dim?NCC?As?Boolean,?Ngay?As?Boolean??Dim?MyAdd?As?String:?????????????????????Dim?Offs?As?Long????'**'????Set?Sh?=?Sheets("PhatSinh"):?????????????Application.ScreenUpdating?=?False?'*'??If?Not?Intersect(Target,?[c4])?Is?Nothing?Then??'Nha?CC'????[B7].Resize(14,?7).ClearContents????If?[c4].Value?=?""?Then?Exit?Sub????Set?Rng?=?Sh.Range(Sh.[B5],?Sh.[B65500].End(xlUp))????If?[H4].Value?=?""?Then?Ngay?=?True????Set?sRng?=?Rng.Find([c4].Value,?,?xlFormulas,?xlWhole)?2?Rem??If?Not?sRng?Is?Nothing?Then?GPE_Copy?[H4],?Ngay???'?????*?????*?????*?????*?????*'???[B7].Resize(99).EntireRow.Hidden?=?False????MyAdd?=?sRng.Address?':??????????????????????????Application.ScreenUpdating?=?False'????Do???????With?[b21].End(xlUp).Offset(1)??????????If?Ngay?Then??'All_?'?????????????.Resize(,?5).Value?=?sRng.Offset(,?0).Resize(,?5).Value????????'0=>Add1'?????????????.Offset(,?5).Resize(,?2).Value?=?sRng.Offset(,?7?+?0).Resize(,?2).Value??????????Else?????????????If?sRng.Offset(,?-1).Value?=?[H4].Value?Then????????????????????'-1=>?Offs;?Cls=>?[H4]'????????????????.Resize(,?5).Value?=?sRng.Offset(,?0).Resize(,?5).Value????????????????.Offset(,?5).Resize(,?2).Value?=?sRng.Offset(,?7?+?0).Resize(,?2).Value?????????????End?If??????????End?If???????End?With???????Set?sRng?=?Rng.FindNext(sRng)????Loop?While?Not?sRng?Is?Nothing?And?sRng.Address?<>?MyAdd??????With?[B99].End(xlUp)???????If?.Row?<?13?Then?Offs?=?15?Else?Offs?=?.Row?+?2????End?With????Range("B99:B"?&?Offs).EntireRow.Hidden?=?True????Set?Sh?=?Nothing?'?????*?????*?????*?????*?????*'??ElseIf?Not?Intersect(Target,?[H4])?Is?Nothing?Then??'Ngày'????[B7].Resize(14,?7).ClearContents????If?[H4].Value?=?""?Then?Exit?Sub????Set?Rng?=?Sh.Range(Sh.[A5],?Sh.[A65500].End(xlUp))????If?[c4].Value?=?""?Then?NCC?=?True????Set?sRng?=?Rng.Find([H4].Value,?,?xlFormulas,?xlWhole)?3?Rem???If?Not?sRng?Is?Nothing?Then?GPE_Copy?[C4],?NCC,?1,?1?'?????*?????*?????*?????*?????*'????[B7].Resize(99).EntireRow.Hidden?=?False????MyAdd?=?sRng.Address:????????????????????????'?????Application.ScreenUpdating?=?False'????Do???????With?[b21].End(xlUp).Offset(1)??????????If?NCC?Then????????????????'All_'?????????????.Resize(,?5).Value?=?sRng.Offset(,?1).Resize(,?5).Value?'1=>Add1'?????????????.Offset(,?5).Resize(,?2).Value?=?sRng.Offset(,?7?+?1).Resize(,?2).Value??????????Else?????????????If?sRng.Offset(,?1).Value?=?[c4].Value?Then?'?Offs=>1;?Cls=>?[C4]'????????????????.Resize(,?5).Value?=?sRng.Offset(,?1).Resize(,?5).Value????????????????.Offset(,?5).Resize(,?2).Value?=?sRng.Offset(,?7?+?1).Resize(,?2).Value?????????????End?If??????????End?If???????End?With???????Set?sRng?=?Rng.FindNext(sRng)????Loop?While?Not?sRng?Is?Nothing?And?sRng.Address?<>?MyAdd????With?[B99].End(xlUp)???????If?.Row?<?13?Then?Offs?=?15?Else?Offs?=?.Row?+?2????End?With????Range("B99:B"?&?Offs).EntireRow.Hidden?=?True????Set?Sh?=?Nothing??'?????*?????*?????*?????*?????*'??End?If?End?Sub??Macro này ?? ?áp ?ng ???c yêu c?u nhi?m v? ?? ra. (Các b?n có th? tr?i nghi?m qua file ?ính kèm ?? kh?ng ??nh ?i?u ?ó).V?y là ?òi h?i ?? ???c ?áp ?ng 1 cách th?a ?áng.Nh?ng v?i chúng ta, nh?ng ng??i s?n sinh ra nh?ng macro ??i lo?i nh? trên thì khoang v?i th?a m?n.Quan sát k? l??ng m?t chút, ta s? th?y macro ch?y cho 1 trong 2 ComBo 1 cách ??c l?p.Có ngh?a là ta ??ng vào combo nào, thì ch? nh?ng dòng l?nh liên quan ??n nó m?i lay ??ng mà th?i.H?n n?a, s? các dòng l?nh trong m?i f?n nhóm là nh? nhau.T? hai nh?n xét trên, ta t? ?? ra nhi?m v? ??t th?a s? chung cho macro này (theo ngh?a ?en c?a toán h?c ??i s?)N?m na là ta có bi?u th?c 2 * Aa + Bb * Aa?Thì ta làm g?n l?i nh? Aa * (2 + Bb) v?y mà.(Có ngh?a là thay vì f?i dùng ??n 4 fép toán ??i s? m?i ra k?t qu? thì ta ch? xài 3 fép th?i(T?i xin d?ng bài này ? ??y vài ngày ?? các b?n nào quan t?m th? s?c xem sao. Các b?n xem k? trong file s? th?y ?áp án)H?n bài sau s? f?n tích k? thêm, cách mà ta g?p th?a s? chung trong macro.Bài 19:??T TH?A S? CHUNG CHO C?C ?O?N M? T??NG T? NHAU TRONG MACRO. (Bài 2).Quan sát n?i dung macro ? bài 1 bên trên, chúng ta d? nh?n ra 4 dòng kh?ng ch?a m? l?nh nào; chúng ch? ch?a 5 d?u sao (*) ? m?i dòng.N?u xem xét k? h?n, ta s? th?y các dòng l?nh gi?a dòng (*) 1 & dòng (*) 2 c?ng g?n b?ng v?i s? dòng l?nh gi?a dòng (*) 3 & 4;Kh?ng nh?ng th?, chúng còn có n?i dung r?t gi?ng nhau trong t?ng dòng.Nhi?m v? bài này s? là: Chúng ta s? vi?t 1 macro thay cho 2 ?o?n m? l?nh mà chúng ta v?a ?? c?p trên.C?ng vi?c này ch?a h?n mang í ngh?a t?ng t?c cho toàn b? ch??ng trình, ? ngh?a c?a vi?c làm này là ? ch?: T?i cùng các b?n ta s? ti?n hành th?c hi?n c?n tr?ng t?ng b??c ?? ??t múc ?ích làm cho macro c?a chúng ta d? s? d?ng & b?o trì trong t??ng laiCác b??c ?ó là:B??c 1./Chép f?n ?o?n I ra 1 macro riêng (t?m g?i là macro con) & ch?nh s?a ?? khi ta thêm dòng l?nh v? macro cha g?i macro con, thì k?t qu? v?n nh? ta th?c hi?n macro cha khi ch?a cho con ? riêng, theo ki?uPHP Code:Sub?MacroB?()??‘?.?.?.?.?.?.?.?.?.?‘‘????*????*????*????*????*’?????(Các?c?u?l?nh?f?n?I)‘????*????*????*????*????*’‘????*????*????*????*????*’?????(Các?c?u?l?nh?f?n?II)‘????*????*????*????*????*’‘.?.?.?.?.?.?.?.?.?.’End?Sub??Tr? thành:PHP Code:Sub?MacroCha()??‘?.?.?.?.?.?.?.?.?.?‘‘????*????*????*????*????*’‘?????(Các?c?u?l?nh?f?n?I)?‘‘????*????*????*????*????*’‘????*????*????*????*????*’?????(Các?c?u?l?nh?f?n?II)‘????*????*????*????*????*’‘.?.?.?.?.?.?.?.?.?.’End?Sub??Code: Sub MacroCon() (Ch?a các c?u l?nh f?n I) ‘<=|’End SubNh? v?y b??c I ta th?c hi?n 2 nhi?m v?:a./ Chép ?o?n m? c?a f?n I sang macro m?i:(Macro con này chúng ta s? cho nó cái tên là GPE_Copy nha các b?n)??u tiên ta ??a con tr? xu?ng dòng tr?ng cu?i cùng c?a trang màn hình ?ang ch?a macro chaPHP Code:Private?Sub?Worksheet_Change(ByVal?Target?As?Range)?‘?..?.?.?.?‘?End?Sub??(d??i dòng End Sub)Ta g? nh?p “Sub GPE_Copy” & {ENTER} ?? ta có ???c sau s? b? sung c?a VBE nh? sau:PHP Code:?Sub?GPE_Copy()End?Sub??Sau ?ó ta ch? vi?c dùng chu?t t? ch?n kh?i các dòng l?n f?n I c?a macro cha & chép v? gi?a 2 dòng l?nh v?a xu?t hi?nSau các thao tác ?ó, chúng ta có k?t qu? nh? sauPHP Code:?Sub?GPE_Copy()11??[B7].Resize(99).EntireRow.Hidden?=?False???MyAdd?=?sRng.Address?':??????????????????????????Application.ScreenUpdating?=?False'13???Do??????With?[b21].End(xlUp).Offset(1)15?????????If?Ngay?Then??'All_?'????????????.Resize(,?5).Value?=?sRng.Offset(,?0).Resize(,?5).Value????????'0=>Add1'17????????????.Offset(,?5).Resize(,?2).Value?=?sRng.Offset(,?7?+?0).Resize(,?2).Value?????????Else19????????????If?sRng.Offset(,?-1).Value?=?[H4].Value?Then????????????????????'-1=>?Offs;?Cls=>?[H4]'???????????????.Resize(,?5).Value?=?sRng.Offset(,?0).Resize(,?5).Value111???????????????.Offset(,?5).Resize(,?2).Value?=?sRng.Offset(,?7?+?0).Resize(,?2).Value????????????End?If113????????End?If??????End?With115??????Set?sRng?=?Rng.FindNext(sRng)???Loop?While?Not?sRng?Is?Nothing?And?sRng.Address?<>?MyAdd?117???With?[B99].End(xlUp)??????If?.Row?<?13?Then?Offs?=?15?Else?Offs?=?.Row?+?2119???End?With???Range("B99:B"?&?Offs).EntireRow.Hidden?=?True121???Set?Sh?=?NothingEnd?Sub???ó là xong nhi?m v? chép th?i; còn nhi?m v? ch?nh s?a n?a m?i là f?n quan tr?ng.?? ti?n trong b??c ti?p theo, t?i ?? ?ánh s? các dòng l?nh nh? các b?n th?y bên trênb./ Ch?nh s?a macro con.(N?u ??n th?i ?i?m này mà ta :- Thêm dòng l?nh g?i macro con này t? ngay tr??c f?n I macro cha- V? hi?u hóa toàn b? các dòng l?nh f?n I c?a macro chavà ti?n hành thao tác ?? ch?y macro cha ( C? th? thay ??i [C4] ? trang tính ‘Phieu’) ta s? b? báo l?i.)Chuy?n ?ó là ???ng nhi?n theo các l? sau:Ta ch?a khai báo bi?n nào cho macro con (Vì trên cùng ta có dòng Option Explicit & dòng l?nh 12 ta xài bi?n MyAdd ch?a khai báo ch?ng h?n)Thêm n?a, trong dòng l?nh 16 ta có xài bi?n ki?u Range sRng, mà trên ch??ng trình cha ta ?? khai báo. & gán cho nó là ? ch?a k?t qu? tìm ???c trong bi?n Rng.Nh? v?y ta có th? ??a khai báo sRng này làm tài s?n chung cho 2 macro cha & con.V?n ?? n?a, ?ó là t?i dòng 15 ta ra ?i?u ki?n ch?a trong bi?n Ngay ki?u Yes/No. Nh? v?y ch??ng trình con c?n f?i bi?t t?i th?i ?i?m ?ó bi?n Ngay là Yes hay No ?? mà ?ng x? cho ?úng. Có ngh?a là tham bi?n này f?i ???c truy?n t? ch??ng trình cha sang cho ch??ng trình con.Tóm l?i: Ta c?n rà soát t?ng dòng l?nh ??:(*) Khai báo bi?n dùng chung trong 1 s? tr??ng h?p(*) Truy?n tham bi?n t? ch??ng trình cha cho ch??ng trình con, ?? anh con này làm ???c ?úng yêu c?u;(*) Khai báo thêm 1 s? bi?n fát sinh, n?u c?n?Ta ti?n hành ki?m theo t?ng dòng l?nh m?t:D11: Kh?ng fát sinh, vì ta ?ang thao tác trên trang tính hi?n hành;D12 Bi?n MyAdd nên là 1 bi?n cha & con cùng dùng (Có ngh?a là ta s? f?i khai báo 1 bi?n dùng chung trong toàn module);(Hai dòng 13 & 14) kh?ng có v?n ?? gì. . . - cho qua)D15, Tham bi?n Ngay c?n ???c truy?n t? cha sang con; Nh?ng ??n ch??ng trình con nó có th? mang tiên khác chút; ?ó là t?i dùng tiên All_ trong ch??ng trình con;D16 & D17: Tham bi?n sRng xài chung nh? MyAdd;D19 ? [H4] hi?n ch?a có ván ??; H?n bài sau s? fát sinh v?n ??;T? ??y cho ??n dòng 117 s? là 1 trong nh?ng tr??ng h?p ta ?? xét; Các b?n t? xuy lu?n giúp.D118: Bi?n Offs ta có th? khai báo dùng chung, nh?ng ti?t ki?m tài nguyên 1 chút, ta s? khai báo thêm t?i ch??ng trình con.?V?i t?t c? nh?ng gì chúng ta v?a l?p lu?n, ta ?? ra 2 macro cha & con có nh?ng n?i dung nh? sau:PHP Code:Option?Explicit?Dim?Sh?As?Worksheet,?Rng?As?Range,?sRng?As?Range?Private?Sub?Worksheet_Change(ByVal?Target?As?Range)?Dim?NCC?As?Boolean,?Ngay?As?Boolean?Dim?MyAdd?As?String:?????????????????????Dim?Offs?As?Long????'**'??Set?Sh?=?Sheets("PhatSinh"):?????????????Application.ScreenUpdating?=?False?'*'?If?Not?Intersect(Target,?[c4])?Is?Nothing?Then??'Nha?CC'???[B7].Resize(14,?7).ClearContents???If?[c4].Value?=?""?Then?Exit?Sub???Set?Rng?=?Sh.Range(Sh.[B5],?Sh.[B65500].End(xlUp))???If?[H4].Value?=?""?Then?Ngay?=?True???Set?sRng?=?Rng.Find([c4].Value,?,?xlFormulas,?xlWhole)2?Rem??If?Not?sRng?Is?Nothing?Then?GPE_Copy?[H4],?Ngay??'?????*?????*?????*?????*?????*'??[B7].Resize(99).EntireRow.Hidden?=?False???MyAdd?=?sRng.Address?':??????????????????????????Application.ScreenUpdating?=?False'???Do??????With?[b21].End(xlUp).Offset(1)?????????If?Ngay?Then??'All_?'????????????.Resize(,?5).Value?=?sRng.Offset(,?0).Resize(,?5).Value????????'0=>Add1'????????????.Offset(,?5).Resize(,?2).Value?=?sRng.Offset(,?7?+?0).Resize(,?2).Value?????????Else????????????If?sRng.Offset(,?-1).Value?=?[H4].Value?Then????????????????????'-1=>?Offs;?Cls=>?[H4]'???????????????.Resize(,?5).Value?=?sRng.Offset(,?0).Resize(,?5).Value???????????????.Offset(,?5).Resize(,?2).Value?=?sRng.Offset(,?7?+?0).Resize(,?2).Value????????????End?If?????????End?If??????End?With??????Set?sRng?=?Rng.FindNext(sRng)???Loop?While?Not?sRng?Is?Nothing?And?sRng.Address?<>?MyAdd????With?[B99].End(xlUp)??????If?.Row?<?13?Then?Offs?=?15?Else?Offs?=?.Row?+?2???End?With???Range("B99:B"?&?Offs).EntireRow.Hidden?=?True???Set?Sh?=?Nothing'?????*?????*?????*?????*?????*'?ElseIf?Not?Intersect(Target,?[H4])?Is?Nothing?Then??'Ngày'???[B7].Resize(14,?7).ClearContents???If?[H4].Value?=?""?Then?Exit?Sub???Set?Rng?=?Sh.Range(Sh.[A5],?Sh.[A65500].End(xlUp))???If?[c4].Value?=?""?Then?NCC?=?True???Set?sRng?=?Rng.Find([H4].Value,?,?xlFormulas,?xlWhole)3?Rem???If?Not?sRng?Is?Nothing?Then?GPE_Copy?[C4],?NCC,?1,?1'?????*?????*?????*?????*?????*'31???[B7].Resize(99).EntireRow.Hidden?=?False???MyAdd?=?sRng.Address:????????????????????????'?????Application.ScreenUpdating?=?False'33???Do??????With?[b21].End(xlUp).Offset(1)35?????????If?NCC?Then????????????????'All_'????????????.Resize(,?5).Value?=?sRng.Offset(,?1).Resize(,?5).Value?'1=>Add1'37????????????.Offset(,?5).Resize(,?2).Value?=?sRng.Offset(,?7?+?1).Resize(,?2).Value?????????Else39????????????If?sRng.Offset(,?1).Value?=?[c4].Value?Then?'?Offs=>1;?Cls=>?[C4]'???????????????.Resize(,?5).Value?=?sRng.Offset(,?1).Resize(,?5).Value301???????????????.Offset(,?5).Resize(,?2).Value?=?sRng.Offset(,?7?+?1).Resize(,?2).Value????????????End?If303?????????End?If??????End?With305??????Set?sRng?=?Rng.FindNext(sRng)???Loop?While?Not?sRng?Is?Nothing?And?sRng.Address?<>?MyAdd307???With?[B99].End(xlUp)??????If?.Row?<?13?Then?Offs?=?15?Else?Offs?=?.Row?+?2309???End?With???Range("B99:B"?&?Offs).EntireRow.Hidden?=?True311???Set?Sh?=?Nothing?'?????*?????*?????*?????*?????*'?End?IfEnd?Sub??(B? sung s? cho các dòng l?nh t? 31. . 311 ngày 19/09/2010)Code:Sub GPE_Copy(Cls As Range, All_ As Boolean, Optional Offs As Integer = -1, Optional Add1 As Byte) Dim MyAdd As String [B7].Resize(99).EntireRow.Hidden = False MyAdd = sRng.Address: Application.ScreenUpdating = False Do With [b21].End(xlUp).Offset(1) If All_ Then .Resize(, 5).Value = sRng.Offset(, Add1).Resize(, 5).Value .Offset(, 5).Resize(, 2).Value = sRng.Offset(, 7 + Add1).Resize(, 2).Value Else If sRng.Offset(, Offs).Value = Cls.Value Then .Resize(, 5).Value = sRng.Offset(, Add1).Resize(, 5).Value .Offset(, 5).Resize(, 2).Value = sRng.Offset(, 7 + Add1).Resize(, 2).Value End If End If End With Set sRng = Rng.FindNext(sRng) Loop While Not sRng Is Nothing And sRng.Address <> MyAdd With [B99].End(xlUp) If .Row < 13 Then Offs = 15 Else Offs = .Row + 2 End With Range("B99:B" & Offs).EntireRow.Hidden = True Set Sh = NothingEnd Sub? ??y ta dùng tham s? Cls thay cho [H4]; & ta b? t? khóa ‘Rem’ t?i dòng l?nh mang s? 2 là & thêm dòng l?nh?PHP Code:Exit?Sub??k? d??i dòng này n?a (Dòng l?nh ta v?a b? ch? Rem) là m?i chuy?n tr? nên m? m?n.B?y gi? ta có th? ch?y macro cha; ??n lúc c?n, macro cha s? g?i macro con ch?y ti?p s?c cho ??n k?t qu? khi ta ch?n khách hàng trong ? [C4]Còn n?u ta ch?n ngày nh?p hàng t?i [H4] Ch? có macro cha ch?y 1 m?cch cho ??n k?t qu? cu?i cùng mà th?i.(S? có b?n th?c m?c: Làm chio cho f?c t?p v?y? Nh? c? ?? kh?ng t?t r?i sao!")C?u nghi v?n này s? ???c tr? l?i ? nh?ng bài sau.Bài 20:??T TH?A S? CHUNG CHO C?C ?O?N M? T??NG T? NHAU TRONG MACRO. (Bài 3)? bài 2, chúng ta ta vi?t l?i macro con, mà th?c t? nó ???c chép t? kh?i I c?a macro cha. Lúc ?ó macro con s? ???c s?a l?i ?? làm nhi?m v? thay cho kh?i l?nh I ?? b? v? hi?u hóa sau ?ó.Nhi?m v? c?a ta bài này s? là bi?n macro con này làm f?n vi?c c?a kh?i l?nh II (N?m gi?a 2 dòng ch?a 5 d?u sao 3 & 4 mà ta ?? ?? c?p ? bài 2 nêu trên.)?? ti?n cùng nhau trao ?? th?ng tin, t?i xin fép ?ánh s? các dòng l?nh ? kh?i II c?a macro cha ( ?o?n m? g?n cu?i bài 2) & (các dòng l?nh c?a macro con ?? ???c gán s? nh? f?n ??u bài 2). H?n n?a, các dòng l?nh trong macro con ??u b?t ??u t? s? 1; Còn các dòng l?nh trong kh?i l?nh II ta ?? b?t ??u b?i s? 3.B?y gi? ta c?n ??i chi?u t?ng c?p dòng l?nh gi?a 2 kh?i này.; Nh?ng ?? ti?t ki?m th?i gian c?ng nh? có d?p ?i s?u v? các dòng l?nh khác bi?t nhau, cho fép t?i kh?ng nói l?i nh?ng dòng l?nh g?n gi?ng h?t nhau c? v? cú fáp c?ng nh? k?t qu? th?c hi?n chúng.Ta ?i v? dòng 35 có n?i dung: If NCC Then (& t??ng ?ng v?i nó là dòng 14 If Ngay Then)Nh? cu?i bài 2 ta th?y, khi g?i macro con, chúng ta ?? truy?n cho nó tham s? NgayThì dòng l?nh g?i macro con thay cho kh?i II c?ng s? truy?n cho macro con tham bi?n NCC;?Nh?ng khi ??n macro con này, nó có th? mang 1 tên khác, ch?ng h?n All_ nh? b?n s? th?y. T?t nhiên, nó v?n có th? gi? nguyên tên là Ngay, nh?ng nh? v?y ta t? làm khó ta vì d? làm ta t?u h?a nh?p ma lúc nào ?ó & l?n tùng xèn kh?ng ?áng có.Trong các dòng l?nh t? sau dòng 35 này cho ??n dòng 306, bi?n sRng c?a kh?i c?ng xu?t hi?n trong kh?i các dòng l?nh I.Nh? v?y, có ngh?a là ta c?n khai báo bi?n sRng dùng chung cho 2 macro cha & con.?? v?y, chúng ta khai báo bi?n sRng ch? ngay sau dòng l?nh Option Explicit c?a module ch?a c? hai macro. (Macro con ?? lu?n trong macro s? ki?n c?a trang tính ‘Phieu’)Tuy nhiên c?ng c?n m? ngo?t thêm ch? này ?? cùng r? h?n:Vì tr??c kh?i l?nh I vùng Rng ?? tìm ki?m ???c gán cho các ??Sh.Range(Sh.[B5], Sh.[B65500].End(xlUp))?Nh?ng tr??c kh?i l?nh II, vùng Rng l?i là?Sh.Range(Sh.[A5], Sh.[A65500].End(xlUp))?Nên sRng là ? tìm th?y t??ng ?ng v?i 2 vùng trên s? khác c?t nhau.?B?i l? ?ó các giá tr? c?n gán v? form c?a trang tính ‘Phieu’ (vùng t? B7: H99) s? t??ng ?ng khác nhau v? c?t trong 2 ?o?n m? gi?a kh?i I & kh?i II?? c? th? h?n, ta xét tr??ng h?p m? hàng c?n ?i?n v? c?t ‘C’ c?a trang tính ‘Phieu’Tr??ng h?p ?ng v?i kh?i dòng l?nh I, ta c?n tìm tên các nhà cung c?p có t?i c?t ‘B’ c?a trang tính ‘PhatSinh’, thì m? hàng là c?t li?n k? bên f?i so v?i ? ???c tìm th?y trên ‘B’;Nh?ng tr??ng h?p II thì ta tìm ngày nh?p (? c?t ‘A’ trên trang ‘PhatSinh’), lúc ?ó m? hàng là ? cách ? sRng tím th?y 1 c?t.Qua ?ó chúng ta c?ng s? th?y các tr? c?n gán v? form s? khác c?t v?i nhau 1 cách t??ng ?ng khi macro th?c hi?n các c?u l?nh trong kh?i I & kh?i II.Qua thí d? ?i?n hình này, chúng ta s? rút ra k?t lu?n, là c?n cung c?p cho macro con trong tr??ng h?p II các th?ng s? v? ?? l?nh c?t gi?a l?n chép I & l?n chép II;?Nh?ng vi?c cung c?p này s? ???c m?c ??nh 1 tr? t? l?nh g?i (dòng l?nh s? 2) b?ng t? khóa Optional trong f?n ??u c?a ch??ng trình con. (Còn g?i macro con t? dòng l?nh 3 c?a macro cha s? f?i cung c?p tham s? ??y ??).M?nh ???Optional Add1 As Byte?nói lên r?ng: Tham s? Add1 có th? ???c truy?n, thì s? là tr? s? ???c truy?n, n?u kh?ng ???c truy?n thì tham s? ?ó b?ng 0 m?t cách m?c ??nh?ó là chúng ta m?i nói ??n tham s? có tên Add1 (Xem trong macro GPE_Copy); Còn 1 tham s? ???c truy?n t? cha sang con n?a, ?ó là Offs. ( H?n n?a, n?u kh?ng ???c truy?n, tham s? này m?c ??nh là -1)Ta s? xét k? thêm v? nó:?? v?y, chúng ta xét t? xu?t fát ?i?m c?a ta là ?i tìm ngày nh?p hàng c? th? nào ?ó c?a 1 NCC (nhà cung c?p) c? th? nào ?ó. Mà ta bi?t r?ng, ta có nhi?u NCC cung ?ng hàng nhi?u l?n trong tháng, th?m chí cung ?ng nhi?u l?n trong ngày n?a & trong 1 ngày có th? có nhi?u NCC nh?p hàng. Bên trang CSDL d? li?u v? NCC ???c l?u ? c?t ‘B’ còn ngày nh?p hàng ghi ? c?t ‘A’Khi áp d?ng f??ng th?c tìm ki?m 1 ngày nào ?ó, thì macro s? l?c ra DS (danh sách) NCC h?m ?ó; Nhi?m v? ti?p theo là trong DS này, ta f?i l?a ra 1 khách hàng ta c?n mà th?i. T?t c? ?i?u này liên quan ??n kh?i l?nh tìm theo ngày;Còn kh?i l?nh tìm theo khách hàng cung ?ng hàng trong tháng thì ng??c l?i chút ??nh: Ta s? l?c ra t? DS các ngày trong tháng mà khách hàng này cung c?p hàng ?? ch?n ra ngày c? th? theo yêu c?u t?i ? [H4]Nói n?m na là tr??ng h?p ??u t? c?t ‘A’ ta tìm sang ‘B’ & ng??c l?i, tr??ng h?p sau ta f?i t? DS c?a c?t ‘B’ s?u truy sang c?t ‘A’Vi?c này s? f?i nh? ??n bi?n Offs (?? nó offset(,-1) hay Offset(,1) giúp ta trong tr??ng h?p c? th? g?i macro con t? dòng l?nh 2 hay t? dòng l?nh 3 t? macro cha)N?u các b?n s?u tra thêm v? tham s? Offs này, các b?n quan t?m ??n nó ?ang trong vòng l?p Do . . . Loop mà th?i. (Còn d??i vòng l?p ?ó ch?ng qua là t?n dùng ?? làm vi?c khác mà kh?i khai báo thêm bi?n.)K?t qu? c?a vi?c làm c?a chúng ta qua 3 bài là nh? th? này:Macro cha:PHP Code:Option?Explicit?Dim?Sh?As?Worksheet,?Rng?As?Range,?sRng?As?Range?Private?Sub?Worksheet_Change(ByVal?Target?As?Range)?Dim?NCC?As?Boolean,?Ngay?As?Boolean?Dim?MyAdd?As?String:?????????????????????Dim?Offs?As?Long????'**'??Set?Sh?=?Sheets("PhatSinh"):?????????????Application.ScreenUpdating?=?False?'*'?If?Not?Intersect(Target,?[C4])?Is?Nothing?Then??'Nha?CC'???[B7].Resize(14,?7).ClearContents???If?[C4].Value?=?""?Then?Exit?Sub???Set?Rng?=?Sh.Range(Sh.[B5],?Sh.[B65500].End(xlUp))???If?[H4].Value?=?""?Then?Ngay?=?True???Set?sRng?=?Rng.Find([C4].Value,?,?xlFormulas,?xlWhole)2??If?Not?sRng?Is?Nothing?Then?GPE_Copy?[H4],?Ngay?ElseIf?Not?Intersect(Target,?[H4])?Is?Nothing?Then??'Ngày'???[B7].Resize(14,?7).ClearContents???If?[H4].Value?=?""?Then?Exit?Sub???Set?Rng?=?Sh.Range(Sh.[A5],?Sh.[A65500].End(xlUp))???If?[C4].Value?=?""?Then?NCC?=?True???Set?sRng?=?Rng.Find([H4].Value,?,?xlFormulas,?xlWhole)3??If?Not?sRng?Is?Nothing?Then?GPE_Copy?[C4],?NCC,?1,?1?End?IfEnd?Sub??Còn ??y là macro con (n?m lu?n trong c?a s? VBE s? ki?n này lu?n):Code:Sub GPE_Copy(Cls As Range, All_ As Boolean, Optional Offs As Integer = -1, Optional Add1 As Byte) Dim MyAdd As String [B7].Resize(99).EntireRow.Hidden = False MyAdd = sRng.Address: Application.ScreenUpdating = False Do With [b21].End(xlUp).Offset(1) If All_ Then .Resize(, 5).Value = sRng.Offset(, Add1).Resize(, 5).Value .Offset(, 5).Resize(, 2).Value = sRng.Offset(, 7 + Add1).Resize(, 2).Value Else If sRng.Offset(, Offs).Value = Cls.Value Then .Resize(, 5).Value = sRng.Offset(, Add1).Resize(, 5).Value .Offset(, 5).Resize(, 2).Value = sRng.Offset(, 7 + Add1).Resize(, 2).Value End If End If End With Set sRng = Rng.FindNext(sRng) Loop While Not sRng Is Nothing And sRng.Address <> MyAdd With [B99].End(xlUp) If .Row < 13 Then Offs = 15 Else Offs = .Row + 2 End With Range("B99:B" & Offs).EntireRow.Hidden = True Set Sh = NothingEnd Sub (Ch?c bài này s? khó hi?u & g?y khó ch?u v?i nhi?u b?n; Xin l?i vì s? di?n ??t kém c?a mình. S? c? g?ng theo d?i, b? sung hay s?a ch?a khi nh?n ???c góp í t? b?n ??c - R?t c?m ?n!)B?I 21:B?I T?P ??T TH?A S? CHUNG CHO C?C ?O?N M? T??NG T? NHAU TRONG MACRO.Chúng ta có macro sau (ngu?n:=??)PHP Code:?Option?ExplicitDim?Sh?As?Worksheet:????????????????????????Dim?eRw?As?LongPrivate?Sub?Worksheet_Change(ByVal?Target?As?Range)?Dim?WF,?Cls?As?Range,?Rng?As?Range?Dim?lRs?As?Long,?Jj?As?Byte??Set?WF?=?Application.WorksheetFunction?Set?Rng?=?Sh.[B6].Resize(eRw,?10)?[b1:B99].EntireRow.Hidden?=?False1?'Xu?Lí?Vói?Tháng?Nam:'?If?Not?Intersect(Target,?[e3])?Is?Nothing?Then????[b20].CurrentRegion.Offset(3,?1).ClearContents11?'Xu?L??Vói?Tùng?Tháng?Cu?The?Trong?Nam:'????If?Target.Value?<>?"All"?Then????????With?[B99].End(xlUp).Offset(1)????????????.Value?=?"'"?&?Right("0"?&?[e3].Value,?2)?&?"/"?&?[G3].Value5????????????.Offset(,?5).Value?=?WF.DSum(Rng,?Sh.[g6],?Sh.[AA1].Resize(2,?2))????????????.Offset(,?6).Value?=?WF.DSum(Rng,?Sh.[H6],?Sh.[AA1].Resize(2,?2))????????????.Offset(,?7).Value?=?WF.DSum(Rng,?Sh.[I6],?Sh.[AA1].Resize(2,?2))????????End?With12?'Xu?Lí?Vói?Toàn?Bo?Các?Tháng?Trong?Nam'????Else????????Sh.[ac1].Value?=?"Th"????????For?Jj?=?1?To?12????????????Sh.[ac2].Value?=?Jj????????????With?[B99].End(xlUp).Offset(1)????????????????.Value?=?"'"?&?Right("0"?&?Sh.[ac2].Value,?2)?&?"/"?&?[G3].Value6????????????????.Offset(,?5).Value?=?WF.DSum(Rng,?Sh.[g6],?Sh.[Ab1].Resize(2,?2))????????????????.Offset(,?6).Value?=?WF.DSum(Rng,?Sh.[H6],?Sh.[Ab1].Resize(2,?2))????????????????.Offset(,?7).Value?=?WF.DSum(Rng,?Sh.[I6],?Sh.[Ab1].Resize(2,?2))????????????End?With????????Next?Jj????End?If????Range([b11].End(xlDown).Offset(2),?[B98]).EntireRow.Hidden?=?True2?'Xu?L??Vói?Ten?Dói?Tác:'?ElseIf?Not?Intersect(Target,?[e4])?Is?Nothing?Then????[b20].CurrentRegion.Offset(3,?1).ClearContents????Sh.[ac1].Value?=?Sh.[d6].Value21?'Xu?L??Voi?Tùng?Dói?Tác:'????If?Target.Value?<>?"All"?Then????????Sh.[ac2].Value?=?[G4].Value????????If?[e3].Value?<>?"All"?Then????????????With?[B99].End(xlUp).Offset(1)????????????????.Value?=?"'"?&?Right("0"?&?[e3].Value,?2)?&?"/"?&?[G3].Value????????????????.Offset(,?2).Value?=?[G4].Value????????????????.Offset(,?3).Value?=?[e4].Value7????????????????.Offset(,?5).Value?=?WF.DSum(Rng,?Sh.[g6],?Sh.[AA1].Resize(2,?3))????????????????.Offset(,?6).Value?=?WF.DSum(Rng,?Sh.[H6],?Sh.[AA1].Resize(2,?3))????????????????.Offset(,?7).Value?=?WF.DSum(Rng,?Sh.[I6],?Sh.[AA1].Resize(2,?3))????????????End?With????????Else????????????Sh.[ad1].Value?=?"Th"????????????For?Jj?=?1?To?12????????????????Sh.[ad2].Value?=?Jj????????????????With?[B99].End(xlUp).Offset(1)????????????????????.Value?=?"'"?&?Right("0"?&?Jj,?2)?&?"/"?&?[G3].Value????????????????????.Offset(,?2).Value?=?[G4].Value????????????????????.Offset(,?3).Value?=?[e4].Value8????????????????????.Offset(,?5).Value?=?WF.DSum(Rng,?Sh.[g6],?Sh.[Ab1].Resize(2,?3))????????????????????.Offset(,?6).Value?=?WF.DSum(Rng,?Sh.[H6],?Sh.[Ab1].Resize(2,?3))????????????????????.Offset(,?7).Value?=?WF.DSum(Rng,?Sh.[I6],?Sh.[Ab1].Resize(2,?3))????????????????End?With????????????Next?Jj????????End?If22?'Xu?L??Vói?Tát?Ca?Các?Dói?Tác:'????Else????????Dim?Nam?As?String,?Crit?As?Range?????????If?[e3].Value?<>?"All"?Then????????????Set?Crit?=?Sh.[AA1].Resize(2,?3)????????????Nam?=?Right([C3].Value,?5)?&?"?"?&?[e3].Value?&?"/"?&?[G3].Value????????Else????????????Set?Crit?=?Sh.[Ab1].Resize(2,?2)????????????Nam?=?Right([b11].Value,?3)?&?"?"?&?[G3].Value????????End?If????????For?Each?Cls?In?Sheets("DKien").Range("MaDT").SpecialCells(xlCellTypeConstants,?2).Offset(1)????????????If?Cls.Value?=?"All"?Then?Exit?For????????????Sh.[ac2].Value?=?Cls.Value????????????With?[B99].End(xlUp).Offset(1)????????????????.Value?=?Nam????????????????.Offset(,?2).Value?=?Cls.Value????????????????.Offset(,?3).Value?=?Sheets("DKien").Range("MaDT").?_????????????????????Find(Cls.Value,?,?xlFormulas,?xlWhole).Offset(,?-1).Value9????????????????.Offset(,?5).Value?=?WF.DSum(Rng,?Sh.[g6],?Crit)????????????????.Offset(,?6).Value?=?WF.DSum(Rng,?Sh.[H6],?Crit)????????????????.Offset(,?7).Value?=?WF.DSum(Rng,?Sh.[I6],?Crit)????????????End?With????????Next?Cls????End?If????Range([b11].End(xlDown).Offset(2),?[B98]).EntireRow.Hidden?=?True?End?IfEnd?Sub??Quan sát macro ta th?y 3 dòng l?nh k? ti?p c?a các dòng l?nh ???c ?ánh s? t? 5 ??n 9 có c?u trúc na ná nhau;Nhi?m v? ?? ra là ta th? g?p chúng v? 1 macro con nh? cách thúc mà các bài 1 ??n 3 v? ??t th?a s? chung mà ta ?? xét qua.(T?t nhiên b?n có th? tham kh?o cách làm c?a bài ti?p sau trong topic ?ó)? ................
................

In order to avoid copyright disputes, this page is only a partial summary.

Google Online Preview   Download