118
. . . . . . . . . . . . . . PHẦN MỞ ĐẦU Microsoft 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ất 1. Bộ thu macro Ngô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 tay Khi 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

autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

  • Upload
    others

  • View
    1

  • Download
    0

Embed Size (px)

Citation preview

Page 1: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

. . . . . . . . . . . . . . PH N M Đ UẦ Ở Ầ

Microsoft 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 tữ ơ ả ấ

1. B thu macroộ

Ngô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 tayạ ầ

Khi 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 macroạ

Vô 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. ể ở ề

Page 2: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 macroổ ợ ắ

Vô 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+Fấ ế ư ậ ổ ợ

Chú ý: 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 Macroộ ạ

3. 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 ậ

Page 3: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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.Merge

End Sub

Cá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()

Page 4: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 iấ ư ạ

Ti 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+D

1 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 Sub

Nh 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

Page 5: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 sauế ụ ể ế ư

Code:

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 Sub

Nh 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:ậ ủ

Page 6: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

+ 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 & 2ạ ộ ắ ầ ừ ậ ươ ứ

T 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à 100ạ ộ ế ậ ạ ộ ậ

Hã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 iọ ộ ạ

Bài đ c thêm ọ Xem t i đâyạ

Bài 2: Nh ng macro ph c t p h nữ ứ ạ ơ

1. Tăng đ ng lo t ti n th ng cho m t danh sáchồ ạ ề ưở ộ

G 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 Fạ ố ắ ộ ữ ệ ộ ộ

Ta thu đ c macro có n i dung sau (đã thu g n các dòng l nh ng n):ượ ộ ọ ệ ắ

Page 7: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lê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 Sub

2. 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 String

T 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]*" & strc

Cu i cùng ta s a l i dòng l nh k ti p tr thành:ố ử ạ ệ ế ế ở

Selection.FormulaR1C1 = strc

Khi đó 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

Page 8: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 Sub

Chú ý:

* 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 255ể ể ố ề ị ừ ế

Ki u Boolean: là ki u logic, lo i này ch nh n m t trong hai giá tr : True & Falseể ể ạ ỉ ậ ộ ị

Ki u Integer: S nguyên, mi n giá tr t -32768 đ n 32767ể ố ề ị ừ ế

Ki u Long: Cũng là s nguyên có mi n l n h n: -2.147.483.648 đ n 2.147.483.647ể ố ề ớ ơ ế

Ki 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, ướ ạ ớ ự ệ ệ ắ ể ạ ỏ

Page 9: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 tị ộ ộ

Ta 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

Page 10: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

ActiveCell.FormulaR1C1 = "=SUM(R[-17]C:R[-1]C)"

Range("F24").Select

End Sub

Hã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 đ iể ộ ệ ố ươ ố

Ta xem xét đ n câu l nh Range("F23").Select & câu l nh Range("F24").Selectế ệ ệ

Trong 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 tộ

Trong 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à – B5ặ ạ ộ ộ ầ ữ

Cu i cùng s là ô B1 n u ta mu n! ố ẻ ế ố

Code:

Sub DiChuyen()

Range("B2").Select

Page 11: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Selection.End(xlDown).Select

Selection.End(xlDown).Select

Selection.End(xlDown).Select

Selection.End(xlUp).Select

Selection.End(xlUp).Select

Selection.End(xlUp).Select

End Sub

Có 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 sauầ ệ ứ ấ ậ ệ

dim 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 Subị ặ ạ ệ ở ấ ả ệ ướ ụ ừ

Th c hi n biên d ch Sub nh đã nêu & cho ch y l i macroự ệ ị ư ạ ạ

Tr 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 ầ ớ ằ ở ề ườ ợ ụ

Page 12: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 macroố

Ta 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 Sub

Hay

Code:

Sub Tinh_Thuong(). . . ... . . .

DiChuyen

End Sub

t 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 uạ ẩ ệ ộ ứ ữ ệ

3./ 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 iự ệ ệ ặ ạ

1./ 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 c 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 ộ ố ườ ữ ệ ụ ế ố ọ

Page 13: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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à ặ ToMau

Sau 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 Sub

Trong 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ì ch 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 í!ố ạ ạ ố

Page 14: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

2./ Ch cho macro bi t l a ch nỉ ế ự ọV n đ nêu ra là macro ph i bi t tô màu nào ng v i giá tr ch a trong ô đó; 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 đâyậ ệ ướ

Code:

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 này nó còn ch a đ c nhi u th khác n a.ộ ớ ả ề ơ ứ ượ ề ứ ữ

2. Ta có th ghi s vô đ u m i câu l nh, đ cho máy cũng nh ta nh n bi t đi u này.ể ố ầ ỗ ệ ể ư ậ ế ề

3./ Vòng l p For . . .NextặĐ macro có th th c hi n chu trình l p l i, ta s d ng m t c u trúc t o vòng l p t câu l nh dòng 2 ể ể ự ệ ặ ạ ử ụ ộ ấ ạ ặ ừ ệđ n dòng 23; Trong m t l n l p, macro sẽ làm nh ng vi c sau: L y giá tr trong ô đ tính ra tháng ế ộ ầ ặ ữ ệ ấ ị ểsinh nh t; tô màu n n ng v i tháng tìm đ c.ậ ề ứ ớ ượTrong c u trúc này kh i các câu l nh trong vòng l p bình th ng sẽ th c hi n theo s l n đã xác ấ ố ệ ặ ườ ự ệ ố ầđ nh; mà c th đây là (999 – 6) l n. Tuy nhiên t i câu l nh s 6, ng i ta n đ nh đi u ki n n u ị ụ ể ở ầ ạ ệ ố ườ ấ ị ề ệ ếtrong ô không ch a giá tr sẽ thoát vòng l p. /(/h v y, thay vì l p l i nh ng tính toán vô nghĩa, máy ứ ị ặ ư ậ ặ ạ ữsẽ thoát ra ngay đúng lúc. Và các b n sẽ ti t ki m r t nhi u tài nguyên m t khi d li u chúng ta đang ạ ế ệ ấ ề ộ ữ ệít.Trong excel chúng ta cũng đã th y bóng dáng vòng l p này trong hàm =FACT(Num); ấ ặ

Page 15: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Cú pháp đ y đ c a vòng l p ầ ủ ủ ặ For . . . Next nh sau:ư

Code:

For Counter = First To last [Step step] (statements) [Exit for] (statements)Next [Counter]

Trong đó, các t tô đ m là t khóa c a VBA, nh ng t khóa mà VBA giành quy n s d ng thì ta nên ừ ậ ừ ủ ữ ừ ề ử ụtránh càng xa càng t t, n u không mu n b báo l i xâm ph m ch quy n.ố ế ố ị ỗ ạ ủ ề

Counter là m t bi n đ m, (trong VD chúng ta là ij) tùy ph m vi vòng l p mà ta khai báo ki u d li u ộ ế ế ạ ặ ể ữ ệc a bi n này cho h p lẽ.ủ ế ợFirst là giá tr ban đ u c a b đ m; còn last là cu i; Nh ng nên bi t r ng cu i ch a ch c là l n, vì có ị ầ ủ ộ ế ố ư ế ằ ố ư ắ ớnh ng ng i, nh ng lú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 í tr c tiên bi n iZ ph i đ c khai báo nh sau: Dim iZ As LongỞ ư ướ ế ả ượ ư

Còn trong ví d , bi n iZ không đ c khai báo tr c. Và nh v y bi n sẽ đ c hi u có ki u d li u ụ ế ượ ướ ư ậ ế ượ ể ể ữ ệVariant. (Đi u không báo tr c này trong ngh y khuyên là ch ng ch đ nh!)ề ướ ề ố ỉ ị

Đây là vòng l p gi m d n, m i l n bi n đ m iZ gi m 5 đ n v cho t i 1 hay cho t i khi g p s iZ chia ặ ả ầ ỗ ầ ế ế ả ơ ị ớ ớ ặ ốh t cho 999. Mod là m t toán t , hi u nh trong excel sẽ là ế ộ ử ể ư

=If( MOD( iZ ; 999) = 0 ; ‘Exit For’; ‘Ti p’)ế

Nh v y ta cũng th y, n u b c không đ c xác đ nh nó sẽ l y giá tr là 1. M t ch ng ch đ nh n a là ư ậ ấ ế ướ ượ ị ấ ị ộ ố ỉ ị ữđ ng bao gi thay giá tr bi n đ m (iZ, hay Ij . . ) khi đang còn trong vòng l p; chuy n này nên h i ‘bácừ ờ ị ế ế ặ ệ ỏ sy’ n u ch a rành v VBA)ế ư ề

4./ C u truc Select. . . .End Selectấ

Trong excel ta đã bi t c u trúc phân nhánh b ng cách dùng hàm ế ấ ằ =IF(logical_test; value_if_true; value_if_false)Hàm này chúng ta hi u nôm na là trên đ ng l u thông chúng ta t i ngã ba; Rẽ ph i hay trái tùy ể ườ ư ớ ảthu c vé ta c m trên tay; Hi n nhiên, trong excel c u trúc If đ c phép l ng nhau (đ n 7 l n); V y ộ ầ ể ấ ượ ồ ế ầ ậth c ra ta hi u: không ph i tr c ngã ba, mà là còn chia các ngã khác n a. ự ể ả ướ ữL nh Select Case sẽ đ c phép rẽ nhi u nhánh ngay m t lúc;ệ ượ ề ộ( u trúc cú pháp c a Select Case nh sau:ấ ủ ưSelect Case TestExpression

Code:

[Case Expression (i)]

Page 16: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

[Statements (i)][Case Else [ElseStatements]End Select

TestExpression là 1 bi u th c s hay chu i b t kỳ. Trong ví d trên bi n Thang gi vai trò này. C n ể ứ ố ỗ ấ ụ ế ữ ầnói thêm r ng lúc đ u Thang ch a giá tr d li u c a ô hi n hành (dòng 5); sau đó Thang ch a k t ằ ầ ứ ị ữ ệ ủ ệ ứ ếqu =MONTH(Thang) – Đ c gán giá tr tháng c a d li u (dòng 7) & là TestExpression c a c u trúc ả ượ ị ủ ữ ệ ủ ấSelect Case. Trong macro ToMau nêu trên, chúng ta ch tô 6 màu khác nhau cho t ng c p tháng; tuy ỉ ừ ặnhiên chúng ta cũng có th vi tể ế

Code:

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 thành th c VBA khuyên ta nên luôn nh p câu l nh Case Else cho m i tr ng h p, có khiữ ườ ụ ậ ệ ọ ườ ợ sẽ ch p đ c nh ng giá tr TestExpression không mong mu n xu t hi n.ộ ượ ữ ị ố ấ ệBài t p th c hành:â ự

1./ Hãy t o macro tô màu cho Font ch trong các ô t ng ng là Đ , Vàng, l c, lam, tím. . .; xem & đ c ạ ữ ươ ứ ỏ ụ ọn i dung macro đ th c hi n các bài t p d i;ộ ể ự ệ ậ ướ

2./ Hãy đ c đ bi t macro sau cho k t qu bao nhiêu, khi ta nh p 9 vô h p tho 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 Sub

3./ Gi s ta có c t “D” là đi m trung bình c a h c viên trong l p; ta t o macro đ tô màu theo x p ả ử ộ ể ủ ọ ớ ạ ể ếlo i h c sinh; (VD: >=9: màu đ ; >=7,5: Màu vàng . . .)ạ ọ ỏ

Bài đ c thêm: ọ ColorsOption Explicit

VI. T o b ng màu, tên màu & ch só c a 56 màuạ ả ỉ ủ

Page 17: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Sub 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 Sub

VII. Hàm tr v các d ng bi u th ch s màu n n c a ô đ c ch đ nhả ề ạ ể ị ỉ ố ề ủ ượ ỉ ị

Function 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 Function

VIII. 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

Page 18: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

'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 Functd9i5I

Sub DoiMau() Color_Change SelectionEnd Sub

IX. 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 Sub

X. Tìm màu n n t ng ng v i màu Fontề ươ ứ ớ

Sub RealInvertColors() Dim Rng As Range Dim reD As Double, bLue As Double, gReen As Double, CoLor As Double

Page 19: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 Sub

XI. Tìm các ô ch a giá tr chu i "JjWwZz"ứ ị ỗ

Sub SelectJjWwZz()Dim RgJjWwZz As Range, RgNext As Range, FirstAddress As Range

With 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 Sub

XII.Tim "Jn" trong các tên cu WorkBook , màu đ thì đ i thành tr ngả ỏ ổ ắ

Sub 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 Sub

XIII. Các b n t tìm hi u :ạ ự ể

Page 20: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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).â ệ ơ ở ữ ệ

Page 21: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

1./ T m hi u v CSDL & cách tìm đ n dong cu i CSDLạ ể ể ế ố

Trong th c t ít nhi u chúng ta đ u ti p xúc v i CSDL. Trong excel ta có m t s hàm CSDL, ví d ự ế ề ề ế ớ ộ ố ụ=DSUM(database,field,criteria) ; database ph i th a mãn m t s yêu c u:ả ỏ ộ ố ầ

Hàng đ u tiên là các tên tr ng, Các tên tr ng, cũng nh tên bi n: không có ch a kho ng tr ng hay ầ ườ ườ ư ế ứ ả ắcác kí t đ c bi t, Các hàng trong CSDL (g i là các record) đ u ph i có s li u. Không đ c dùng ký ự ặ ệ ọ ề ả ố ệ ượt ntr, hay ‘–‘ đ thay cho các tr trùng v i giá tr tr ng đó c a record trên nó.ự ể ị ớ ị ườ ủ

Ta có th th y CSDL h c sinh các l p trong m t tr ng h c, DS (danh sách) công nhân viên ch c ể ấ ọ ớ ộ ườ ọ ứtrong đ n v , b ng kê hóa đ n mua bán hàng hóa, b ng kê s n l ng c a b ph n s n xu t trong đ nơ ị ả ơ ả ả ượ ủ ộ ậ ả ấ ơ v & còn nhi u nh ng DS khác n a . . . .ị ề ữ ữ

Gi s ta có DS các chuy n hàng nh p vô nhà máy, có các tr ng nh sau: [STt], [Ngay], [MKH], ả ử ế ậ ườ ư[SoXe], [TgLuong], [Bi], [Sluong]. Hàng ngày c s s n xu t y nh n vô kho ng vài ch c xe hàng đ ơ ở ả ấ ấ ậ ả ụ ểlàm nguyên li u. Nh v y s ghi chép đ y đ s li u nh p lo i nguyên li u này trong th i kỳ nào đó ệ ư ậ ổ ầ ủ ố ệ ậ ạ ệ ờsẽ là m t CSDL t t đ chúng ta dùng macro tác đ ng đ n t t c các khâu, t khâu nh p li u, th ng kê,ộ ố ể ộ ế ấ ả ừ ậ ệ ố x lý s li u trong báo cáo, qu n lý & đi u ch nh quá trình. . .ử ố ệ ả ề ỉ

N u không có công c macro, chúng ta ph i nh p tr c ti p các s li u c a xe hàng vô dòng cu i c a ế ụ ả ậ ự ế ố ệ ủ ố ủCSDL. Làm nh v y r t d nh m l n, d n đ n nh ng sai sót khôn l ng. Cách t t nh t đ n th i ư ậ ấ ễ ầ ẫ ẫ ế ữ ườ ố ấ ế ờđi m này (do ta ch a bi t gì v Form) là ta nh p s li u v xe hàng m i vô lên 1 sheet (có tên là ể ư ế ề ậ ố ệ ề ớNhap) theo c t t trên xu ng. (B trí theo c t vì th ng nh p xong s li u m t ô, n ENTER thì con ộ ừ ố ố ộ ườ ậ ố ệ ộ ấtr xu ng ngay ô dòng d i!). Sau khi ki m tra xong, ta n nút đ macro thay ta chép các s li u này ỏ ố ướ ể ấ ể ố ệđ n Sheet ch a CSDL (có tên là CSDL), vào đúng n i yêu c u: dòng cu i c a CSDL. Lúc đó ta t n d ng ế ứ ơ ầ ố ủ ậ ụđ c cách mà excel copy chuy n c t thành hàng;ượ ể ộ

Gi i bài toán nêu trên b ng cách: T i Nhap ta thi t k nh sau: Tr n 2 ô A1 & B1 đ nó ch a chu i: ả ằ ạ ế ế ư ộ ể ứ ỗ‘Nh p m i’; Các ô trong c t A k t A2 tr xu ng ch a l n l t các chu i: ‘S TT’, ‘Ngày nh p’, ‘Mã ậ ớ ộ ể ừ ở ố ứ ầ ượ ỗ ố ậch hàng’, ‘Bi n s ’, ‘Tr ng l ng c bì’, ‘Tr bì’, ‘S th c nh p’ủ ể ố ọ ượ ả ừ ố ự ậ

Ta nh p s li u m t xe hàng vô c t b t B2 đ n B7; Còn giá tr t i B8 ta cài công th c = (B6 – B7). ậ ố ệ ộ ộ ừ ế ị ạ ứĐ n l t các b n hãy t t o cho mình m t macro chép s li u t i c t B t B2 cho đ n B8 theo các ế ượ ạ ự ạ ộ ố ệ ạ ộ ừ ếb c sau:ướ

v Đ t tên macro s p thu. . .ặ ắ

v Dùng chu t tô ch n các ô t B2 tr xu ng B8 c a sheet ‘Nhap’, xong vô menu Edit -> Copy;ộ ọ ừ ở ố ủ

v Ta ch n ti p sheets ‘CSDL’; n ch n ô A2, & l i vô menu Edit -> Paste Special; Trong ngăn Paste c a ọ ế ấ ọ ạ ủh p tho i Paste Special ta ch n Values & n vô nút ch n Transposeộ ạ ọ ấ ọ

v K t thúc thu macro, & macro này b n đ t tên Nhap (hay NhapLieu) hay tên nào khác g i nh mà ế ạ ặ ợ ớb n mu n. (Tác gi quy n ghi chép này mu n các b n theo dõi bài c n th c hi n macro này t i thi uạ ố ả ễ ố ạ ầ ự ệ ố ể 2 l n, nên m i g i tên t i đây; dù sao cũng là m t ý đ !) Sau m i l n th ta có th xóa macro đi b ng ầ ớ ợ ạ ộ ồ ỗ ầ ử ể ằcách: T i CS (c a s ) excel ta nh n cùng lúc ALT+F8, CS Macro m ra, ta ch n tên macro trong ngăn ạ ử ổ ấ ở ọMacro Name mà ta mu n xóa, xong ch n nút l nh Delete đ th c hi n vi c này. Mình khuyên các b n ố ọ ệ ể ự ệ ệ ạnên xóa tác ph m macro c a mình nhi u l n, sau m i l n xóa macro, ki n th c VBA c a ta sẽ l n lên ẩ ủ ề ầ ỗ ầ ế ứ ủ ớm t ít!. ộ

(/i c này không ph i là quên, mà là có ch tâm: sau b c hai nêu trên, b n còn m t công đo n n a là ệ ả ủ ướ ạ ộ ạ ữn nút ESC trên bàn phím! Vi c này ta có th quên trong khi thao tác trên b ng tính excel (đ b ch nấ ệ ể ả ể ỏ ọ

dãy ô đ nh Copy). Nh ng đây không nên quên t o nào, vì d b phi n ph c & ki n cáo v sau, ho c ị ư ở ẹ ễ ị ề ứ ệ ề ạ

Page 22: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

gi chúng ta không bi t macro d n ta đi đ n ph ng tr i nào n a?!ả ế ẫ ế ươ ờ ữ

Chú ý:

* Trong h p tho i Paste Special b n th không ch n nút n Value 1 l n và xem macro cho k t qu ra ộ ạ ạ ử ọ ấ ầ ế ảsao?

* B n th m t l n đ t tên macro là Nhap_ sẽ b VBA ph n đ i hay không ?!ạ ử ộ ầ ặ ị ả ố

* B n nghĩ xem còn có th làm gì đ giao l u gi a b n & VBA thông qua macro này không? VD nh ạ ể ể ư ữ ạ ưth đ t tên là _Nhap xem b ph n đ i không?! . . .ử ặ ị ả ố

Đ n đây là xong m t công đo n. Ph n th đ n là xác đ nh dòng cu i c a CSDL; Đ th c hi n vi c nàyế ộ ạ ầ ứ ế ị ố ủ ể ự ệ ệ b n c n t t o cho mình m t CSDL kho ng vài ch c records, và na ná nh mình đ ra đ d theo dõi ạ ầ ự ạ ộ ả ụ ư ề ể ễti p. Macro trên bao gi ta cũng chép vô range A2; Nh ng th c ti n CSDL tăng (gi m) liên t c, nên ta ế ờ ư ự ể ả ụph i làm sao đ macro thông minh, hi u ý ta mà tìm đ n dòng cu i đ dán d li u vô!ả ể ể ế ố ể ữ ệ

Ta l i th c hi n ghi macro Sub DongCuoi() b ng cách thu macro qua các b c sau:ạ ự ệ ằ ướ

* Ch n ô A1 c a CSDL, gi phím CTRL & n phím mũi tên xu ng (Dòng cu i c a CSDL đ c ch n)ọ ủ ữ ấ ố ố ủ ượ ọ

* Ti p t c th c hi n hành đ ng nh v y đ đ n đ c dòng cu i c a trang tínhế ụ ự ệ ộ ư ậ ễ ế ượ ố ủ

* (Cu i r i nên quay l i) n t h p CTRL+ phím mũi tên lên đ tr l i dòng cu i c a CSDL. ố ồ ạ Â ổ ợ ể ở ạ ố ủ

Sau khi ng ng thu macro ta sẽ có nh ng dòng t ng t vày trong CS ch a các macro:ư ữ ươ ự ứ

Code:

Sub DongCuoi() Rang(“A1”).Select: Selection.End(xlDown).Select Selection.End(xlDown).Select: Selection.End(xlUp).SelectEnd Sub

Đi u chúng ta c n là máy cho ta bi t dòng tr ng k ti p đ chép; đi u này th c hi n đ c ề ầ ế ố ế ế ể ề ự ệ ượb ng cách s a l i macro trên đ có 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 Sub

Trong macro này có 2 dòng l nh đáng k đ n. Đó là dòng l nh th c hi n thao tác CTRL+ mũi tên lên. ệ ể ế ệ ự ệDòng l nh này làm ô ch a d li u cu i c a CSDL trên c t ‘A’ đ c kích ho t.ệ ứ ữ ệ ố ủ ộ ượ ạ

Page 23: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Dòng th đ n là ph ng th c gán cho bi n iRow đã khai báo giá tr , b ng v i gía tr hàng hi n hành ứ ế ươ ứ ế ị ằ ớ ị ệc ng v i 1 (Nên đ c dòng l nh t ph i qua trái, là: Dòng hi n hành c ng 1, gán vô bi n iRow). ộ ớ ọ ệ ừ ả ệ ộ ế

2./ Macro nh p li uâ ệ

Đã đ n giai đo n l p macro nh p li u, k t h p t hai macro nêu trên & thêm gia v vô cho món macroế ạ ậ ậ ệ ế ợ ừ ị thêm h p d n. Nh ng gi chúng ta d ch ng c t ngôn ng macro sang ngôn t di n t các b c ti nấ ẫ ư ờ ị ượ ừ ữ ừ ễ ả ướ ế hành c 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 Sub

Ph n d ch câu l nh:ầ ị ệ401: Ch n vùng c t B t i sheet (“Nhap”);ọ ộ ạ402: Copy (vùng ch n);ọ403: T ng t 401; ươ ự404: Đã gi i thích trên;ả405: Hãy ch n ô có s hàng tăng 1 & s c t v n nh cũ so v i ô kích ho t;ọ ố ố ộ ẫ ư ớ ạ406 & 407: ‘Quá quen!’

(Vì là ngôn ng d ch nên m i ng i có cách d ch khác nhau, có lẽ mình ch a th d ch ti ng nào ra ữ ị ỗ ườ ị ư ể ị ếti ng ý, mong đ c c m thông!). Và các b n th y đ y, d ch t ngôn ng VBA sang ngôn ng đ i ế ượ ả ạ ấ ấ ị ừ ữ ữ ờth ng cũng quan tr ng không kém, ph i không?!ườ ọ ả

Nhân d p rãnh r i các b n th b vài v sau c a m nh đ 406 xem ra răng?!ị ỗ ạ ử ỏ ế ủ ệ ề

3./ T o nut l nh cho m t macroạ ệ ộ

Các bài đ u ta đã bi t gán t h p phím t t cho m t macro. Nh ng ti n thì có ti n v i ta thôi. Còn khi ầ ế ổ ợ ắ ộ ư ệ ệ ớta v ng, ng i khác thay ta nh p li u thì không bi t các phím này!. Đ ti n cho vi c s d ng ta thi t ắ ườ ậ ệ ế ể ệ ệ ử ụ ếl p m t nút l nh trên trang tính, & nh v y b t kỳ ai cũng có th xài đ c khâu nh p li u.ậ ộ ệ ư ậ ấ ể ượ ậ ệ

Đ làm đ c đi u này, t i trang b ng tính ‘Nhap’ hi n hành, ta vô menu View ->Toolbars -> Forms để ượ ề ạ ả ệ ể hi n thanh công c Forms. Rà mũi chu t l n l t lên các nút đ tìm nút có ch ‘Button’. n ch n nó, ệ ụ ộ ầ ượ ể ữ Â ọđ a mũi chu t đang có d ng ch th p m nh mai đ n ô trên vùng C2:D8 (VD tôi ch n C7). n gi trái ư ộ ạ ữ ậ ả ế ọ Â ữchu t & vẽ hình ch nh t lên ô ch n. N u xu t hi n CS Assign Macro thì ta ch n tên macro Nhap t i ộ ữ ậ ọ ế ấ ệ ọ ạMacro Name & nh n OK.ấ

V i Button đang đ c kích ho t, ta ph i chu t vô nút l nh đ hi n menu t t c a nó. Ta ch n dòng ớ ượ ạ ả ộ ệ ể ệ ắ ủ ọcu i là Format Control. CS Format Control xu t hi n, nh ng ta b m Cancel cho n đi. Con tr chu t ố ấ ệ ư ấ ẩ ỏ ộtrên dòng ‘Button n’. Ta tô toàn b ch này & nh p vô thay b ng ch vi t: ‘Nh p’; L i tô sáng ch này ộ ữ ậ ằ ữ ệ ậ ạ ữ& nh p vô nút có ch B trên Toolbar, làm đ m ch . Sau đó ch n màu Font cho nó theo ý b n. N u ấ ữ ậ ữ ọ ạ ếb n đã, hay sẽ đ nh gán t h p các phím CTRL+SHIFT+N cho macro Nhap thì lúc này là t t nh t đ ạ ị ổ ợ ố ấ ể

Page 24: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

b n tô ch cái ‘N’ & nh n vô nút Underline. Đ ng tác này gây n t ng gi a hai th c th ta v i máy!ạ ữ ấ ộ ấ ượ ữ ự ể ớ

Sau khi t o ra tác ph m đ u tay này, nh t thi t vi c đ n ti p là th . B n có th nh n vô nút này ạ ẩ ầ ấ ế ệ ế ế ử ạ ể ấnhi u l n đ xem ‘H n’ chép nh ng gì có trên c t ‘B’ qua CSDL; C b nh n là chép, b t k mi n còn ề ầ ể ắ ữ ộ ứ ị ấ ấ ể ễđ c cung c p ngu n đi n! ượ ấ ồ ệ

4./ T o m tCombo Box đ nh p ma khách hàngạ ộ ể â

/(/h trên ta th y dòng th ba trong sheets ‘Nhap’ ch a mã #h (khách) hàng. B n có th t m c ư ấ ứ ứ ạ ắ ắkhông? Ta không nh p toàn tên #h hàng mà ch là mã vì chúng ta ‘l i bi ng’? ậ ỉ ườ ế

/(hông đâu các b n! B n th hình dung có nhi u #h hàng thân thi t ngày nào cũng cung c p hai đ n ạ ạ ử ề ế ấ ếb n chuy n thì ng i nh p cũng m t & máy cũng m t. Ng i m t thì d hi u r i! Máy cũng m t vì ố ế ườ ậ ệ ệ ườ ệ ễ ể ồ ệCSDL ta phình nhanh quá thay vì tr ng [MKH] ch g m t i đa 3 kí t hay ký s ta l i nh p nguyên ườ ỉ ồ ố ự ố ạ ậCông T ng Tôn N Nguy t Nga là không c n thi t. ằ ữ ệ ầ ếB n th hình dung nh th này trong file nhân s c a m t c quan 750 ng i g m 15 b ph nạ ử ư ế ự ủ ộ ơ ườ ồ ộ ậ

N u tr ng [BoFan] ta nh p nguyên tên đ n v nh : T ch c, Hành chánh, Tài chính, PX Nguyên li u, ế ườ ậ ơ ị ư ổ ứ ệPX C đi n. . . thay cho vi v nh p A, C, D, E, F . . . thì lãng phí ngu n nhân l c là đáng k .ơ ệ ệ ậ ồ ự ể

T t nhiên đây, cũng nh trên ta ph i có b ng đ i chi u nh trong hàm VLOOKUP() hay ấ ở ư ở ả ả ố ế ưHLOOKUP() trong excel đã g pặ

Tr l i v i ph n nh p mã #h hàng. Nh v y ng i dùng sẽ đ a câu ch t v n: Làm sao tôi nh mã c aở ạ ớ ầ ậ ư ậ ườ ư ấ ấ ớ ủ trên đôi ch c khách đây?! Đúng là m t yêu c u chính đáng mà ng i bi t macro ph i đáp ng. Và c uụ ộ ầ ườ ế ả ứ ứ tinh đó chính là Combo Box (sẽ vi t t t là Combo)ế ắ

/(/ó đâu?, v n trong toolbar Form ý thôi! B n rà mũi chu t nh ban nãy, nh ng thay vì tìm ch ở ẫ ạ ộ ư ư ữ‘Button’ ta tìm ch ‘Combo’ trong khi Tool tips hi n ch , hay th y cái nút nào có bi u t ng giông ữ ệ ữ ấ ể ượgi ng cái h p diêm thì nhào vô ki m.ố ộ ế

/(/h ng ki m v y thôi, ta ch a chu n b gì ngu n l c cho nó thì nó cũng vô d ng mà thôi; Gi ng nh ư ế ậ ư ẩ ị ồ ự ụ ố ưta ph i có macro Nhap r i m i làm nút l nh cho nó trên trang tính y mà!ả ồ ớ ệ ấ

Đ chu n b ngu n cho Combo, cũng nh CSDL qu n lý các th ng đ ta cũng sẽ t o các tr ng nh ể ầ ị ồ ư ả ượ ế ạ ườ ưSTT, Ma, HoTen, NgSinh, Dthoai, DiaChi, Fax, NguoiGD, GhiChu, . . .

Các tr ng khác ta b sung sau, nh ng hai tr ng ph i có tr c là Ma & HoTen; Gi d ta đã có DS ườ ổ ư ườ ả ướ ả ụnày g m 20 v , tùy thu c vô s l ng mà mã nên 2, 3 ký t (N u d i 1.000 th ng đ ta ch dùng 2 ồ ị ộ ố ượ ự ế ướ ượ ế ỉký t là đ ,)ự ủ

Gi ng nh t o nút l nh cho macro, ta cũng n vô bi u t ng Combo trên Toolbar Forms. Sau đó trên ố ư ạ ệ ấ ể ượtrang tính ta vẽ hình thanh dài đ th y tên c a th ng đ trong đó (khoãng ch ng 8 Cm). Ta cũng ủ ấ ủ ượ ế ừph i chu t vô hình ch nh t này & ch n Format Control. Trong CS Format Control ta n chu t vô h pả ộ ữ ậ ọ ấ ộ ộ Input range. Dùng chu t quét t đ u đ n cu i DS #h hàng. Ti p theo, trong h p Cell Link đ c n ộ ừ ầ ế ố ế ộ ượ ấchu t, trên trang tính ‘Nhap’ ta ch n ô C4 (k v i ô c n nh p mã #h hàng). Ti n tay ta đánh d u ki mộ ọ ề ớ ầ ậ ệ ấ ể vô 3-d Shading;

Ta nh p vô ô tr ng b t kỳ đ k t thúc s l c ph n format Control. N u gi ta nh n vô mũi tên ấ ố ấ ể ế ơ ượ ầ ế ờ ấxu ng c a Combo ta ch n tên 1 ng i thì t i ô C4 xu t hi n s , nói lên th th c a th ng đ đó ố ủ ọ ườ ạ ấ ệ ố ứ ự ủ ượ ếtrong DS. V y ch còn b c cu i cùng là ta ph i liên k t gi a s trên C4 v i mã #h hàng t ng ng; ậ ỉ ướ ố ả ế ữ ố ớ ươ ứĐi u này các b n có th ph i t làm l y, mình ch g i ý hai cách sau:ề ạ ể ả ự ấ ỉ ợ

Page 25: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

T i ô C3 dùng =VLOOKUP() hay dùng hàm =CHOOSE(). Hàm tr c cho DS nhi u & sau cho không t i ạ ướ ề ớch c #h hàng!ụĐ n đây ta có th xoa tay & c i t i v i thành qu c a mình. Đ khuy ch tr ng chi n tích, ta làm ế ể ườ ươ ớ ả ủ ể ế ươ ếđ p Combo b ng cách ph i chu t vô Combo & th c hi n ch nh s a kích c cho v a ý (đ i v i nút ẹ ằ ả ộ ự ệ ỉ ử ỡ ừ ố ớl nh cũng v y); & t cho phép mình tìm hi u các CS có trong Format Control.ệ ậ ự ể

Bài t p c a bài 4:â ủ

1./ B n đa g p macro này đâu?a ă ơ

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./ T i ô nh p ngày tháng (B3) ta có th cài m c đ nh ngày tr c ngày hi n hành 1 ngày (n u là các ạ ậ ể ặ ị ướ ệ ếth #) & tr c 2 ngày n u là th hai đ c không?!ứ ướ ế ứ ượ

3./ Nh câu hai n u là bình th ng, nh ng n u ng i nh p li u mu n lùi 1 vài ngày có đ c không?! ư ế ườ ư ế ườ ậ ệ ố ượ(đ thích ng v i vài 3 ngày ngh l tr lên í!). G i ý: S ngày lùi đ c nh p vô C3ể ứ ớ ỉ ễ ở ợ ố ượ ậ

File 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 báo cáo hàng ngày.â

1./ Kh o sát các yêu c u:ả ầ

Bài toán nêu ra là vi c qu n lý chu trình s n xu t t i m t CS (c s ). Mà c th là Giám đ c CS yêu ệ ả ả ấ ạ ộ ơ ở ụ ể ốc u phân x ng II g i BC (báo cáo) s li u hàng ngày tr c 8h30 ngày hôm sau. Trong BC ph i đ s ầ ưở ở ố ệ ướ ả ủ ốli u v 4 v n đ : công ngh , s n l ng, ch t l ng & tiêu hao;ệ ề ấ ề ệ ả ượ ấ ượ

Trong m i v n đ có nh ng yêu c u chi ti t các h ng m c nh sau:ỗ ấ ề ữ ầ ế ạ ụ ưCôngh : s h h ng b n khâu trong phân x ng (K1, K2, K3, K4)ệ ố ư ỏ ở ố ưởS n l ng: S n l ng s n xu t 9 m t hàng c a p/x (phân x ng)ả ượ ả ượ ả ấ ặ ủ ưởCh t l ng s n ph m: S lo i I & & lo i 2 ấ ượ ả ẩ ố ạ ạTiêu hao : Đi n, nguyên li u & nhiên li u. . . . . .(xem trong Sheet(“BCao”) ệ ệ ệ File Bai4_5.XLS)

Ta đã bi t r ng macro nói riêng (hay VBA nói chung) r t a các công vi c l p l i th ng xuyên này. ế ằ ấ ư ệ ặ ạ ườV n đ là làm nh th nào đ l p CSDL (c s d li u) x lý m t cách tr n tru & còn có h ng cho ấ ề ư ế ể ậ ơ ở ữ ệ ử ộ ơ ướmai sau phát tri n!ểTrong Sheet(“CSDL”) c a file đính kèm có các tr ng sau: Ngay, Ca, Kip, ThSo, ThNm, SoLieuủ ườNgay Ca Kíp ThSo ThNm SoLieu 23/09/2006 A 1 B6A 28 1,230 1/10/2006 A 1 A1A 29 9

Trong đó có hai tr ng c n nói t i (còn các tr ng khác ch c ai cũng ng m ra). Đó là [ThNm] & ườ ầ ớ ườ ắ ẫ

Page 26: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

[ThSo][ThNm] là tr ng bi u tr ng cho năm & tháng c a [Ngay]. Sau này các b n sẽ bi t nó dùng đ l c d ườ ể ư ủ ạ ế ể ọ ữli u theo tháng nào đó trong năm, ph c v trong chuy n tính lũy k s n xu t.ệ ụ ụ ệ ế ả ấ

[ThSo] g m 3 kí t hay kí s . Kí t đ u bi u tr ng cho các v n đ c n qu n lý: Côngh , s n l ng, ồ ự ố ự ầ ể ư ấ ề ầ ả ệ ả ượch t l ng & tiêu hao;ấ ượ

Ký s th đ n bi u tr ng cho th t yêu c u chi ti t; Ví d : B6A thì ta hi u là tr ng SoLieu ghi ố ứ ế ể ư ứ ự ầ ế ụ ể ườs n l ng m t hàng mác 6 (xem trong Sheets(“Nhap”))ả ượ ặA1?: Ghi s h h ng t i công đo n K1 c a phân x ng.ố ư ỏ ạ ạ ủ ưởKý t cu i cùng ch ra ca s n xu t. ự ố ỉ ả ấCó th b n sẽ hõi, v y l u kíp th làm gì? Xin th a: Ca đêm đ c thêm l ng & b i d ng gi a ca! ể ạ ậ ư ợ ư ượ ươ ồ ưỡ ữVi c này c n thi t đ sau này l S p trã l ng theo k t qu s n ph m cu i cùng . . .ệ ầ ế ể ỡ ế ươ ế ả ả ẩ ốCũng đúng n u ta nói [Ca] là d . Nh ng ta m i ch p ch ng vô VBA nên ph n s d ng tài nguyên còn ế ư ư ớ ậ ữ ầ ử ụch ng m c thôi, ch a ph i là t i u, mong nhi u b n thông c m!ừ ự ư ả ố ư ề ạ ả

2./ Trích l c s li u ngày c n thi tọ ố ệ ầ ế

Các b n hãy m trang tính ‘BCao”, trong í đã cài s n công th c h t r i. Công vi c c a chúng ta là ạ ở ẵ ứ ế ồ ệ ủvi t macro gán vô nút l nh ‘Báo cáo” trong sheets ‘Nhap’. Đ nó làm tu n t các nhi m v :ế ệ ể ầ ự ệ ụ

a.) X p CSDL theo [Ngay]; lí do: đ phòng nhân viên nh p li u không theo ngày tháng nh bình ế ề ậ ệ ưth ng. Vi c này các b n th ghi l i b ng m t macro riêng, xem nh m t bài t p b sung!ườ ệ ạ ử ạ ằ ộ ư ộ ậ ổ

b.) Trích l c toàn b d li u trong ngày th hi n lên hai c t ‘L’ & ‘M’ trong sheet ‘CSDL’. Ngày ch ọ ộ ữ ệ ể ệ ộ ỉđ nh đ c ghi t i ô B2 c a Sheet ‘Nhap’ hay ô H2 thu c vùng Criteria khi ta s d ng ph ng th c ị ượ ạ ủ ộ ử ụ ươ ứAdvanced Filter. . trên menu Data. Các b n cũng nên ghi 1 macro này n a đ hi u thêm v Advanced ạ ữ ể ể ềFilter đ có trong tay nh ng gì ngôn ng VBA nói đ n chuy n Advanced Filter. (Chuy n này không ai ể ữ ữ ế ệ ệc m c n b n th c hi n nhi u l n c , ch có đi u b n có mu n hay không mà thôi! Càng làm nhi u ấ ả ạ ự ệ ề ầ ả ỉ ề ạ ố ềmáy nó càng c m n đó; C th nha: Trong menu Insert ->Name->Define c a excel có ghi nh n công ả ơ ụ ể ủ ậlao c a b n đó!) V ph n mình đáng ra tôi nên khóa các macro s n có trong file đính kèm, nh ng ủ ạ ề ầ ẵ ưkhông vì th mà các b n không t mình vi t nhi u l n hai macro đã nêu trên (v x p tr t t CSDL & ế ạ ự ế ề ầ ề ế ậ ựAdvanced Filter. . .) . Y tôi mu n là các b n t nh n th c là chính & c b n nh t. Và đ ng t ái khi ố ạ ự ậ ứ ơ ả ấ ừ ựmáy ch cho ta th này th khác qua ngôn ng VBA. Càng không nên nhào ngay vô cái s n có c a ỉ ứ ứ ữ ẵ ủng i khác mà mình ch a có đ ng v n nào l n l ng. Và ý cu i cùng: máy tính lúc nào cũng s n lòng ườ ư ồ ố ậ ư ố ẵgiúp ta, không h v l i!ề ụ ợN u chúng ta th c hi n xong macro th hai này thì trang BC ch còn ch a c p nh t s li u lũy k ế ự ệ ứ ỉ ư ậ ậ ố ệ ếtháng (nêu t i c t ‘P’ trong Sheet ‘BCao’). Còn các c t tr c nó đã ngon lành.ạ ộ ộ ướA còn đi u này nói tr c: Nh ng bài ghi chép này là nói v VBA, n u có ai th c m c v công th c nào ề ướ ữ ề ế ắ ắ ề ứđó c a excel (mà c th là trong trang ‘BCao’) thì b n thân xét th y không có đ kh năng gi i đáp, ủ ụ ể ả ấ ủ ả ảthông c m nha!ả

c.) T o s li u s n l ng lũy k tháng: Đây là công vi c nh c nh ng, vì ch m t ch c s li u nh ng ạ ố ệ ả ượ ế ệ ọ ằ ỉ ộ ụ ố ệ ưl i ph i đ nhi u công s c. Vây nên chuy n nó thành đ m c riêng luôn d i đây:ạ ả ổ ề ứ ể ề ụ ướ

3./ Thu th p s li u các ngày tr c đó c a thángâ ố ệ ướ ủ

Đ l y d li u t đ u tháng t kho l u tr ta th c hi n l c h t d li u t ngày 1 c a tháng đó cho ể ấ ữ ệ ừ ầ ừ ư ữ ự ệ ọ ế ữ ệ ừ ủđ n ngày s p yêu c u. Nên nh r ng có lúc cu i tháng, nh ng s p mu n xem k t qu s n xu t c a ế ế ầ ớ ằ ố ư ế ố ế ả ả ấ ủnh ng ngày trong tu n đ u tháng thì sao?! ữ ầ ầVì chúng ta m i quen v i VBA, nên chúng ta nên xài c t ph , đó là tr ng [ThNm]; Nôm na là tr ng ớ ớ ộ ụ ườ ườch a 2 ký t , ký t đ u bi u tr ng cho năm, ký t sau bi u tr ng cho tháng c a năm y! đây ng iứ ự ự ầ ể ư ự ể ư ủ ấ Ở ườ ta làm v y đ chúng ta d xài mà thôi. Này nha: n u chúng ta cung c p cho macro m t bi n chu i ậ ể ễ ế ấ ộ ế ỗki u ‘10/06’, ‘9/06’. . . cho máy cũng sẽ s y ra tr ng h p b t đ ng ngôn ng không ít thì nhi u. Vì sẽể ẫ ườ ợ ấ ồ ữ ề có ng i cho là heo l n h n l n, cũng sẽ có ng i cho l n nh n h n heo!ườ ớ ơ ợ ườ ợ ớ ơTr ng này do hàm t t o đem l i; Đ có khái ni m v hàm t t o, ta b t đ u t hàm c a excel. Hàmườ ự ạ ạ ể ệ ề ự ạ ắ ầ ư ủ

Page 27: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

excel luôn tr v cho ta m t th gì đó; Có m t s hàm đòi chúng ta cung c p các đ i s , nh ng cũng ả ề ộ ứ ộ ố ấ ố ố ưcó nh ng hàm ta i là nó cho ngay mà ch ng đòi h i gì;ữ ớ ẵ ỏ(òn VBA cho chúng ta kh năng l p nh ng hàm tùy thích mi n tuân th lu t ch i v ngôn ng . ả ậ ữ ễ ủ ậ ơ ề ữTr l i tr ng t m nêu trên; Vì tr ng này ch dùng trong h u tr ng, và cũng suy ra đ c t ngày ở ạ ườ ạ ườ ỉ ậ ườ ượ ừc n BC, nên đ dài 2 ký t là đ . (Sau này có d p ta sẽ xét ky h n). Hi n th i ta bi t n u dùng ầ ộ ự ủ ị ơ ệ ờ ế ếAdvanced Filter theo tr ng đó, ta sẽ có s li u trong nguyên 1 tháng;ườ ố ệCác b n th d trang tính ‘CSDL’ ra và th nhi u l n đi, sẽ th y tôi nói không sai. Và n u c n b n ghi ạ ử ỡ ử ề ầ ấ ế ầ ạthành macro luôn, khi đã thành th c.ụ/(/h ng đã nói trên, s li u nguyên tháng nhi u khi không c n thi t & sẽ d n đ n thông tin l ch l c. ư ố ệ ề ầ ế ẫ ế ệ ạV y là t i vùng k t xu t k t qu tháng, ta ph i th c thi nhi m v xóa đi nh ng d li u sau ngày yêu ậ ạ ế ấ ế ả ả ự ệ ụ ữ ữ ệc u báo cáo!ầ

4./ Xóa đi s li u các ngày sau c a thángố ệ ủ

Macro BaoCao d i đây, tôi đã s a l i, b ng cách thay vì nh ng dòng l nh dài tôi thay b ng cách g i ướ ử ạ ằ ữ ệ ằ ọm t macro khác (nh ng macro mà tôi đã kh n kho ng đ ngh các b n th c hi n m t cách riêng rẽ, ộ ữ ẩ ả ề ị ạ ự ệ ộnh sau (Tên là do tôi áp đ t, các b n nên xem l i):ư ặ ạ ạMacro x p CSDL theo ngày (tăng d n) có tên Sub XepNgay()ế ầMacro l c s li u theo ngày có tên Sub LocNgayBC()ọ ố ệMacro l c s li u theo tháng có tên là Sub LocThang()ọ ố ệMacro x p theo tháng có tên Sub XepThang(), V n i dung macro này b n tham kh o trong file đính ế ề ộ ạ ảkèm! Nó cũng gi ng nh XepNgay & ti n cho ai đó c n xem xét, ki m tra. ố ư ệ ầ ểNh v y macro mà tôi có đ c sẽ tr thành nh sau:ư ậ ượ ở ư

Code:

Sub BaoCao()501 Application.ScreenUpdating = 0: Sheets("CSDL").Select'X p theo Ngàyế XepNgay'Xóa s li u cũ:ố ệ503 Range("L2:M125", "O2:Q125").Select: Selection.ClearContents'L c s li u ngày:ọ ố ệLocNgayBC 'L c s li u tháng:ọ ố ệ LocThang'X p theo tháng:ế XepThang'Tính lũy k đ u thá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 các dòng d li u:ệ ữ ệ Selection.Rows.Hidden = False For Zj = 12 To 19

Page 28: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

If Range("P" & CStr(Zj)).Value = 0 Then Rows(Zj).Hidden = True Next Zj End Sub

Câu l nh đ u tiên t i 501 dùng đ kh i l c l màn hình khi ta Select t sheets này sang sheets kia, ệ ầ ạ ể ỏ ắ ư ừhay t đ u CSDL đ n ngày cu i CSDL th m chí đ n dòng cu i c a trang tính. Câu th 2 trong dòng ta ừ ầ ế ố ậ ế ố ủ ứđã bi t;ếHai câu l nh trong dòng 503 sẽ ch n vùng g m 2 kh i & làm tr ng hoàn toàn các ô trong nó.ệ ọ ồ ố ố/( t câu l nh 507 th c s c n kh o sát ky; trong dòng đó có câu khai báo m t bi n Dat có ki u d ể ừ ệ ự ự ầ ả ộ ế ể ữli u ngày tháng; Ki u d li u này na ná v i ki u d li i Long, vì th c ra ngày tháng là s nguyên k ệ ể ữ ệ ớ ể ữ ệ ự ố ểt 1/1/1900 đ c n đ nh là 1, và c th . . . c sau 1 ngày tăng 1 đ n v ; Bi n này đ c gán d li u ừ ượ ấ ị ứ ế ứ ơ ị ế ượ ữ ệch a trong ô H2 (t t nhiên trong H2 ph i ch a d li u ki u ngày hay t ng t .) thông qua câu l nh ứ ấ ả ứ ữ ệ ể ươ ự ệ509;Dòng l nh 510 & 515 ta cho qua?! Dòng 511, l nh đ u là: đ i tr trong bi n Zj sang d ng chu i và ệ ở ệ ầ ổ ị ế ạ ỗn i vô ký t ‘O’; VD Zj đang là 35 thì bi n StrC sẽ ch a chu i ‘O35’ (không có hai d u nháy đ n). Dòng ố ự ế ứ ỗ ấ ơsau b o v i VBA ch n ô có đ a ch nh v y làm ô hi n hành. Câu l nh 512 & 514 ta qua luôn?! Câu ả ớ ọ ị ỉ ư ậ ệ ệ513 nói r ng n u giá tr ch a trong ô hi n hành l n h n bi n ch a ngày tháng (Dat) hay ô này không ằ ế ị ứ ệ ớ ơ ế ứch a giá tr ô ngày tháng thì thoát kh i vòng l p; T i sao ph i có hai ĐK (đi u ki n)?; ĐK đ u áp ứ ị ỏ ặ ạ ả ề ệ ầd ng cho tr ng h p ngày BC nh h n ngày s n xu t & đã nh p s li u; ĐK sau đ đúng v i tr ng ụ ườ ợ ỏ ơ ả ấ ậ ố ệ ể ớ ườh p ngày BC cũng là ngày nh p s li u cu i cùng. N u thi u m t trong hai có lúc ta b báo l i không ợ ậ ố ệ ố ế ế ộ ị ỗng . ờTóm l i, vòng l p 510 . . .515 sẽ 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 thõa.ệ ượTuy ra kh i vòng l p r i, nh ng VBA v n nh hoài giá tr Zj. Nh cho đ n khi nó g p các m nh đ ỏ ặ ồ ư ẫ ớ ị ớ ế ặ ệ ềnh Exit Sub, End Sub, ho c ta gán cho nó giá tr m i . . . ư ặ ị ớ(ũng nh v y mà ta vi t đ c l nh 516: Làm tr ng toàn b các ô trong vùng hình ch nh t. Mà góc ờ ậ ế ượ ệ ố ộ ữ ậtrên trái nh t c a hình ch nh t là ô hi n hành cho đ n góc ph i th p nh t c a hình ch nh t là ấ ủ ự ậ ệ ế ả ấ ấ ủ ữ ậQ125. Mà t i sao là 125 & c 125 mãi v y?! Nó tùy thu c vô chu trình s n xu t c a phân x ng II này; Khi ạ ứ ậ ộ ả ấ ủ ưởta là ng i ngoài l p cho nhân viên th ng kê phân x ng thì ta ph i h i s t i đa trong tháng mà ca ườ ậ ố ưở ả ỏ ố ốnào đó có th s n xu t bao nhiêu s n ph m.ể ả ấ ả ẩ(/ y sẽ n y sinh câu h i: N u sau này s n xu t phát tri n, gây ra chuy n v t s 125 dòng trong ậ ẫ ỏ ế ả ấ ể ệ ượ ốtháng thì làm cách nào?!Th c t , các Lão luy n trong VBA khuyên chúng ta trong tr ng h p này là khai báo 1 h ng s trong ự ế ệ ườ ợ ằ ốph n Declarations trên cùng c a c a s VBA, câu l nh nh sau:ầ ở ủ ử ổ ệ ưConst DongCuoi = 135Sau đó trong toàn b các macro trong đó có th xài h ng s này; M t khi c n b o trì hay nâng c p, ta ộ ể ằ ố ộ ầ ả ấkh i tìm trong các đo n mã m t cách khó khăn mà ch vi c tăng tr cho h ng s mà thôi. K ra nói ỏ ạ ộ ỉ ệ ị ằ ố ểkhông sai r ng đ nh lu t b o toàn cũng đúng c trong tr ng h p nh v y!ằ ị ậ ả ả ườ ợ ư ầT i vùng Declarations này ta còn có th khai báo nhi u th khác nhau, nhạ ể ề ứ ưS Pi: B n thân máy đã có h ng s này; nh ng nó r t dài, ta có th c n s nh 3,142 thôi:ố ả ằ ố ư ấ ể ầ ố ưConst Pi = 3.142H ng s còn có th là chu i kí t nh ằ ố ể ỗ ự ưConst Schu = “Chúc M ng Đ n V i VBA”ừ ế ớĐ sau đó ta l p macro nh sau:ể ậ ư

Code:

Sub Auto_Open() MsgBox SchuEnd Sub

/(/ u cũng ch a th a mãn theo ki u ph i khai báo h ng s thì có th dùng vòng l p Do. . . Loop thay ế ư ỏ ể ả ằ ố ể ặcho vòng For . . . Next. Cú pháp đ th c hi n công vi c gi ng v i công vi c mà for . . . next làm nh ể ự ệ ệ ố ớ ệ ư

Page 29: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

trên là 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 nà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 Loop

Bài t p c a bài 5: Vo ch cho ky càng file đinh kemậ ủ o

Bài 6 Macro th ng kê s li u. ố ố ệ

1./ Th ng kê sàn l ng các ca t đ u tháng:ố ượ ư ầ

Th c ra TK (th ng kê) này này đã ti m n, ch có đi u ta ch a cho nó xu t đ u l di n ra mà thôi. T iự ố ề ẩ ỉ ề ư ấ ầ ộ ệ ạ sheets("BCao") vùng t P12-P20 có công th c t a nh sau ừ ứ ự ư

Trích:

=SUMIF(CSDL!P$2:P124,"B1?",CSDL!Q$2:Q124)

(/ y đi u gì sẽ xu t hi n khi công th c trên đ c s a l i thành: ậ ề ấ ệ ứ ượ ử ạ

Trích:

=SUMIF(CSDL!P$2:P124,"??A",CSDL!Q$2:Q124)

và nh p vô ô nào đó (VD $D$4 trong sheets ('ThKe')). Công th c này cho ta SL (s n l ng) ca A t đ uậ ứ ả ượ ừ ầ tháng. (N u b n nào còn nghi ng nên xem l i thêm hàm SUMIF()!) ế ạ ờ ạ

/(/h v y ta ch vi c copy xu ng d i 2 dòng n a & ch nh s a l i, là ta có b ng SL các ca t đ u ư ậ ỉ ệ ố ướ ữ ỉ ử ạ ả ừ ầtháng

Trong Sheets("BCao") đã có SL t ng ca trong ngày. S li u tìm đ c là do c ng d n SL các s n ph m ừ ố ệ ượ ộ ồ ả ẩs n xu t trong ngày. N u các b n thích xài hàm SUMIF() thì cũng có công th c đ tính SL c a ca A ả ấ ế ạ ứ ể ủnh sau ư

Trích:

=SUMIF(CSDL!L$2:L124,"B?A",CSDL!M$2:M124)

Page 30: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Ta có th áp công th c này vô ô $C$4 c a trang tính th ng kê & chép xu ng 2 ô còn l i, s a ký t 'A' ể ứ ủ ố ố ạ ử ựthành 'B' & 'C' t ng ng sẽ có s li u th ng kê SL trong ngày theo ca; ươ ứ ố ệ ố

Chú ý: Trong b ng báo cáo, SL các s n ph m c a t ng ca đ c tính theo hàm VLOOKUP(); Tr ng ả ả ẩ ủ ừ ượ ườh p gì sẽ s y ra khi ng i nh p li u nh p 2 l n m t s li u: Hàm VLOOKUP() ch tr v 1 k t qu ; ợ ẩ ườ ậ ệ ậ ầ ộ ố ệ ỉ ả ề ế ảnh ng hàm SUMIF() thì c ng c hai record này. Nh v y b ng cách này ta có th ki m tra l i k t qu ư ộ ả ư ậ ằ ể ể ạ ế ảnh p li u m t cách gián ti p! ậ ệ ộ ế

2./ Th ng kê sàn l ng t đ u tháng theo ngày:ố ượ ư ầ

Th c ra ta ch c n m t s thao tác t ng t nh trên sẽ có s li u nh ng ngày s n xu t c a phân ự ỉ ầ ộ ố ươ ự ư ố ệ ữ ả ấ ủx ng II kia, th t v y: ưở ậ ậ

T i c t A, t A10 đ n A40 ta nh p các s tăng d n k t 1 & sau đó cho n c t A đi! ạ ộ ừ ế ậ ố ầ ể ừ ẩ ộ

T i B10 ta nh p hàm =DATE(YEAR(Nhap!B$2),MONTH(Nhap!B$2),A10) ạ ậ

T i C10 ta nh p công th c =SUMIF(CSDL!O$2:O125,B10,CSDL!Q$2:Q125)ạ ậ ứ

Sau đó tô ch n B10 & C10, chép xu ng đ n hàng 40.ọ ố ế

Trong công th c t i c t B v a l p, ô Nhap!B$2 là ô đ c l y làm ngày tháng cho báo cáo t i ứ ạ ộ ừ ậ ượ ấ ạsheet("BCao"). (Xem thêm công th c t i tiêu đ báo cáo.) ứ ạ ề

Nh v y ta đã th c hi n th ng kê s li u nh đ m c đã nêu mà không ph i dùng m t câu l nh nào ư ậ ự ệ ố ố ệ ư ề ụ ả ộ ệh t! H n n a vùng này luôn sẽ đ c c p nh t n u hàng ngày ta c p nh t báo cáo b ng nút l nh ' Báo ế ơ ữ ượ ậ ậ ế ậ ậ ằ ệcáo' t i Sheets("Nhap");ạ

/(/h ng s li u không th a mãn chúng ta l m, nh t là nh ng ngày đ u tháng v i quá nhi u s khôngư ố ệ ỏ ắ ấ ữ ầ ớ ề ố trong d li u; ữ ệ

Gi đây macro m i ra tay: làm n các dòng ch a d li u 0 trong vùng;ờ ớ ẩ ứ ữ ệ

B n hãy t thu m t macro Sub An1Dong() theo các b c sau: ạ ự ộ ướ

- Ch n dòng b t kỳ;ọ ấ

- Vô menu Format -> Row -> Hide

Và k t thúc vi c thu; nh n ATL+F8 đ m xem n i dung macroế ệ ấ ể ở ộ

Code:

Sub An1Dong()

Rows("40:40").Select: Range("B40").Activate

Selection.EntireRow.Hidden = True

End Sub

Đ n các dòng mà t i c t C c a dòng đó có tr 0 ta ph i dùng vòng l p. Vòng l p sẽ ch n l n l t ể ẩ ạ ộ ủ ị ả ặ ặ ọ ầ ượ

Page 31: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

t ng ô k t C40 -> C10; khi nào giá tr t i C(i) = 0 thì cho n đi. N i dung c a nó nh sau: ừ ể ừ ị ạ ẩ ộ ủ ư

Code:

Sub AnDong()

Dim jZ As Integer: Dim StrC As String

Application.ScreenUpdating = False

601 Sheets("ThKe").Select: Rows("10:40").Select

602 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 Then

607 Rows(CStr(.Offset(1, 0).Row) & ":" & CStr(.Offset(1, 0).Row)).Hidden = True

End If

End With

Next jZ

End Sub

đây ch có ba v n đ t ng đ i m i c n gi i nghĩa:Ở ỉ ấ ề ươ ố ớ ầ ả

Các câu l nh 601:602 là ch n vùng g m các hàng t 10 đ n 40 & cho h t n. T i sao ph i làm v y? ệ ọ ồ ừ ế ế ẩ ạ ả ậB i lẽ đ phòng ai tr c đó đã cho n m t s dòng b ng macro này hay m t macro khác siêu vi t ỡ ề ướ ẩ ộ ố ằ ộ ệh n. ơ

T i sao vòng l p l i b t đ u t ô 39 mà không là 40? Vì chúng ta cho n không ph i dòng hi n hành ạ ặ ạ ắ ầ ừ ẩ ả ệmà là dòng d i dòng hi n hành 1 dòng. (Còn h i ti p: T i sao làm v y? – Thích v y, th thôi!). ướ ệ ỏ ế ạ ậ ậ ế

Dòng 607 đ c di n d ch là: cho n dòng ngay d i dòng hi n hành. (Đi u ki n đã nêu trong dòng ượ ễ ị ẩ ướ ệ ề ệl nh trên : N u d li u trong ô C c a nó b ng không.) ệ ế ữ ệ ủ ằ

/(/h ng macro này c n đ c c i ti n, vì còn ch a ph i là th i đ i 2K (hay th i @). T i vì gi ng nh ư ầ ượ ả ế ư ả ờ ạ ờ ạ ố ưđi b , thay vì ph i ch y. . . Tôi xin gi i thi u m t macro n m t lúc nhi u dòng tr ng, m t khi chúng ộ ả ạ ớ ệ ộ ẩ ộ ề ố ộliên t c, nh sau: ụ ư

Code:

Sub AnNDong()

Page 32: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 Selection

608 If .Value = 0 Then

609 If iBDau = 0 Then iBDau = .Row

610 Else

611 If iBDau > 0 Then

612 Rows(CStr(iBDau) & ":" & CStr(.Offset(1, 0).Row)).Hidden = True

613 iBDau = 0

614 End If: End If

End With

Next jZ

End Sub

N u là ng i m i vô ngh d ch thu t thì ph i kè bên mình quy n t đi n. Còn chúng ta m i vô ngh ế ườ ớ ề ị ậ ả ễ ừ ể ớ ềđ c câu l nh cũng ph i có chí ít cây bút & t gi y nháp. Chúng ta sẽ vẽ s đ kh i c a nhóm l nh này!ọ ệ ả ờ ấ ơ ồ ố ủ ệ

T phía d i t gi y ta k 1 đo n th ng & ghi s 40; Sau đó ghi trên nó gi a đo n th ng là s 0; (ch ừ ướ ờ ấ ẻ ạ ă ố ữ ạ ă ố ỉnh ng ngày cu i tháng c a tháng có 31 ngày m i s n l ng mà thôi); ữ ố ủ ớ ả ượ

Câu l nh 609 yêu c u gán s hàng vô iBDau n u bi n này đang ch a giá tri 0. (C n nh r ng sau khi ệ ầ ố ế ế ứ ầ ớ ằkhai báo iBDau, l p t c nó sẽ có giá tr 0; Còn khi kh i t o bi n d ng chu i nó sẽ ch a chu i r ng "" ậ ứ ị ở ạ ế ạ ỗ ứ ỗ ỗ(khác v i chu i tr ng " ")). Ngoài ra ta còn ph i hi u thêm r ng n u iBDau đã l n h n 0 thì g p ô giá ớ ỗ ắ ả ể ằ ế ớ ơ ặtr 0 k ti p bi n này cũng không thay giá tr . (Coi nh câu l nh b o ta rẽ trái) ị ế ế ế ị ư ệ ả

Câu l nh 610 nói r ng: tr trong ô 'C(i)' <> 0 thì th c hi n các l nh 611 đ 613, (Coi nh câu l nh b oệ ằ ị ự ệ ệ ế ư ệ ả ta rẽ v đ ng bên ph i g i là nhánh (b)). Nh ng t i nhánh (b) này cũng l i g p ngã 3; H ng rẽ trái ề ườ ả ọ ư ạ ạ ặ ướ(ta cho là v y), & là h ng chính, đó là: n u bi n iBDau >0 thì là hai vi c sau: ậ ướ ế ế ệ

a) Làm n đi các dòng t d i ngay dòng hi n hành cho t i dòng trùng v i tr trong bi n iBDau đang ẩ ừ ướ ệ ớ ớ ị ếl u gi ; ư ữ

Page 33: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

b) Sau khi cho n xong thì gán cho tôi iBDau tr v 0ẩ ở ề

Còn h ng rẽ ph i: iBDau =0 thì đi ti p ( Có nghĩa là l i ti p t c g p dòng mà t i c t C c a nó giá tr ướ ả ế ạ ế ụ ặ ạ ộ ủ ịch a trong nó <> 0) ứ

Chú ý: Câu l nh 609 đ c phép vi t trên cùng m t dòng thay vì ph i ghi 3 dòng; H n n a ta có th ệ ượ ế ộ ả ơ ữ ểghi câu l nh nh sau: ệ ư

If Bdem = False then Ixxx = 0 Else Ixxx = 1

Đi u này ít th y, nh ng cũng nêu luôn ra đây đ cùng ghi nh n: Câu l nh 614 th c t là 2 dòng l nh, ề ấ ư ể ậ ệ ự ế ệđ c ngăn cách b i ký t ':'. Nh ng khi g p hai vòng l p For l ng vô nhau, ta có th ghi nh sau mà ượ ỡ ự ư ặ ặ ồ ể ưkhông b ph n đ i: ị ả ố

Code:

For Jz = 1 to 999

iDem = iDem +1

for Wj = 1 to 987

iDem = iDem -1

Next Wj, Jz

Nh các b n th y bi n đ m vòng l p trong ghi tr c bi n đ m vòng l p ngoài; N u ng c l i thì hai ư ạ ấ ế ế ặ ướ ế ế ặ ế ượ ạvòng l p này không còn l ng vô nhau n a, mà đang cãi nhau!ặ ồ ữ

3./ Xóa dòng trong sheets

Ta thu macro xóa m t dòng theo các b c nh sau:ộ ướ ư

Vô menu Tool ->Macro -> Record New Macro. . . Và đ t tên cho macro là Xoa1Dongặ

Ch n dòng 45 & vô menu Edit -> Deleteọ

Và b m nút k t thúc macro. Macro có n i dung nh sau:ấ ế ộ ư

Code:

Sub Xoa1Dong()

Rows("45:45").Select

Selection.Delete Shift:=xlUp

End Sub

Đ th y macro này làm vi c ra sao ta ph i tô màu n n các ô t A45 cho đ n A50 b ng cách b m vô ể ấ ệ ả ề ừ ế ằ ấtrang tính, ch n dãy ô & ch n 1 trong các màu dòng cu i trong bi u t ng Fill Color trên thanh công ọ ọ ố ể ược . Sau đó ta b m vô CS (c a s ) Microsoft Visual Basic & thu nh nó l i ch chi m n a ph i màn ụ ấ ử ổ ỏ ạ ỉ ế ữ ảhình; Đ t con tr trong các dòng c a macro & nh n phím F5 vài l n; C sau m i l n nh n, ta sẽ th y ặ ỏ ủ ấ ầ ứ ỗ ầ ấ ấcác ô tô màu n n gi m đi m t. ề ả ộ

Page 34: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Sau đó ta đ con tr sau ch Select & nh n phím Delete đ hai dòng l nh tr thành 1 Và xóa ch ể ỏ ữ ấ ể ệ ở ữ"Select" & "Selection." đi. Ta ti p t c b m {F5} đ macro ti p t c xóa các dòng có màu còn l i. ế ụ ấ ể ế ụ ạ

(ông vi c ti p theo sẽ th thay th macro n dòng b ng macro có ch a l nh xóa dòng. Các b c nh ệ ế ử ế ẩ ằ ứ ệ ướ ưsau:

Tô ch n dãy các ô t A10 đ n C40 & chép xu ng A50 tr điọ ừ ế ố ở

T i đ u dòng l nh 603 ta đánh d u nháy đ vô hi u hóa đi; đ n cu i dòng l nh & b m ENTER t o ạ ầ ệ ấ ể ệ ế ố ệ ấ ạdòng m i. Nh p vô đó câu l nh: ớ ậ ệ

For jZ = 80 To 50 Step -1

Ti p theo cũng làm nh v y v i câu l nh 612 & nh p câu l nh m iế ư ậ ớ ệ ậ ệ ớ

Rows(CStr(iBDau) & ":" & CStr(.Offset(1, 0).Row)).Delete Shift:=xlUp

Thu nh CS MVB còn n a ph i màn hình; b m tr chu t lên macro AnNDong & nh n phím {F5} đ ỏ ữ ả ấ ỏ ộ ấ ểxem macro làm vi c; ệ

Sau khi th nghi m thông th o ta tr macro AnNDong v nh cũ. Vì th c t chúng ta c n là n dòng, ử ệ ạ ả ề ư ự ế ầ ẩch không c n xóa dòng trong báo cáo ứ ầ

Bài t p c a bài 6:â ủ T i Sheets("Nhap") có ComboBox "S n l ng". Hãy ph i chu t vô đó, ch n dòng g n cu i Assign ạ ả ượ ả ộ ọ ầ ố

Macro. . . . Khi CS Assign Macro xu t hi n hãy ch n nút Edit bên ph i CS đ xem n i dung macro này. ấ ệ ọ ả ể ộB n có hi u n i dung không?ạ ể ộ

Bài 7 Macro và đ th .ồ ị

1.D ng đ th d ng c t b ng VBAư ô i ạ ộ ằ

Th t ra chúng ta sẽ thu Mc (macro) t o l p m t vài lo i ĐT (đ th ). T i Sheets(“DoThi”) ta nh p vô ậ ạ ậ ộ ạ ồ ị ạ ậc t A b t đ u t A2 các giá tr tùy ch n sau: 5, 4, 7, 9, 6, 7. Và A1 là chu i ‘SL’. Ta th c hi n các b c ộ ắ ầ ừ ị ọ ỗ ự ệ ướthu Mc t đ ng xây d ng ĐT d ng c t, nh sau:ự ộ ự ạ ộ ư

. Vô menu Tool ->Macro-> Record New Macro & đ t tên cho Mc là DoThi1ặ

. Ch n vùng A2:A7 b m vô bi u t ng Chart Wizard trên ToolBar. Sẽ xu t hi n b c 1 c a Chart ọ ấ ể ượ ấ ệ ướ ủWizard (Chart Type). Ta ch p nh n theo g i ý c a Excel b ng cách b m Next. Chuy n nhanh sang ấ ậ ợ ủ ằ ấ ểb c 3 b ng nút l nh Next m t l n n a;ướ ằ ệ ộ ầ ữ

. T i giai đo n ba ta vô ngăn Gridlines & b ch n nút Major Gridlines. Chuy n sang b c b n b ng ạ ạ ỏ ọ ể ướ ố ằphím next & b m nút l nh Finish đ k t thúc b c b n c a vi c vẽ ĐT.ấ ệ ể ế ướ ố ủ ệ

. B m ph i chu t vô vùng màu sám c a ĐT & ch n hàng trên cùng có dòng Format Pilot Area. . .. Trongấ ả ộ ủ ọ h p tho i này ta th y phía ph i có h p Area. Ta ch n màu tr ng thay vì màu xámộ ạ ấ ả ộ ọ ắ

. K t thúc thu Mc.ế

Ta m Mc ra trình t sẽ s a & ch y l i nó nh sau:ở ự ử ạ ạ ư

Page 35: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

- Vô hi u hóa các dò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 nh CS (c a s ) VB (Microsoft Visual Basic) đ nhìn th y m t n a đ th ; Thi t đ t tr chu t ỏ ử ổ ể ấ ộ ữ ồ ị ế ặ ỏ ộtrên Mc v a s a & b m phím {F5} cho Mc ch y. N u Excel không đ a ra l i ph n đ i nào thì ta có hai ừ ử ấ ạ ế ư ờ ả ốđ th ; b n th b b t m t cái;ộ ị ạ ử ỏ ớ ộ

/(hi đó Mc sẽ có 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

Page 36: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

.Pattern = xlSolid End With

End Sub

2.D ng đ th d ng đo n th ng & lam cho Mc nh n thông s ta trao choư ô i ạ ạ ă â ô

N u t i dòng th ba ta vô hiêu hóa nó b ng d u nháy đ u dòng; sau đó t o dòng & nh p vô dòng m i ế ạ ứ ằ ấ ầ ạ ậ ớnày câu l nh sau:ệActiveChart.ChartType = xlLineMarkersCho ch y l i Mc v i dòng l nh m i này, b n sẽ thu đ c m t ĐT d ng đo n th ng g p khúc;ạ ạ ớ ệ ớ ạ ượ ộ ạ ạ ă ấ(Dòng l nh này sẽ có trong Mc n u thu nh Mc DoThi2 nh ph n đ u c a bài, nh ng b c 1 ta ệ ế ư ư ở ầ ầ ủ ư ở ướch n lo i đ th đo n th ng)ọ ạ ồ ị ạ ăNh v y ta có th nh n hai lo i ĐT trên m t Mc; Nh ng còn m t đi u b t ti n là m i l n c ph i đ i ư ậ ể ậ ạ ộ ư ộ ề ấ ệ ỗ ầ ứ ả ổdòng l nh hay sao?! Có cách nào đ Mc t đi đúng h ng ta c n không?. ệ ể ự ướ ầCó & đó là cách chúng ta trao cho Mc m t bi n (m t tham s ) đ nó th c hi n; Bi n đó tùy lúc nh n ộ ế ộ ố ể ự ệ ế ậm t trong hai s li u quy c c a excel mà nó hi u đ c, c th đây là xlColumnClustered & ộ ố ệ ướ ủ ể ượ ụ ể ởxlLineMarkers; (các bi n này thu c ki u d li u Integer)ế ộ ể ữ ệTa thay Mc đó nh sauư

Code:

Sub DoThi1(LoaiDT As Integer) Range("A2:A7").Select Charts.Add‘ ActiveChart.ChartType = xlColumnClustered ActiveChart.ChartType = LoaiDT ‘xlLineMarkers. . . . . . . . End Sub

Sau khi s a & l u Mc này l i, tr v b ng tính & b m t h p phím ALT+{F8} ta không còn th y tên ử ư ạ ở ề ả ấ ổ ợ ấMc DiThi1 đ c li t kê trong danh sách. Nh ng nó không m t đâu các b n! N u b n đã l p m t Mc ượ ệ ư ấ ạ ế ạ ậ ộnào khác thì b m vô đó; b ng không b n b m ALT+{F11} thì CS VB sẽ xu t hi n đ b n xem xét & ấ ằ ạ ấ ấ ệ ể ạthao tác v i nó n u c n!ớ ế ầ

Cách g i Mc DoThi1 này khi đ n m c 4 c a bài sẽ đ c p đ n. Còn t i th i đi m này, mu n ki m tra ọ ế ụ ủ ề ậ ế ạ ờ ể ố ểs s a ch a c a b n đã đáng yên tâm ch a, ta vô CS VB nh v a nêu trên. Sau đó thu nh CS VB này ự ử ữ ủ ạ ư ư ừ ỏcòn chi m n a màn hình. Ti p theo vô menu View -> Immediate Window. Ta sẽ 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 này & kéo cho ệ ố ằ ướ ấ ộ ền m trung tâm c a CS VBằ ủ

B n b m tr chu t lên CS Immediate & nh p dòng l nh DoThi1 xlColumnClustered K t thúc b ng ạ ấ ỏ ộ ậ ệ ế ằphím ENTER đ Mc đ c th c hi n v i tham s xlColumnClustered. N u k t qu my mãn, b n ghi ể ượ ự ệ ớ ố ế ế ả ạtham s th hai vô & ki m ch ng l n n a đ hoàn toàn yên tâm.ố ứ ể ứ ầ ữ ể

Sau đây ta l p thêm m t Mc bi u đ hình bánh đ n gi n n a. Vì sao tôi nói đ n gi n, vì chúng ta ch aậ ộ ể ồ ơ ả ữ ơ ả ư tinh ch nh cho các ĐT d nhìn h n m t tý t o nào c !ỉ ễ ơ ộ ẹ ả

3.D ng đ th d ng hinh banh đ n gi n & co mi ng tach r iư ô i ạ ơ a ê ơ

Ta t o Mc có tên DoThiB b ng cách vô menu Tool ->Macro->Record New Macro. . . nh t ng quen ạ ằ ư ừthu c. Th c hi n các b c ti p theo cũng r t quen v i chúng ta, đó là:ộ ự ệ ướ ế ấ ớ

- Quét ch n vùng d li u t A2 đ n A7; b m vô bi u t ng t o ĐT trên thanh công c ;ọ ữ ệ ừ ế ấ ể ượ ạ ụ

Page 37: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

- T i b c 1 c a 4 b c t o ĐT, chúng ta ch n Pie trong CS Chart Type; T i CS Chart Sub-Type bên ạ ướ ủ ướ ạ ọ ạph i xu t hiên 6 lo i bánh; ta ch n lo i gi a hàng trên;ả ấ ạ ọ ạ ữ

- Ch p nh n m c đ nh c a các b c hai & ba & n ngay phím Finish b c 4;ấ ậ ặ ị ủ ướ ấ ở ướ

- T i ĐT hình bánh m i xu t hi n, ta kích ho t các bánh & sau đó ch n m t bánh (khi đ c ch n, trênạ ớ ấ ệ ạ ọ ộ ượ ọ vi n viên phân đó xu t hi n 6 nút đánh d u; ta n chu t vô viên phân đó & kéo rê ra xa tâm c a bánh ề ấ ệ ấ ấ ộ ủm t chútộ

- Ta k t thúc thu Mc t i đây;ế ạ

/(/ u Mc c a b n gi ng nh d i đây là t t r i; T i hai dòng cu i c a Mc đ c p nói lên viên phân ế ủ ạ ố ư ướ ố ồ ạ ố ủ ề ậth m y trong các viên phân đ c ch n & kéo ra kh i các t p h p c a chúngứ ấ ượ ọ ỏ ậ ợ ủ

Code:

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 = 30

End Sub

Ghi chú: Vì ta ghi Mc b ng nh ng hành đ ng th t đ n gi n nên các b n t suy lu n & d ch ngôn ng ằ ữ ộ ậ ơ ả ạ ự ậ ị ữVBA hai Mc này!N u b n nào không t t o đ c Mc cho mình thì cách cu i cùng là chép hai Mc này vô CS VB c a b n ế ạ ự ạ ượ ố ủ ạđ xài t m;ể ạTrong th c t , vi c ch nh dáng ĐT không lúc nào là không th c hi n; nh ng đây chính là chúng ta ự ế ệ ỉ ự ệ ư ởquan tâm đ n vi c t o ĐT b ng VB. Còn sau khi đã thành th c thì nâng đ khó c a Mc là chuy n c a ế ệ ạ ằ ụ ộ ủ ệ ủb n. H n n a sau khi ch y Mc v i nh ng s li u khác nhau, b n ph i chu t vô ph n ĐT c n ch nh ạ ơ ữ ạ ớ ữ ố ệ ạ ả ộ ầ ầ ỉs a & hoàn thi n chúng cũng không mu n.ử ệ ộ

3.Dung OptionButton g i th c hi n m t Mco ư ê ộ

Page 38: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

/(/ói tr c là trong excel có hai lo i OB (Option Button); Lo i đ u tiên ta sẽ th y ngay sau đây; lo i ướ ạ ạ ầ ấ ạth hai trong thanh công c Forms. Mu n nhanh chóng th y thanh công c này ta ph i chu t lên ứ ở ụ ố ấ ụ ả ộvùng tr ng c a ToolBar & ch n dòng Forms.ố ủ ọ(òn mu n làm vi c v i lo i đ u tiên ta cũng ph i chu t vô vùng nh trên; Sau đó ch n dòng Control ố ệ ớ ạ ầ ả ộ ư ọToolbox. Khi đó xu t hi n trên màn hình thanh công c Control Toolbox g m th ng 15 nút. Nút ấ ệ ụ ồ ườchúng ta quan tâm là nút khi ta đ chu t vô nó m t th i gian đ lâu, sẽ hi n lên dòng Option Button.ể ộ ộ ờ ủ ệ

Ta nh p chu t lên nút & đ n vùng nào đó còn tr ng mà b n mu n đ t nút này lên. n trái chu t & ấ ộ ế ố ạ ố ặ Â ộkéo vẽ hình ch nh t chi m tr n 4 ô (VD B9:C10); b m lên ch tr ng trên trang tính. Sau đó b n ph iữ ậ ế ọ ấ ỗ ố ạ ả chu t lên nút l nh đ xem menu t t c a nó. Trên nó có dòng View code ta n vô đó. L p t c CS VB mộ ệ ể ắ ủ ấ ậ ứ ở ra & có d n s n cho ta b a di m tâm g m: ọ ẵ ữ ể ồ

Code:

Private Sub OptionButton1_Click() End Sub

Trích:

Dòng l nh ta thêm vô gi a hai dòng này: msgbox “1”,,”OK”ệ ữ

Xong ta đóng CS VB b ng t h p ATL+Qằ ổ ợ

Th c hi n l p l i v i 1 OB n a; nh ng l n này v i dòng l nh msgbox “2”, , “OK”ự ệ ặ ạ ớ ữ ư ầ ớ ệ

Ti p t c phát huy chiên qu v i OB th ba, ch khác dòng l nh gi là dothib (đó là tên Mc t o ĐT ế ụ ả ớ ứ ỉ ệ ờ ạd nh bánh mà ta đã thu. N u không sai thì VBA sẽ s a tên c a MC ta v a g tr thành đúng c a nó ạ ế ử ủ ừ ỏ ở ủ(đó là DoThiB)

Tr v trang tính, sau m t vài phút (suy) ngh , ta ti p t c ph i chu t vô cac OB & ch n format ở ề ộ ỉ ế ụ ả ộ ọControl; vô ngăn Properties b ch n nút Print Object, nh ng l i ch n nút Don’t move or size with ỏ ọ ư ạ ọCells. (Vi c này nên th c hi n cho c ba OB m i có í nghĩa)ệ ự ệ ả ớ

L i ph i chu t vô OB, ch n dòng OptionButton Object => Edit; Con tr nháy lên các ch m c đ nh c aạ ả ộ ọ ỏ ữ ặ ị ủ Excel; Ta s a chúng l n l t là: Đ th d ng c t; Đ th đo n th ng & Đ th d ng bánh.ử ầ ượ ồ ị ạ ộ ồ ị ạ ă ồ ị ạ

K t thúc công vi c xem ra m i mẽ & kó a này b ng cách thoát v windows đ l u m i thao tác c a ế ệ ớ ư ằ ề ể ư ọ ủta l i;ạ

Sau đó l i m trang tính Dothi đó ra trong excel; chúng ta th ch n lên l n l t t ng nút OB xem đi uạ ở ử ọ ầ ượ ừ ề gì s y ra?!; Ph i là v y:ả ả ầ

n lên nút (1) sẽ hi n lênh h p tho i Dòng tiêu đ có ch ‘OK’, d i nó là dòng ‘1’ & nút ‘OK’; B n  ệ ộ ạ ề ữ ướ ạph i b m vô nó m i làm vi c khác đ c!ả ấ ớ ệ ượ

Nút th hai cũng t ng t ; Nút th ba b ch n sẽ xu t hi n ĐT hình bánh!ư ươ ự ứ ị ọ ấ ệ

4. M t Mc truy n thông s cho m t Mcộ ề ô ộ

Ta bi t r ng Mc DoThi1 c n đ c nh n l n l t hai bi n khác nhau đ vẽ lên hai d ng đ th khác ế ằ ầ ượ ậ ầ ượ ế ể ạ ồ ịnhau; Ta đã có 2 OB; nh v y vi c còn l i sẽ nh con th ăn c mà thôi:ư ậ ệ ạ ư ỏ ỏ

Tr c tiên mà c n bi t tìm nhanh 3 cái Mc VB t o ra chúng n m đâu?ướ ầ ế ạ ằ

Ta phài chu t vô ô DoThi c a thanh li t kê trang tính (góc trái d i màn hình;ộ ủ ệ ướ

Page 39: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Ta vô thăm nh ng gì có trong dòng View Code; Sẽ đúng n u ta l i th y ba cái anh chàng mà ta & VB đãữ ế ạ ấ cùng nhau n n ra hình hàiặ

Ta s a hai anh đ u thôi, đ có n i dung sau: ử ầ ể ộ

Code:

Private Sub OptionButton1_Click() DoThi1 xlColumnClusteredEnd Sub

Private Sub OptionButton2_Click() DoThi1 (xlLineMarkers) End Sub

Chú ý:

· Sau khi l u & m l i sheets(“DoThi”) ta không th ph i chu t vô các OB đ s a nh ng sai l ch đ c ư ở ạ ể ả ộ ể ử ữ ệ ượn a; (VD chuy n t tên g i ‘Đ th bánh’ sang ‘Đ th d ng bánh’); Ch có cách là cho hi n thanh công ữ ể ừ ọ ồ ị ồ ị ạ ỉ ệc Control Toolbox; B m vô nút có hình ê ke có Tool Tip là Design Mode, sau đó ch n OB c n hi u ụ ấ ọ ầ ệch nh,. Sau khi hi u ch ng xong ta l i b m bi u t ng th c ê ke m t l n n a, lúc này ph n đ u c a ỉ ệ ỉ ạ ấ ể ượ ướ ộ ầ ữ ầ ầ ủTool Tip có thêm ch Exit ữ

· Th c ra hai cách truy n tham s nh trên cùng đ c VB ch p nh n, ta nên ch n m t cách nào th y ự ề ố ư ượ ấ ậ ọ ộ ấthu n ti n! ậ ệ

Đ n th i đi m này sẽ phát sinh các câu h i:ế ờ ể ỏ

1. N u nhu c u truy n nhi u h n m t tham s thì sao?ế ầ ề ề ơ ộ ố

2. Ch Private kia tr c ch Sub có nghĩa gì?ữ ướ ữ

3. Có cách nào khi Mc g i l nh th c hành Mc DoThi1 mà quên (hay vì lí do gì đó không tìm ra thông s ọ ệ ự ốđ ) truy n tham s thì Mc Dothi1 c l y m t tham s nào đó & ch y hay không?ề ề ố ứ ấ ộ ố ạ

Nh ng v n đ này sẽ đ c p t i trong nh ng l n sau, n u có d p. Nh ng các b n có th t tìm hi u ữ ấ ề ề ậ ớ ữ ầ ế ị ư ạ ể ự ể ở đâu đó tr c xem sao?ướ

. .Bài 8 Macro l p PivotTable. â

1. T 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à: ượ ọ

Page 40: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 McếMc 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 ô ph 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) c a trang tí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 ‘’(B n hi u r i!)ạ ể ồ‘T ng h p theo NCC, v i các danh sách c t trong tr ng [Tinh], các hàng là tr ng [THg]ổ ợ ớ ộ ườ ườ‘vô trang tính có tên ‘PivotTable1’ (Trang này do VB gán cho):806 ActiveSheet.PivotTables("PivotTable1").AddFields RowFields:="THg", _ ColumnFields:="Tinh", PageFields:="NCC"‘ V i tr ng [TTien] trong ‘PivotTable1, ti n hành đ nh d ng d nh d ng d li u k u sớ ườ ế ị ạ ị ạ ữ ệ ể ố‘ v i 1 ký 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 có mã RDEầ ệ ẩ ặ With ActiveSheet.PivotTables("PivotTable1").PivotFields("THg")810 .PivotItems("RDE").Visible = False End WithEnd Sub

Th 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. Xoa m t PivotTable nh macroộ ơ

Đ xóa 1 trang tính (VD nh trang PivotTable) m t cách t đ ng, ta ph i l i d ng tính t đ ng gán ể ư ộ ự ộ ả ợ ụ ự ộtên trang tính khi Excel kh i t o; Mu n v y ta đ i tên các trang tính có tên m c đ nh đi, đ tránh b ở ạ ố ậ ổ ặ ị ể ịxóa nh m.ằ

Page 41: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Sau đó ta ch y Mc PiVotTable đ nó t o ra 1 b ng t ng h p;ạ ể ạ ả ổ ợTh c hi n thu Mc đ xóa b ng v a t o có tên XoaTrang. Nó có hai câu l nh nh sauự ệ ể ả ừ ạ ệ ư

Code:

Sub XoaTrang() Sheets("Sheet1").Select: ActiveWindow.SelectedSheets.DeleteEnd Sub

Mc này còn vài khi m khuy t: Nó ch bi t xóa trang tính có tên ‘Sheet1’ mà thôi; Không nh ng th nó ế ế ỉ ế ữ ếcòn hay h i lôi thôi! Đ th y đi u này b n th cho ch y Mc PivotTable & sau đó xóa th trang tính ỏ ể ấ ề ạ ử ạ ửv a t o b ng Mc sẽ bi t ngay!ừ ạ ằ ếChúng ta sẽ tác đ ng đ n Mc này đ có năng l c xóa 9 trang tính n u có trên workbook c a ta & sẽ ộ ế ể ự ế ủc m đ u làm thôi, kh i h i n a! N i dung Mc sẽ 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 Sub

Trong Mc này nhi m v ch y u là: n u g p các trang tính có tên Sheet(i) mà i=1-9 thì xóa đi, N i ệ ụ ủ ế ế ặ ộdung c a nó đ c th hi n trong vòng l p For . . .. . Next.ủ ượ ể ệ ặĐ tránh vi c h i l i, mà c xóa h t ta đã dùng câu l nh:ể ệ ỏ ạ ứ ế ệApplication.DisplayAlerts = FalsePhía sau câu l nh này, VB sẽ không h i chúng ta n a cho đ n khi g p l i câu l nhệ ỏ ữ ế ặ ạ ệApplication.DisplayAlerts = TrueĐ tránh l i, trong Mc có b ph n bãy & x lý l i & d ch câu l nh đ u tiên trong Mc là: ể ỗ ộ ậ ử ỗ ị ệ ầLoiMacro là n i đ n n u g p l i ơ ế ế ặ ỗV y cái n i mà ph i đ n này làm nh ng vi c gì?ậ ơ ả ế ữ ệa.) N u b n b l i có mã l i là 9 (Err = 9) thì đ n đ a ch errMacro đ gi i quy t; ế ạ ị ỗ ỗ ế ị ỉ ể ả ế(Th c ra đ n đây đ r a ki m & ngh đó thôi: )ự ế ể ữ ế ỉb.) N u mã l i <> 9 thì: Sẽ th c thi m t trong hai tr ng h p sau:ế ỗ ự ộ ườ ợo N u iJ < 9 thì th c hi n các câu l nh ti p sauế ự ệ ệ ếo N u iJ =9 thì đ a ra l i khuyên: Hãy t xóa PivotTable v a t o & ti p nh a.)ế ư ờ ự ừ ạ ế ưTr ng h p gì sẽ di n ra n u tôi có ba trang tính v i các tên: ‘Sheet1’, ‘Sheet2’ & ‘Sheet4’? Khi ch y ườ ợ ễ ế ớ ạMc ClearTable nó sẽ ch a l i trang tính cu i, đ ta làm ky ni m!ừ ạ ố ể ệĐ VB gi i thích cho rõ thêm v l i có mang mã s 9 (cũng nh các mã khác n a) ta cho hi n CS ể ả ề ỗ ố ư ữ ệ

Page 42: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Immediate nh bài tr c đã nêu. Gõ vô đó dòng l nh: ? Error$(9) & n ENTER đ bi t thêm. ư ướ ệ ấ ể ế

3. Ng i dung t ch n l a cac tr ngươ ư o ư ươ

/(/ u ta đi qua ba b c t o PivotTable cũng khá m t th i gian, nh t là ch c n kh o sát nh ng ch ế ướ ạ ấ ờ ấ ỉ ầ ả ữ ỉtiêu m t cách đ n gi n nh ng l làng.ộ ơ ả ư ẹTi p theo chúng ta sẽ k t h p Mc & s h tr c a ComboBox & listBox trong thanh công c Forms thì ế ế ợ ự ỗ ợ ủ ụtăng t c đáng k vi c t o PivotTable;ố ể ệ ạĐ đ c v y, tr c tiên ta t o Sheet có tên ‘CrTab’ theo file đính kèm. Trên nó ta g n 1 LB (listbox) ể ượ ậ ướ ạ ắ(t i đ u c t H) & d i nó là m t CB (ComboBox);. G n s n thêm m t nút l nh đ ch y Mc t o PT ạ ầ ộ ướ ộ ắ ẵ ộ ệ ể ạ ạ(PivotTable) (Nút đang có nhãn ‘New Pivot’).Khi trên LB hi n t Row, n u ch n tr ng nào đó trong CB thì Mc n trong CB sẽ gán tên tr ng đó ệ ừ ế ọ ườ ẩ ườvô ô B3 (đ Mc t o PT l y làm hàng). T ng t n u LB có t Column thì sẽ gán đ n C2 tên tr ng ể ạ ấ ươ ự ế ừ ế ườdùng đ làm c t cho PT & sẽ là DATA n u t i LB là Data.ể ộ ế ạN i dung hai Mc đó nh sau:ộ ư

Code:

Sub ChonTruong() Dim Truong As Integer, SRng As String Truong = Range("E1").Value ‘---->’E1’ là ô 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 này đã đ c đ c p đ n ệ ượ ề ậ ế Dim sRField As String, sCField As String, sDField As String Dim iRange As Range ‘<= Khai báo bi n có ki u d li u là rangeế ể ữ ệ Application.ScreenUpdating = 0sRField = Range("B3").Value ‘ß Th c hi n các phép gán giá tr cho các bi n:ự ệ ị ế sCField = Range("C2").Value: sDField = Range("C3").Value Sheets("PiVot").Select: Range("B12").Select Selection.CurrentRegion.Select ‘ <= Ch n vùngọSet iRange = Selection ‘ <= Vùng ch n đem gán vô bi n iRange (đã khai bá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 Sub

Page 43: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Chú ý: Câu l nh cu i cùng trong Mc trên đ c d ch là: K t qu c a hàm VLOOKUP() v i các tham ệ ố ượ ị ế ả ủ ớs tu ng ng trong ng d ng c a Excel đem gán làm d li u c a vùng có đ a ch ng v i SRng ố ơ ứ ứ ụ ủ ữ ệ ủ ị ỉ ứ ớSo v i l nh t o PT mà ta ghi thông qua b thu Mc thì đây (dòng l nh 830) kh i t o PT b ng m t ớ ệ ạ ộ ở ệ ở ạ ằ ộcách t ng đ i khác. D ch dòng l nh đó là: PivotTable6 sẽ là tên, vùng d li u ch a trong bi n irange ươ ố ị ệ ữ ệ ứ ếlàm ngu n, kh i t o 1 PivotTale thu c lo i c s d li u. R i sau đó m i đ nh ra các thu c tính c a ồ ở ạ ộ ạ ơ ở ữ ệ ồ ớ ị ộ ủPT đó nh : (832) L y d li u trong bi n sDField làm PageField, l y d li u trong bi n sCField làm ư ấ ữ ệ ế ấ ữ ệ ếcác c t; l y d li u trong bi n sRField làm các hàng;ộ ấ ữ ệ ế(833): Tình t ng là t ng ch a trong bi n sDField, t ng h p d li u ch a trong bi n sDField và đ a vôổ ổ ứ ế ổ ợ ữ ệ ứ ế ư là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) c a sheetsư ổ u

Cho đ n tr c bài này, khi mu n xem xét n i dung m t Mc (macro) nào đó ta th ng vô menu ế ướ ố ộ ộ ườTool->Macro ->Macros. . . ( hay cùng lúc 2 phím nóng ALT+{F8} đ vô CS (c a s ) Mc.ể ử ổNh ng có lúc cũng đã đ c p đ n cách nhanh đ vô VB riêng rẽ c a m t sheet c th nào đó b ng ư ề ậ ế ể ủ ộ ụ ể ằcách ph i chu t vô tên sheet đó trên thanh li t kê tên sheets. Đ m c này chúng ta sẽ nghiên c u sâu ả ộ ệ ề ụ ứh n v các thành ph n s n có trong CS VB c a m t sheet này.ơ ề ầ ẵ ủ ộHãy m l i b ng tính c a b n v bài đ th (bài 7); trong đó có các Mc d ng sau:ở ạ ả ủ ạ ề ồ ị ạ

Code:

Private Sub OptionButtonN_Click()DoThi1 [ThongSo]

End Sub

(Mà đây N=1-3); V n đ quan tâm c a chúng ta lúc này không ph là các Mc này, mà là CS VB hi n ở ấ ề ủ ả ệhành; B n ki m l i xem có ph i nó nh d i đây không?ạ ể ạ ả ư ướThanh tiêu đ CS có ghi Microsoft Visual Basic – [WordBookName] – [SheetN (Code)]; D i đó là ề ướthanh menu & thanh công c ; D i thanh công c có hai CS; CS bên trái g i là Object; Cái kia: ụ ướ ụ ọProcedure. Ta ch tâm vô các CS này.ủ/(/ u b m vô mũi tên h ng xu ng trong CS trái ta th y li t kê ngoài tên 3 Mc trên còn có hai dòng: ế ấ ướ ố ấ ệ(General) & WorkSheet a./ N u ch n dòng trên cùng thì CS bên ph i xu t hi n dòng (Declarations)ế ọ ả ấ ệT i vùng này chúng ta có th khai báo các h ng s cũng nh các bi n dùng chung trong các Mc bên ạ ể ằ ố ư ếd i. T i đây ta có th khai báo các tùy ch n nh : ướ ạ ể ọ ư Option ExplicitTùy ch n này b t bu c các bi n ph i đ c khai báo tr c khi dùng; Đi u này r t nên làm, nh t là ọ ắ ộ ế ả ượ ướ ề ấ ấnh ng ng i m i v vẽ v VBA.ữ ườ ớ ỏ ềĐ áp đ t m i bi n ph i luôn đ c khai báo trong excel, t i CS VB ta vô menu Tool -> Option. Trong ể ặ ọ ế ả ượ ạngăn Editor c a h p tho i Option ta đánh d u ch n vô hàng th hai: Require Variable Declaration & ủ ộ ạ ấ ọ ứ

n OK đ thi t đ t chúng k t th i đi m nà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 Explicitưb./ N u ch n dòng cu i cùng thì bên ph i sẽ có 9 đ m c hi n lên. Ta sẽ th bi t các lo i hình ngh ế ọ ố ả ề ụ ệ ử ế ạ ệthu t m i m này:ậ ớ ẻN u ta ân chu t lên dòng đ u; l p t c t i CS VB sẽ có 2 dòng cole xu t hi nế ộ ầ ậ ứ ạ ấ ệ

Code:

Private Sub Worksheet_Activate()End Sub

Đ ti t ki m th i gian ta sẽ nh p vô h t 6 Mc này câu l nh có cùng d ng nh sauể ế ệ ờ ậ ế ệ ạ ưMsgbox “[T ng ng]” vô gi a 2 dòng l nh trênươ ứ ữ ệNh tr ng h p (1) trên sẽ là MsgBox “Activate”; Tr ng h p (3) – “Right Click”; ư ườ ợ ườ ợ

Page 44: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Áp d ng nh v y cho các dòng ti p theo (tr dòng 7 & 8)ụ ư ậ ế ừNh v y dòng (9) sẽ là MsgBox “SelectionChange. L u & thoát v trang tính b ng menu c a VB hay ư ậ ư ề ằ ủb ng phím ALT+Q. ằTa th b m vô m t ô tr ng b t kỳ, sẽ th y h p tho i t ng ng xu t hi nử ấ ộ ố ấ ấ ộ ạ ươ ứ ấ ệTi p theo ta nh p v đó 1 giá tr 9 & b m ENTER sẽ có 2 h p tho i hi n lên mà cái tr c ghi là ế ậ ố ị ấ ộ ạ ệ ướ‘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 c a 3 ế ữ ộ ướ ố ậ ứ ể ể ứ ứ ự ủh p tho i; Sau đó ta ph i chu t vô ô ch a công th c v a l p xem sao?!ộ ạ ả ộ ứ ứ ừ ậCó nghĩa là đ n gi b n g p không ít phi n toái khi ph i di chuy n trong trang tính, đi đâu cũng b ế ờ ạ ặ ề ả ể ịh i ‘gi y t ’! Đ b t đi n i phi n mu n ta vô hi u hóa Mc có ch a h p tho i SelectionChange đi.ỏ ấ ờ ể ớ ổ ề ộ ệ ứ ộ ạB n tìm các cách đ hi n h t 6 h p tho i & t rút ra k t lu n cho mình;ạ ể ệ ế ộ ạ ự ế ậSau khi b n đã nhuy n v i 6 h p tho i ta vô hi u hóa chúng đi vì ch gây phi n phúc. ạ ễ ớ ộ ạ ệ ỉ ềXin gi i thi u các b n m t ng d ng kỳ di u c a v n đ này trong công vi c nh p li u c a chúng ta. ớ ệ ạ ộ ứ ụ ệ ủ ấ ề ệ ậ ệ ủTôi có b ng tính l u gi CSDL (c s d li u) g m các tr ng [TT], [Ngay], [MaHg], [SoLg], [Dgia], ả ư ữ ơ ở ữ ệ ồ ườ[Ttien]. . . .Tôi mu n ch c n nh p mã hàng thì VB sẽ t nh p cho tôi d li u tr ng [Ngay] (ghi ngày tháng năm ố ỉ ầ ậ ự ậ ữ ệ ườnh p/xu t hàng). Mc có n i dung nh sau:ậ ấ ộ ư

Code:

Private Sub Worksheet_Change(ByVal Target As Range)'Hàm S D ng T t Trong Tr ng H p Nh p/Xu t Hàng Hóa Theo Ngày/Thángử ụ ố ườ ợ ậ ấ901 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 là m t bi n, nh ng không ph i c a ta, vì ta ch a khai báo bao gi . Mà ph i hi u Ở ể ộ ế ư ả ủ ư ờ ả ểlà c a VB; & nh ng gì c a VB thì nên trách xa, n u không s b đòn! Bi n này sẽ đ i di n cho ô mà ta ủ ữ ủ ế ợ ị ế ạ ệđang mu n thay đ i giá tr nó ch a;ố ổ ị ứ

Câu l nh 901 trong Mc tác gi đã dùng ph ng th c Intersect ( Range1, Range2[,. . . ]). Đ n th i ệ ả ươ ứ ế ờđi m này ta ch c n hi u nó nh sau: Ph ng th c ki m tra xem vùng ô Range1 có giao ( g p, c t, ể ỉ ầ ể ư ươ ứ ể ặ ắthu c ,bao hàm . . .) v i vùng ô Range2 hay không?ộ ớCâu l nh 901 đ c d ch là: n u không là không giao gi a c t C v i ô đang b thay đ i thì (th c hi n ệ ượ ị ế ữ ộ ớ ị ổ ự ệl nh 901 – 905) ệ(M nh đ ph đ nh c a ph đ nh ch không h đánh máy nh m đâu!)ệ ề ủ ị ủ ủ ị ứ ề ằ902: N u ô b thay đ i này không r ng (v a nh p mã hàng m i) thì (th c hi n l nh 903)ế ị ổ ỗ ừ ậ ớ ự ệ ệ903: D li u ngày tháng hôm qua gán vô ô bên trái li n k v i ô đang b thay đ iữ ệ ề ề ớ ị ổNh v y khi ô đang thay đ i có nh p giá tr & nó thu c c t ‘C’ thì gán vô ô c t B li n k giá tr ngày ư ậ ổ ậ ị ộ ộ ộ ề ề ịtháng. Nh v y VB đã thay ta nh p giá tr ngày tháng ta c n;ư ậ ậ ị ầChú ý: Đi u gì sẽ di n ra khi ta thêm vô cu i dòng 903 l nh sau: (Có 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 & ch n ti p Project Explorer (CTRL+R) ta sẽ th y xu t ọ ế ấ ấhi n bên trái m t CS Project – VBAProject, mà trong nó hi n s đ nhánh cây li t kê các đ i t ng ệ ộ ệ ơ ồ ệ ố ược a workbook g m 2 dòng chính:ủ ồ

Page 45: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Code:

Microsoft Excel ObjectsModules

Trong hàng đ u li t kê t t c nh ng worksheets, nh ng tên ch y u là c a Excel gán cho (Còn tên ta ầ ệ ấ ả ữ ư ủ ế ủgán là th y u nên đ trong d u ngo t). Nh ta nh p đúp vô tên nào đó, thì bên CS chính sẽ hi n lên ứ ế ể ấ ặ ư ấ ệcác Sub c a sheet đó.ủ

N u chúng ta b m đúp vô dòng Modules thì sẽ hi n li t kê nh ng modules đã [b]có trong ế ấ ệ ệ ữworkbook (VD module1, Module2. . . . .)Ta b m vô hàng ThisWorkbook ( phía trên dòng Modules) Và đóng CS Project b ng nút Close góc ph iấ ằ ả phía trên c a nó. CS này c u trúc gi ng nh ta đã t ng g p (c a sheets). Nh ng khi ta ch n ủ ấ ố ư ừ ặ ủ ư ọWorkbook bên CS Object, thì bên Procedure xu t hi n r t nhi u ph ng th c l a ch n. Ta nh p dòngấ ệ ấ ề ươ ứ ự ọ ậ l nh sau vô ph ng th c Open: ệ ươ ứ

Code:

Private Sub Workbook_Open() MsgBox "Open WB"End Sub

Sau đó ta thoát v Excel & l i m l i WorkBook này đ xem làm vi c c a Mc.ề ạ ở ạ ể ệ ủChú ý: M t cách nhanh nh t đ đ n CS ch a module c a WorkBook là: Bên trái h n c a menu File ộ ấ ể ế ứ ủ ơ ủ(CS Microsoft Excel) có bi u t ng excel; N u ta ph i chu t vô nó, dòng cu i c a menu đ xu ng sẽ ể ượ ế ả ộ ố ủ ổ ốlà View Code; Ta b m ch n dòng này ta sẽ ngay CS VB c a workbook;ấ ọ ở ủTa thay dòng l nh Msgbox “Open WB” nêu trên b ng dòng l nh sau:ệ ằ ệ

Code:

Application.OnTime Now + TimeValue("00:00:09"), "MyMacro"

Di n d ch câu l nh này nh sau: Ch y Macro có tên MyMacro sau 9 giây n a.ễ ị ệ ư ạ ữTuy nhiên đ n th i đi m này ta ch a vi t Mc MyMacro. H n n a Mc này nên có t i CS VB chu n. T ế ờ ể ư ế ơ ữ ạ ẩ ừCS module c a WorkBook ta v CS module chu n theo 1 trong 2 cách:ủ ề ẩ- Đóng CS module này l i & t i Ms Excel Ta nh n Atl +{F8}ạ ạ ấ- Cho hi n CS Project – VBAProject n u nó ch a hi n (menu View->Project Explorer) -> Modules -> ệ ế ư ệmodule1T i CS này ta nh p m t Mc đ n gi 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 Sub

Dòng l nh có ch a CHR(13) ch ng qua là l nh n i chu i ký t . B n th Mc làm vi c cũng b ng cách ệ ứ ă ệ ố ỗ ự ạ ử ệ ằđóng WorkBook l i & m ra m t cách bình th ng nh trên.ạ ở ộ ườ ưT i sao nói m ra m t cách bình th ng?, vì n u t i CS excel Ta n gi phím SHIFT & m file ch a Mcạ ở ộ ườ ế ạ ấ ữ ở ứ này thì Mc Workbook_Open không đ c excel đ m xĩa đ n!ượ ế ếTa nghiên c u ti p m t Mc c a WorkBook nũa, tr c khi sang ph n khác. Tr c tiên ta ph i chu t vôứ ế ộ ủ ướ ầ ướ ả ộ bi u t ng trái h n c a menu File & ch n dòng View Code;ể ượ ơ ủ ọN u trong CS Object bên trái có dòng Workbook; thì ta tìm dòng NewSheet & n ch n nó. Cũng nh ế ấ ọ ưtr c đây. M t Mc s n có xu t hi n, ch ta nh p l nh vô:ướ ộ ẵ ấ ệ ờ ậ ệ

Code:

Page 46: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Private Sub Workbook_NewSheet(ByVal Sh As Object)End Sub

đây Sh là m t bi n đ i t ng do VB khai báo và truy n cho Mc này. T t nhiên n u chúng ta c n Ở ộ ế ố ượ ề ấ ế ầdùng, chúng ta có th khai báo & s d ng lo i bi n này nh th ng, nh ng th t cân nh c vì hao ti n ể ử ụ ạ ế ư ườ ư ậ ắ ềt n c a l m!ố ủ ắM t bi n đ i t ng có th ch a hình ành, ch a m ng giá tr , thâm chí ch a c workbook c a excel ộ ế ố ượ ể ứ ứ ả ị ứ ả ủluôn!. . . Nh ng lúc c n ta sẽ xem xét sau; Còn gi đây chúng ta nh p các dòng này vô gi a hai dòng ư ầ ờ ậ ữl nh trênệ

Code:

Application.displayAlerts = FalseMsgbox “Sorry, you can’t add any more sheet to this workbook!”Sh.deleteapPlication.displayalerts= -1

Dòng l nh 1 ph c v cho dòng l nh 3: không cho hi n c nh báo khi xóa Sh;ệ ụ ụ ệ ệ ảDòng l nh cu i: ph c h i l i ch đ c nh báo; Dòng còn l i b n t d 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 functionư ế

N 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 Sub

Sau đó 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() ‘

Page 47: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 Function

Sau đó 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 -> Special

Ph n gi i thi u ngu n tài nguyên trên m ng:ầ ớ ệ ồ ạ

The SpecialCells Method in Excel VBA

One 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

Page 48: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

etc.

Type=XlCellType and can be one of these XlCellType constants.

xlCellTypeAllFormatConditions. Cells of any format

xlCellTypeAllValidation. Cells having validation criteria

xlCellTypeBlanks. Empty cells

xlCellTypeComments. Cells containing notes

xlCellTypeConstants. Cells containing constants

xlCellTypeFormulas. Cells containing formulas

xlCellTypeLastCell. 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 format

xlCellTypeSameValidation. Cells having the same validation criteria

xlCellTypeVisible. All visible cells

These arguments cannot be added together to return more than one XlCellType.

Value=XlSpecialCellsValue and can be one of these XlSpecialCellsValue constants.

xlErrors

xlLogical

xlNumbers

xlTextValues

These 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()

Page 49: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

ActiveSheet.UsedRange.SpecialCells _

(xlCellTypeFormulas).Interior.ColorIndex = 36

End Sub

Sub 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 rCell

End 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).Select

End Sub

Sub SelectAllBlanks2()

Range("A1").SpecialCells(xlCellTypeBlanks).Select End Sub

Page 50: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

So, as you can see, specifying only a single cell Range can give unwanted results.

SpecialCells for Formulae & Constants

While 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.

http://www.ozgrid.com/forum/showthread.php?t=61732&highlight=specialcells

Ph n giup đ trong c a s VBA:ầ ơ ư ổ

B n vô CS (c a s ) VBA b ng t h p fím ALT+{F11} & nh p các kí t sau: [color =”Blue”] ‘ ạ ử ổ ằ ổ ợ ậ ựSpecialCells. Sau đó bôi toàn b tên ph ng th c & nh n {F1} đ đ c excel gi i thích; Tuy nhiên gi iộ ươ ứ ấ ể ượ ả ả

thích này có th làm chúng ta c m th y không đ so v i ể ả ấ ủ ớ nh ng gì đã ghi trên ữ di n đàn đã nêuễ nh ưtrên;

Page 51: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Nh ng áp d ng c th ữ u u ểA. Ta xem l i l n l t các ví d nêu trên:ạ ầ ượ u1.- Tô màu n n cho các ô tr ng trong vùng s d ngề ố ử ụGi d trên trang tính tr ng ta nh pả ụ ắ ậ ‘Nam’ vô ô B2; ‘Thanh’ vô C3 & ‘Chanh’ vô ô D4 & cho ch y macroạ

ColorAllFormulae đ bi t xem nh ng ô nào đ c tô màu n n?!ể ế ữ ượ ề2.- Đ i d u d li u c a các ô công th cổ ấ ữ ệ ủ ứ B ng cách s d ng m t trong hai macro ằ ử ụ ộ đã nêu NegativeAllNumberFormula &

NegativeAllNumberFormula2

3.- Các tr ng h p đ m các ô không ch a d li uườ ợ ế ứ ữ ệĐ hi u rõ h n v câu l nhể ể ơ ề ệ UsedRange.SpecialCells(x) ta xét đ n ví d sau: Ta có trang tính tr ng; ế ụ ắT i D4 ta nh p tên ‘Lê’; ô D5 nh p ‘Hoa’ & ô D6 ta nh p =D4 & “ “ & D5. Sau đó cho ch y macro sau: ạ ậ ậ ậ ạSub CountAllBlanks()

ActiveSheet.UsedRange.SpecialCells(xlCellTypeBlanks).Select: MsgBox Selection.Count

Range("A1").SpecialCells(xlCellTypeBlanks).Select: MsgBox Selection.Count

End Sub

4.- Ch n vùng d li u ch a công th c hay tr ki u sọ ữ ệ ứ ứ ị ể ố B ng macroằ AllNummericCells

B. Ta xem các ph ng án ng d ng khác nhau trong 1 macro sau đây:ươ ứ uSub FillBlanks()

Dim Rng As Range: Dim iZ As Integer

iZ = InputBox("CHON PHUONG AN:", , "9")

Select Case iZ

Case 1 ’a: Nh p tr ‘0’ cho toàn th các ô tr ng trong vùng ch n ậ ị ể ố ọ Range("C1:D9").SpecialCells(xlCellTypeBlanks).Value = 0

Case 2 ’b: Xóa giá tr các ô trên c t ‘A’ t ng ng v i các ô trên c t B là tr ng ị ộ ươ ứ ớ ộ ố Columns("B:B").SpecialCells(xlCellTypeBlanks).Offset(0, -1).ClearContents

Case 3 ‘c: n/Xóa các dòng trong vùng t 10 đ n 40 khi ô trên c t A t ng ng là 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 dòng & đ a ch c a chúng, khi chúng không nệ ố ị ỉ ủ ẩ Set Rng = ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Rows

MsgBox ActiveSheet.UsedRange.SpecialCells(xlCellTypeVisible).Rows.Count, , Rng.Address

Case 5 ‘đ: Xóa giá tr các ô ch a s li u, nh ng không là công th c ị ứ ố ệ ư ứ ActiveSheet.Cells.SpecialCells(xlCellTypeConstants, 23).ClearContents

Case 6 ‘e: Xóa giá tr các ô ch a s li u trong vùng đ t tên ‘ConstantRef’ ị ứ ố ệ ặ

Page 52: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

On Error Resume Next Range("ConstantRef").SpecialCells(xlCellTypeConstants).ClearContents

On Error GoTo 0

case else

End Select

End 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 Select

End Sub

D. Các macro có th g p trong th c t sau đây:ể ặ ự ế1./ n hay xóa dong d li u theo các đi u ki n ữ ệ ề ệ M t khi ta mu n xóa (hay làm n đi) m t s dòng d li u theo nhi u đi u ki n khác nhau ta cò th ộ ố ẩ ộ ố ữ ệ ề ề ệ ểnh đ n Mcr (macro) ờ ế DeleteRowsWithSpecifiedData sau đây.

Sub DeleteRowsWithSpecifiedData()

29 Dim Rng As Range

1 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 = .Value

Page 53: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

21 If Rng Is Nothing Then

22 Set Rng = .SpecialCells(xlCellTypeConstants, xlErrors).EntireRow

23 Else

24 Rng = Union(Rng, .SpecialCells(xlCellTypeConstants, xlErrors).EntireRow)

25 End If

9 On Error Resume Next

'11 .SpecialCells(xlCellTypeConstants, xlErrors).EntireRow.Delete

5 End With

6 On Error GoTo 0

28 Rng.Hidden = True

7 Columns(1).EntireColumn.Delete

End Sub

Th t c nàyủ ụ g pộ chung c a hai ph ng án, đó là làm n hay xóa dòng d li u. Hi n t i th t c áp ủ ươ ẩ ữ ệ ệ ạ ủ ụd ng trong ph ng th c n các dòng d li u th a các đi u ki n. Khi mu n Mcr th c thi ph ng án ụ ươ ứ ẩ ữ ệ ỏ ề ệ ố ự ươxóa dòng d li u ta ph i:ữ ệ ảa./ Vô hi u hóa các dòng l nh có s l n h n 20 (b ng cách thêm d u nháy đ n vô tr c dòng l nh)ệ ệ ố ớ ơ ằ ấ ơ ướ ệb./ Hi u l c hóa dòng l nh s 11 (b đi d u nháy đ n đ u dòng l nh)ệ ự ệ ố ỏ ấ ơ ầ ệTa xét c th tr ng h p Mcr làm n các dòng d li u theo đi u ki n nêu t i dòng l nh 3, nh sau:ụ ể ườ ợ ẩ ữ ệ ề ệ ạ ệ ư Tr c tiên, Mcr thêm 1 c t vô trang tính, tr thành c t A m i;ướ ộ ở ộ ớ Ti p theo là dòng l nh yêu c u kh o sát vùng A1:A(i), đây i là dòng cu i cùng c a trang tính có ế ệ ầ ả ở ố ủch a d li u;ứ ữ ệ(Dòng l nh th 3 kh i di n d ch! H n n a trong th c t nó sẽ b thay đ i theo yêu c u c th c a ta)ệ ứ ỏ ễ ị ơ ữ ự ế ị ổ ầ ụ ể ủ Các dòng l nh t 21..25 nói r ng:ệ ừ ằ N u bi n Rng ch a đ c gán tr thì gán b ng dòng có ô A(j) hi n hành đang ch a giá tr l i (NA())ế ế ư ượ ị ằ ệ ứ ị ỗ Ng c l i, n u Rng đã đ c gán thì thêm vô nó m t dòng n a (b ng ph ng th c UNION).ượ ạ ế ượ ộ ữ ằ ươ ứ Dòng l nh 28 làm n vùng đ a ch ch a trong bi n Rng;ệ ẩ ị ỉ ứ ếCu i cùng là xóa c t ph mà Mcr đã t o, đ tr v tr ng thái đ a ch ô c a trang tính ban đ u.ố ộ ụ ạ ể ả ề ạ ị ỉ ủ ầ

2./ Kh l n l t các ô tr ng trong 4 c t đ u tiên c 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 sẽ chép d li u phía d i lên ô tr ng m t cách liên t c.ắ ầ ừ ộ ữ ệ ướ ố ộ ụVí d c t A t A2 đ n A336 có hai ô tr ng thì sau khi Mcr ch y g n n a đo n đ ng, thì t i c t A d ụ ộ ừ ế ố ạ ầ ữ ạ ườ ạ ộ ữli u sẽ có t A2 đ n A334ệ ừ ế3./ Xóa các dong thoa m t trong hai đi u ki n t i hai c tộ ề ệ ạ ộGi d ta có 1 c s d li u v h c sinh. Cu i năm c n l p DS (danh sách) nh ng em đ c lên l p; DSả ụ ơ ở ữ ệ ề ọ ố ầ ậ ữ ượ ớ ch là nh ng h c sinh t i thành ph (tr ng [TINH] t i c t ‘N’ hi n có các mã HCM, DN, LA, BD & BT); ỉ ữ ọ ạ ố ườ ạ ộ ệ

Page 54: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

H c sinh l i l p đã đ c ghi chú vô c t ‘O’. g m có ‘HK Kem’, ‘O Lai’, ‘Nghi Hoc’ & ‘Bo Hoc’. Mcr d i ọ ở ạ ớ ượ ộ ồ ướđây sẽ th c thi nhi m v m t cách hoàn h 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 th t c có dùng hai ph ng th c ủ ụ ươ ứ Intersect & Union. Hai ph ng th c này mình đã có gi i ươ ứ ớthi u m t bài trên di n đàn. (Tìm ki m b ng t khóa Intersect)ệ ộ ễ ế ằ ừ

4./ Bi n các ô công th c trong vùng ch n thà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 th vùng d li u c n thi t bi n t d ng công th c sang ệ ầ ậ ỗ ể ị ữ ệ ầ ế ế ừ ạ ứd ng d li u, ví d : ‘A1:B99’ hay ‘A$9:$B500’ ho c ‘$A$2:$U$78’ạ ữ ệ ụ ặCâu l nh 4: Các ô ch a công th c trong vùng ch n trên đ c đem gán vô bi n RngSC đã khai báo.ệ ứ ứ ọ ượ ếCâu l nh 6: Các ô nào thõa v i ph ng th c Intersect gi a ô công th c (c 4) & vùng ch n ban đ u (c3)ệ ớ ươ ứ ữ ứ ọ ầ đ c gán l i vô bi n rRange;ượ ạ ếCác câu l nh 5, 7 dùng đ thoát kh i ch ng trình khi không có ô nào thõa đi u ki n;ệ ể ỏ ươ ề ệCâu l nh 15 chính là câu bi n các ô ch a công th c thành các ô ch a tr ;ệ ế ứ ứ ứ ịCu i cùng, câu l nh 21 dùng đ báo là chúng ta không xài các bi n thu c lo i Range n a; M c đích ố ệ ể ế ộ ạ ữ ụ

Page 55: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

ch y u là thu h i b nh , tránh lãng phí tài nguyên.ủ ế ồ ộ ớ5./ Sao chep vùng l c sang m t Sheet m iọ ộ ớTrong Mcr sau chúng ta có d p xem xét đ n cách s d ng ph ng th c SpecialCells đ i v i trang tính ị ế ử ụ ươ ứ ố ớđã qua l c. Sau khi th c hi n l c t các dòng d li u, chúng ta mu n chuy n chúng sang m t sheet ọ ự ệ ọ ừ ữ ệ ố ể ộkhác đ làm báo cáo, thì Mcr CopyAFilter sẽ ph c v b n m t cách mi n phí: ể ụ ụ ạ ộ ễ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 Sub

6./ Các b n t tìm hi u 3 Mcr nà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 Sub

Bài 11. Tìm hi u các ph n t t p h pể ầ ư â ợ

N u các b n ch a có khái ni m v toán cao c p thì khi đ c nh ng trang này c n liên h m t thi t v i cácế ạ ư ệ ề ấ ọ ữ ầ ệ ậ ế ớ v t th t n t i quanh ta. T đó sẽ giúp chúng ta cùng nhau hi u các ph n t trong excel d h n.ậ ể ồ ạ ừ ể ầ ử ễ ơ

[B]1./ Ph n t là gì? [/b]ầ ử

Page 56: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

[I]a./ Ph n t thu c v t p h pâ ư ô ê ậ ơ :[/I] Trong th gi i quanh ta, thì thành ph , c quan, công s , tr ng h c,ế ớ ố ơ ở ườ ọ phân x ng, công nhân viên. . . đ u là các ph n t . Ph n t có th ch a các lo i ph n t khác. T nh thànhưỡ ề ầ ử ầ ử ể ứ ạ ầ ử y ư ph có nhi u tr ng & trong tr ng có nh u l p h c, trong l p l i có nhi u h c sinh.ố ề ườ ườ ề ớ ọ ớ ạ ề ọ

M i nhân viên là m t ph n t thu c v m t lo i ph n t khác: công s (c quan). Đ xác đ nh m t nhânỗ ộ ầ ử ộ ề ộ ạ ầ ử ở ơ ể ị ộ viên, b n có th ch ra tên ( anh Tr n An), ch v trí (đ ng nghi p ng i góc ph i cu i phòng), ch tính ch tạ ể ỉ ầ ỉ ị ồ ệ ồ ả ố ỉ ấ (b n m c áo xanh & đ i nón màu cam). Tuy nhiên t p h p t t c các nhân viên cũng là m t ph n t .ạ ặ ộ ậ ợ ấ ả ộ ầ ử

Ta m ch ng trình excel 2003, đ xu t hi n m t b ng tính tr ng duy nh t. Nói là duy nh t, vì n u b nở ươ ể ấ ệ ộ ả ắ ấ ấ ế ạ còn b ng tính nào khác thì nên đóng nó l i (dùng l nh Unhide trong menu window đ áp d ng cho c b ngả ạ ệ ể ụ ả ả tính n)ẩ

Trong excel cũng v y, m i b ng tính là m t ph n t . B n có th ch ra b ng tính b ng tên (mậ ỗ ả ộ ầ ử ạ ể ỉ ả ằ ở BaiTap.XLS), b ng v trí (kích ho t b ng tính th ba trong DS (danh sách)), ch tr c ti p (khi l u b ng tínhằ ị ạ ả ứ ỉ ự ế ư ả hi n hành). . . .t p h p các b ng tính cũng là m t ph n t thu c lo i khác, ta t m g i là ph n t ‘các b ngệ ậ ợ ả ộ ầ ử ộ ạ ạ ọ ầ ử ả tính’.

(ũng đúng nh v y đ i v i các trang tính, các vùng, các ô trong trang tính. . . .ư ậ ố ớ[I]b./ Ph n t co tinh ch t:[/I] â ư â Hãy nh l i hình nh c a b n tr c đây m t con giáp: m t cô/c u bé caoớ ạ ả ủ ạ ướ ộ ộ ậ

kho ng 1,55m, b n áo tr ng, ng i gi a d y trái c a l p h c, tóc không dài & màu đen, m t không m . . .ả ậ ắ ồ ữ ẫ ủ ớ ọ ắ ởChi u cao, màu áo, v trí, màu & đ dài tóc, tr ng thái m t. . . là các tính ch t c a ph n t . Cô b n k bênề ị ộ ạ ắ ấ ủ ầ ử ạ ế

cũng có các tính ch t đó, vì cô y cũng là ph n t thu c lo i h c sinh. Chi c gh cô ta ng i cũng có tính ch tấ ấ ầ ử ộ ạ ọ ế ế ồ ấ chi u cao, v trí, cân n ng, nh ng không có tính ch t v đ dài tóc, nh ng ng c l i, nó có tính ch t n i s nề ị ặ ư ấ ề ộ ư ượ ạ ấ ơ ả xu t mà b n & cô k bên không có. Nh v y cái gh là ph n t thu c lo i khác, và các ph n t thu c cácấ ạ ế ư ậ ế ầ ử ộ ạ ầ ử ộ lo i khác nhau không có tính ch t gi ng h t nhau.ạ ấ ố ệ

T p h p ‘các h c sinh trong l p’ h c cũng là m t ph n t . Nó không có tính ch t v chi u cao, cân n ng. . . ,ậ ợ ọ ớ ọ ộ ầ ử ấ ề ề ặ nh ng nó có tính ch t khác: T ng s , s nam, s n , s có m t. . . . Nh v y, ph n t ‘các h c sinh’ thu c lo iư ấ ổ ố ố ố ữ ố ặ ư ậ ầ ử ọ ộ ạ khác v i ph n t h c sinh vì chúng có tính ch t khác nhau.ớ ầ ử ọ ấ

M t s tính ch t có th thay đ i đ c. B n thay đ i tr ng thái tình c m khi s p khen/chê tr c t p th ,ộ ố ấ ể ổ ượ ạ ổ ạ ả ế ướ ậ ể màu tóc c a b n sau m t con giáp n a s không còn đen. . . Nh ng cũng có nh ng tính ch t là b t di b tủ ạ ộ ữ ẻ ư ữ ấ ấ ấ d ch: Ngày sinh (trong ph m vi ho t đ ng bình th ng c a t p h p ‘l p’ hay ‘tr ng’ đi u này là không khị ạ ạ ộ ườ ủ ậ ợ ớ ườ ề ả thi).

(ác ph n t trong excel cũng có tính ch t. M i b ng tính đ u có ngày sinh, ngày hi u ch nh l n cu i, doầ ử ấ ỗ ả ề ệ ỉ ầ ố m t vĩ nhân, hay do m t tên ng c nào đó tình c l p ra . m i hàng, m i c t, đ u có chi u cao & đ r ng. M iộ ộ ố ờ ậ ỗ ỗ ộ ề ề ộ ộ ỗ menu đ u có tiêu đ , ng i ta li t kê s trang cho m i trang tính; m t s tính ch t r t d b t n th ng nhề ề ườ ệ ố ỗ ộ ố ấ ấ ễ ị ổ ươ ư tên c a trang tính, nh ng m t s khác l i khó h n: thay đ i t ng s ô trong m t trang tính.ủ ư ộ ố ạ ơ ổ ổ ố ộ

[I]c./ Ph n t co ph ng phap:[/I]â ư ươ M i nhân viên đ u có th đ c sách & đ c tài li u, m i sinh viên đ u cóỗ ề ể ọ ọ ệ ỗ ề th gõ & nh p hàm =DSUM() vô ô trang tính. m t th i đi m nào đó có th nhân viên này đang đ c thìể ậ Ở ộ ờ ể ể ọ d ng s khác đang vi t th đi n t . . .Nh ng quan tr ng là v n đ có kh năng đ c & có kh năng g i thồ ự ế ư ệ ử ư ọ ấ ề ả ọ ả ở ư đi n t . Nh ng hành đ ng đ c, vi t n y n đó ta g i là ph ng pháp c a ph n t đó (có nhi u ng i hayệ ử ữ ộ ọ ế ầ ọ ọ ươ ủ ầ ử ề ườ dùng ph ng th c thay vì ph ng pháp)ươ ứ ươ

Ph ng pháp làm thay đ i tính ch t. Khi Lê Chanh th c hi n ph ng pháp đ n c lên đ u mình, thì tínhươ ổ ấ ự ệ ươ ổ ướ ầ ch t chi c áo sẽ b t.ấ ế ị ướ

M t t p h p các ph n t có các ph ng pháp khác v i các ph ng pháp c a t ng thành ph n c a nó. Khiộ ậ ợ ầ ử ươ ớ ươ ủ ừ ầ ủ m t nhân viên m i vô th vi c, thì ph ng pháp thêm vào là ph ng pháp c a ph n t ‘c quan’ không thộ ớ ử ệ ươ ươ ủ ầ ử ơ ể b t c ph n t ‘nhân viên’ riêng rẽ nào th c hi n đ c ph ng pháp này. ấ ứ ầ ử ự ệ ượ ươ

M t ph ng pháp quan tr ng c a ph n t t p h p là ch ra m t ph n t thu c v nó. Khi gi ng viên g i:ộ ươ ọ ủ ầ ử ậ ợ ỉ ộ ầ ử ộ ề ả ọ “Em Thanh, lên b ng!” Tác đ ng g i ra m t ph n t trong m t t p h p & do đó t o ra m t liên h v i ph nả ộ ọ ộ ầ ử ộ ậ ợ ạ ộ ệ ớ ầ t đó là m t ph ng pháp c a các ph n t , ch tuy t nhiên không ph i là ph ng pháp c a ph n t ‘Emử ộ ươ ủ ầ ử ứ ệ ả ươ ủ ầ ử Thanh’ này.

Page 57: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

đây là ph i hi u là gi ng viên g i v i c l p, ch không ph i ch tác đ ng lên ph n t ‘Thanh’. Vì m tỞ ả ể ả ọ ớ ả ớ ứ ả ỉ ộ ầ ử ộ hi n nhiên là c l p đ u nghe cô g i & th y k t qu c a ph ng pháp g i này. (H n n a n u ch có gi ngể ả ớ ề ọ ấ ế ả ủ ươ ọ ơ ữ ế ỉ ả viên & ‘Thanh’ thì ch a ch c gi ng viên g i nh v y!)ư ắ ả ọ ư ậ

M i t p h p các ph n t trong excel đ u có ph ng pháp Add đ thêm các ph n t cho mình. Trong trangỗ ậ ợ ầ ử ề ươ ể ầ ử tính có ph ng pháp Calculate đ tính l i giá tr trong các ô. Đ th có ph ng pháp ChartWizard đ thay đ iươ ể ạ ị ồ ị ươ ể ổ nhanh chóng các tính n t c a đ th .ế ủ ồ ị

S phân bi t gi a ph ng pháp & tính ch t cũng r t mong manh. Khi b S p m ng, nhân viên ‘Hoa’, ‘Hoa’ự ệ ữ ươ ấ ấ ị ế ắ th c hi n ph ng th c tr ng m t (m t hành đ ng), hay cô ta gán m t giá tr m i cho tính ch t c a m tự ệ ươ ứ ừ ắ ộ ộ ộ ị ớ ấ ủ ắ (tính dãn đ ng t ). Cũng có lúc ta sẽ g p khi m t ph ng pháp tr v m t giá tr .ồ ử ặ ộ ươ ả ề ộ ị

Hãy xem ph ng phá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./ Tìm hi u các b ng tínhể ả [/B]

a./ Thêm m t b ng tinh:ô a T b ng tính đang m , ta sẽ có ít nh t là hai cách đ m CS (c a s ) Microsoft VBừ ả ở ấ ể ở ử ổ (Visual Basic), nh sau:ư

Ph i chu t vô vùng tr ng trên thanh Toolbar & ch n t DS đ xu ng m c Visual Basic, khi thanh côngả ộ ố ọ ừ ỗ ố ụ c này hi n ra ta ch n bi u t ng Visual Basic Editorụ ệ ọ ể ượ

Nh n t h p phím Atl + {F11}ấ ổ ợT CS này ta vô menu View -> Immediate đ có thêm m t CS ‘nghi p v ’ m i. Ti n hành thu nh CS MVBừ ể ộ ệ ụ ớ ế ỏ

(Microsoft Visual Basic) còn phân n a đ th y đ c CS workbook bên d i.ữ ể ấ ượ ướTrong CS Immediate, ta g nh p câu l nh:ỏ ậ ệ[code]WorkBooks.Add [/code]

Và n ENTER. B n nên tìm đâu đó trên màn hình k t qu vi c VBA th c hi n l nh c a b n. Ph ng phápấ ạ ế ả ệ ự ệ ệ ủ ạ ươ Add đã thêm m t ph n t b ng tính m i v t p h p các b ng tính c a b n.ộ ầ ử ả ớ ố ậ ợ ả ủ ạ

/(/h v y là vùng Immediate này h u d ng đ chúng ta tìm hi u v thành ph n, ph ng th c . . . c aư ậ ữ ụ ể ể ề ầ ươ ứ ủ VBA nói riêng & Excel n a.ữ

/(/ u thích b n có th l p l i l nh này, b ng cách gi n ti n h n, đó là n tr chu t vô dòng l nh trên &ế ạ ể ặ ạ ệ ằ ả ệ ơ ấ ỏ ộ ệ n ENTER m t l n n a. ấ ộ ầ ữ

b./ Đ m s b ng tinhê ô a : Chúng ta v a áp d ng ph ng pháp Add lên ph n t ‘các b ng tính’. Ph n t nàyừ ụ ươ ầ ử ả ầ ử cũng có nh ng tính ch t. M t trong nh ng tính đó là đ m. ữ ấ ộ ữ ế

Trong CS Immediate ta g nh p l nh:ỏ ậ ệ[code]?workbooks.count [/code]

Và th c hi n n ENTER xu ng dòng. T c th i t i dòng hi n hành xu t hi n con s ch ra s b ng tính cóự ệ ấ ố ứ ờ ạ ệ ấ ệ ố ỉ ố ả trong t p h pậ ợ

[QUOTE]CS Immediate còn là n i tho i mái v c c a dân t p t nh đ n VBA, này nha:ớ ả ọ ủ ậ ễ ếB n v a t o ra m t ki t tác UDF v a ý , thì hãy đem đ n đây th các k t qu hàm tr v ;ạ ừ ạ ộ ệ ừ ư ế ử ế ả ả ề

Page 58: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

B n mu n ki m nghi m các hàm trong VBA , n i này cũng là n i t t, ch ng h n: ạ ố ể ệ ư ơ ơ ố ẵ ạ?1 + Date() [/QUOTE] và n ENTER xem sao(?)ấ

/(/h v y ta th y, mu n đ m s b ng tính ta dùng ph ng thúc Count, nh ng ph ng th c này khôngư ậ ấ ố ế ố ả ươ ư ươ ứ làm tăng/gi m s b ng tính; mu n tăng ta dùng ph ng th c Add. Nh v y, tính ch t Count thu c lo i tínhả ố ả ố ươ ứ ư ậ ấ ộ ạ ch t ch đ c (read-only), không khác m y v i tính ch t ngày sinh tháng đ c a ph n t ‘nhân viên’ nào đó.ấ ỉ ọ ấ ớ ấ ẻ ủ ầ ử

c./ Đong b ng tinha : /(/goài ph ng pháp Add, ph n t WorkBooks có thêm ph ng pháp Close đ đóngươ ầ ử ươ ể b ng tính. G vô CS Immediate l nh [Code] WorkBooks.Close [/code] và nh n ENTER, tr l i ‘No’ khi đ cả ỏ ệ ấ ả ờ ượ h i đi u gì đó.ỏ ề

/(hi đó m i b ng tính đ u bi n m t. Nh v y ph ng pháp Close tác đ ng lên ph n t WorkBooks (t pọ ả ề ế ấ ư ậ ươ ộ ầ ử ậ h p các b ng tính); Có nghĩa là nó đóng toàn b t p h p này.ợ ả ộ ậ ợ

B n th th c hi n l i l nh ?WorkBooks.Count xem sao (?)ạ ử ự ệ ạ ệ/(/h v y rõ m t đi u, tính ch t Count đã b ph ng pháp Add & Close thay đ i không th ng ti c.ư ậ ộ ề ấ ị ươ ổ ươ ếd./ Ch đ nh m t b ng tinhi i ô a : Ph ng pháp Close nh trên đôi khi b t l i, n u khi ta ch c n đóng m t hayươ ư ấ ợ ế ỉ ầ ộ

m t vài b ng tính c th nào đó. Gi ng nh gi ng viên mu n g i em Chi lên b ng, thì ph i ch m t đ t tênộ ả ụ ể ố ư ả ố ọ ả ả ỉ ặ ặ đó là ph n t nào trong t p h p đang có.ầ ử ậ ợ

Đ n đây b n nên th c hi n không d i 7 l n l nh WorkBooks.Add đ t o nhi u b ng m i.ế ạ ự ệ ướ ầ ệ ể ạ ề ả ớLà CS so n th o nên trong Immediate ta có th nh n cùng lúc CTRL+{ENTER} đ làm gì b n th y ngayạ ả ể ấ ể ạ ấ

đ y; G nh p vô dòng tr ng câu l nh sau: [Code] ?WorkBooks.Item(1).Name [/code] và n ENTER. T iấ ỏ ậ ố ệ ấ ạ dòng đ i tho i sẽ xu t hi n m t cái tên mà b n t suy ng m.ố ạ ấ ệ ộ ạ ự ẫ

Theo nh quy n ghi chép “Ch p ch ng đ n VBA” ta đ c câu l nh trên t ph i sang trái nh sau:ư ễ ậ ữ ế ọ ệ ừ ả ưTên c a ph n t th nh t c a ‘các ph n t ’ b ng tính là gì(?)ủ ầ ử ứ ấ ủ ầ ử ảT ‘Name’ là tính ch t c a m t ph n t b ng tính (WorkBook)ừ ấ ủ ộ ầ ử ảB n xem th ph n t WorkBooks có tính ch t này không (?)ạ ử ầ ử ấTi p theo b n g [code] Workbooks.Item(2).close [/code] và n ENTER.. Sẽ có m t b ng tính nào đó bế ạ ỏ ấ ộ ả ị

bi n kh i t m m t.ế ỏ ầ ắ/(/ u gi b n nh p l nh [code] ?WorkBooks.Item(2).Name [/code] đ xem hai tên đ c g i có li n kế ờ ạ ậ ệ ể ượ ọ ề ề

hay cách r i nhau không?ờItem là m t ph ng pháp mà m i ph n t t p h p đ u ch p nh n. Ph ng pháp này đ t liên h đ nộ ươ ọ ầ ử ậ ợ ề ấ ậ ươ ặ ệ ế

m t ph n t đ c xác đ nh rõ c a t p h p đó. Có th ch ra v trí trong t p h p đó (nh các ví d trên), cóộ ầ ử ượ ị ủ ậ ợ ể ỉ ị ậ ợ ư ụ th ch b ng tên c th ( sẽ ch m t chút ti p sau)ể ỉ ằ ụ ể ờ ộ ế

Trong các câu l nh VB, b n không th dùng cách b ch ‘s’ đ ch ph n t trong t p h p (ch ng h n bệ ạ ể ỏ ữ ể ỉ ầ ử ậ ợ ă ạ ỏ ch ‘s’ trong ch WorkBooks đ chì ph n t riêng rẽ nào c a ‘các ph n t ’ workbooks). Mu n ch m t ph nữ ữ ể ầ ử ủ ầ ử ố ỉ ộ ầ t c th nào ta ph i dùng ph ng pháp Item; Nh đ đóng workbooks th 5 ta dùng l nhử ụ ể ả ươ ư ể ứ ệ WorkBooks.Item(5).Close (không th dùng Workbook(5).Close)ể

e./ Xac đ nh m t b ng tinh b ng tên: i ô a ăChúng ta v a m i xác đ nh m t b ng tính b ng v trí c a nó trong m t t p h p (Là v trí tu n t phátừ ớ ị ộ ả ằ ị ủ ộ ậ ợ ị ầ ự

sinh c a nó). M t ph n t nh t thi t ph i đ c xác đ nh theo tên c a nó trong m t t p h p. Cho r ng đủ ộ ầ ử ấ ế ả ượ ị ủ ộ ậ ợ ằ ể ti p t c b n c n ph i t o vài ba b ng tí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.ệ ế ầ ử ỏ ầ ắ ủ

Page 59: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 tinh đang đ c kich ho t:ệ ớ a ươ aGi 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 gia tr tinh ch t c a b ng tinh:ổ i â ủ aCá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.Addằ ấ ầ ệ

Sau đó ta thêm các dòng l nh sau: [Code] WorkBooks.Item(1).ActivateệRange(“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).Activate

Range(“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ầ ự ủ ế ế ủ ị ạ  :

http://www.giaiphapexcel.com/forum/showthread.php?t=52 [/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 range

Cách th c s d ng ph n t rangeứ ư u ầ ưCá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

Page 60: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 RangeộChú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").Activate

Range("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 CellsộTa 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 Explicit

Sub 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

Page 61: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Next TheQuarter

End 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 = xlThick

End 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.Address

End 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

Page 62: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

2 For Each Clls In Cells

3 If Clls.Value = "@" Then

4 Clls.Activate: Exit For

5 End If

6 Next Clls

End 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 OffsetộS 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 Unionươ ứS 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 UnionMethod

Dim r1 As Range, r2 As Range, myMultiAreaRange As Range

Worksheets("sheet1").Activate

Page 63: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Set 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:ể ể ơ ề ươ ứ ạ ả ế ạhttp://www.giaiphapexcel.com/forum/showthread.php?t=480 ;

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 ky 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.

Page 64: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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.

Example

This 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).Select

This 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.Address

End Sub [/php]

Page 65: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 sauế ầ ạ ấ ề ề ủ ữ ệ ư ụSub 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 Sub

Macro 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:UsedRange

1./ 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 tứ ử ụ ủ ạSub ColorAllFormulae()

ActiveSheet.UsedRange.SpecialCells(xlCellTypeFormulas).Interior.ColorIndex = 6

End Sub

2./ Vùng giao nhau v i các c t cho tr c & đ t tên 1 vùng d li uớ ộ ướ ặ ữ ệTa kh o sát ti p Mc sau:ả ế

Sub UsedRange()

Dim lRow As Long, bCol As Byte

2 lRow = Worksheets("S1").UsedRange.Rows.Count

3 bCol = Worksheets("S1").UsedRange.Columns.Count

With ActiveSheet

5 MsgBox Intersect(.Range("c:q"), .UsedRange).Address

End With

7 ThisWorkbook.Names.Add "Matrix", "=!r2c2:r" & lRow & "c" & bCol

'expression.Add(Name, RefersTo, Visible, McType, ShortcutKey, Category, NameLocal, _

RefersToLocal, CategoryLocal, RefersToR1C1, RefersToR1C1Local)

End Sub

Page 66: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 lRowệ ượ ể ố ứ ữ ệ ủ ếT 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 uệ ấ ả ộ ủ ứ ữ ệ

Sub 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 Sub

4./ 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

Page 67: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

.Clear

End With

End Sub

5./ Xóa dòng theo đi u ki n c a 1 c t (‘D’) ch a ô tr ngề ệ ủ ộ ứ ố

Sub 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.Delete

End Sub

6./ 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 = True

End Sub

7./ L p danh sách đ a ch vùng ch a d li uậ ị ỉ ứ ữ ệ

Private 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.Address

End Sub

Page 68: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Bài 14:CurrentRegion Property (An hem sinh đôi c a ủusedRange)

1./ S khác bi t gi a CurrentRegion & UsedRangeự ệ ữGi 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 Sub

Sẽ 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.

Page 69: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

2./ Đi u kì di u c a CurrentRegionề ệ ủ

Ti 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òngướ ư ươ ứ ộ

Cá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 Row

Page 70: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

If 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 wSh

End Sub

N 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 CurrentRegionế ứ

T ng t nh v y, ta xét thêm tr ng h p sauươ ự ư ậ ườ ợ

Sub 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

Page 71: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Exit Sub: End Sub

Trong 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 uộ ữ ệVí 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 = Nothing

End Sub

Mc 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 nậ ạ ọ

Bà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:ư

Page 72: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 If

Ti 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 vung ụ ổ i u ộ

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 If

End Sub

2./ Liên quan đ n vung đ 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 If

End Sub

3./ Tô màu n n c a vùng đ c nh p cac s ng u nhiênê ủ ươ ậ ô ẫ

Khi 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

Page 73: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 Sub

4./ Ph ng th c Union() song hanh:ươ ứ

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Đo n code sau cho phép ta chép các hàng intersect v i vùng là m t s ô trong 1 c t, mà các hàng này có ô trong c t ch n ạ ớ ộ ố ộ ộ ọkhông ch a giá tri:ứ(C th : ta ch n vùng t 'J3:J9' mà trong đó giá tr t i J5 & J8 = ""; thí khi ch y macro chúng ta sẽ có hai dò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 cach khac đ bi n cac 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

Page 74: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 0

End Sub

6./ M t cach nh p t đ ng ngay hi n hanh vô tr ng [NgThang] c a CSDLộ â ư ộ ê ươ u

N 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 Sub

7./ Phương thức Intersect và copy vùng dữ liệu

Dù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 Sub

Private 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 Sub

Trường hợp B

Code:Sub CopyCol() Dim iRow As Integer iRow = ActiveCell.Row If Not Intersect(ActiveCell, Range("$C$3:$M$3000")) Is Nothing Then

Page 75: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 Sub

Trườ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 Sub

Trường hợp D

Code: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

Page 76: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 Sub

Trường hợp E

Code: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 With

Set 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 SearchCell

With 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 Object

Page 77: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Ph 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 Object

Thao tác v i ph n t Applicationớ ầ ử

Use 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").Activate

The 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"

Remarks

L 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:

Page 78: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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ào

4* 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 

Page 79: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

    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ạt

Worksheets("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 

Page 80: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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.

Page 81: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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:

Ngay NhaCC Ma Ten GiaMu

a SoLg Ttien

1/9/2010 Thơm ANL Áo NLớn 45.000 5 225.000

1/9/2010 Thà ANL Áo NLớn 50.000 10 500.000

2/9/2010 Hoa ATE Áo Trẻ em 30.000 5 150.000

3/9/2010 My QNL Quần NLớn 60.000 5 300.000

3/9/2010 Thơm QNL Quần NLớn 70.000 5 350.000

3/9/2010 Thà ANL Áo NLớn 50.000 1 50.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 

Page 82: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

      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

.

Page 83: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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 lai

Cá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ểu

PHP 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 Sub

Như 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:

Page 84: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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ên

b./ 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;

Page 85: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

(*) 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

Page 86: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

   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.

Page 87: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

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ố Ngay

Thì 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

Page 88: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

Đó 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

Page 89: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

[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:= http://www.giaiphapexcel.com/forum/s...ều-kiện.#6 )

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

Page 90: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

        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.

Page 91: autocad123.vn · Web viewchuột đang có dạng chữ thập mảnh mai đến ô trên vùng C2:D8 (VD tôi chọn C7). Ấn giữ trái chuột & vẽ hình chữ nhật lên

(Tất nhiên bạn có thể tham khảo cách làm của bài tiếp sau trong topic đó)