Tôi không biết đặt đặt câu hỏi này nơi nào cho đúng, xin gởi vào đây. Nếu có sai xin thông cảm cho người mới học VBA.
Trong 1 cửa sổ Module có thể ghi nhiều nhiều Macro và mỗi macro có thể ứng với 1 tổ hợp phím nào đó được không?
Tôi thử nhiều lần thì khi được khi không. Không biết nó thế nào? Trong tập tin sau có lỗi gì không trong cách ghi Macro? Cám ơn.
Tôi không biết đặt đặt câu hỏi này nơi nào cho đúng, xin gởi vào đây. Nếu có sai xin thông cảm cho người mới học VBA.
Trong 1 cửa sổ Module có thể ghi nhiều nhiều Macro và mỗi macro có thể ứng với 1 tổ hợp phím nào đó được không?
Tôi thử nhiều lần thì khi được khi không. Không biết nó thế nào? Trong tập tin sau có lỗi gì không trong cách ghi Macro? Cám ơn.
- trong mỗi Macro có thể dùng tổ hợp phím viết tắt được B ạ. hihi chi tiết để hiểu thêm phím tắt đó B có thể dùng chức năng Recode Macro để xem .B có thể nhìn hình ảnh gửi lên.
Xem qua một loạt bài tập của B thấy vẫn đang còn dài dòng lắm ạ. Nó vẫn đang còn giống chức năng tự ghi của Excel lắm, cứ dần dần sửa nó B sẽ quen ( mới bắt đầu làm nên dùng chức năng Recode )rùi dần dần sửa chúng.ví dụ như bài tập 3 trong modul1
- B vào Module 1 có thêm một ví dụ tính tích của hai cột ("a1:a10")*("B1:B10")--->B thử xem nhé.
_ B nè : ví dụ trong một Module có nhiều Macro chẳng hạn. mình muốn chỉ cần chạy một Macro thì các Macro cũng thực thi luôn thì mình làm như sau :
sub a()
'tinh
.......
.......
b
c
end sub ''
sub b()
.......
end sub '
sub c()
......
end sub
Sub BaiTap1()
ActiveCell = 2
ActiveCell.Offset(0, 1) = 3
ActiveCell.Offset(0, 2).FormulaR1C1 = "=RC[-2]+RC[-1]"
End Sub
Ý nghĩa:
1. Không cần phải chọn ô (select) cũng có thể gán giá trị hoặc công thức được. Nên các dòng chọn ô có thể bỏ
2. Trong câu: ActiveCell.Offset(0, 1).Range("A1").Select, nhóm từ màu đỏ là vô nghĩa: ActiveCell.Offset(0, 1).Select ý nghĩa là chọn ô ngay bên phải của ô hiện hành. Range("A1") là ô A1, chả có ý nghĩa gì trong câu lệnh.
3. Gán giá trị thì không cần phải .FormulaR1C1, gán công thức mới cần.
4. Gán giá trị text mới cần cặp dấu nháy đôi "", gán giá trị số không cần.
mỗi macro có thể ứng với 1 tổ hợp phím nào đó được không?
Mỗi macro trong module có thể gán 1 phím tắt, bao nhiêu sub cũng được. Có thể gán ngay trong quá trình ghi Macro, hoặc nhấn nút Option trong hộp thoại Tool - Macro...
Ghi chú: Không nên gán phím tắt cho code bằng phím tắt của Excel như Ctrl A, Ctrl Shift A, Ctrl B, Ctrl Shift B, ...
Gởi Khoa:
Chưa trả lời vào đúng câu hỏi. Cho nên trả lời cũng như không, dù có nói đúng chăng nữa.
Thân mến.
Tôi hiện tại đang nghiên cứu qua tài liệu, đi từng bước rồi ngược lại để hiểu các từ ngữ trong VBA vì vốn tiếng Anh mình không có.(Rất chậm phải không? Và tôi thấy chưa chính xác !!!).
Qua ý kiến của các bạn, tôi cũng hiểu thêm được một số vấn đề.
Các bạn có thể giúp tôi con đường để tìm hiều về những từ ngữ thông dụng cần thiết khi viết các macro không? Hiểu được những từ ngữ này, tôi sẽ dễ đi vào lĩnh vực này hơn.
Cám ơn nhiều lắm.
Bạn ơi... ngôn ngữ VBA cũng là tiếng Anh cơ mà!
Về mặt lâu dài, tôi nghĩ bạn nên học tiếng Anh thêm (có thể học để hiểu thôi cũng tạm đủ) ----> Chứ chẳng lẽ bạn định... THUỘC LÒNG (sao nhớ nổi)
Lúc trước khi tôi chưa biết gì về VBA thì cũng chả biết tí tiếng Anh nào... nhưng từ khi "theo" sư phụ cày mấy vòng lập, tự nhiên môi trường nó "ép" mình phải tra từ điển... dần dần nên vốn tiếng Anh được nâng cao thêm (nhờ 1 phần chịu đọc Help nữa)
Bạn ơi... ngôn ngữ VBA cũng là tiếng Anh cơ mà!
Về mặt lâu dài, tôi nghĩ bạn nên học tiếng Anh thêm (có thể học để hiểu thôi cũng tạm đủ) ----> Chứ chẳng lẽ bạn định... THUỘC LÒNG (sao nhớ nổi)
Lúc trước khi tôi chưa biết gì về VBA thì cũng chả biết tí tiếng Anh nào... nhưng từ khi "theo" sư phụ cày mấy vòng lập, tự nhiên môi trường nó "ép" mình phải tra từ điển... dần dần nên vốn tiếng Anh được nâng cao thêm (nhờ 1 phần chịu đọc Help nữa)
Rất cám ơn ban.
Tôi vẫn biết đều là tiếng Anh nhưng tiếp xúc nhiều lần sẽ quen, sẽ nhớ. Tôi có sổ tay riêng, cũng như trong Excel, tôi học cũng thế. Tôi sẽ làm quen với môi trường này.
Nhờ bạn chỉ giúp tôi thêm điều này.
Theo thứ tự lập tổ hợp phim trước rồi sau mới viết macro, tôi thực hiện như thế đã đạt theo từng macro một nhưng khi có nhiều macro trong 1 module (như file đính kèm) thì 2 tổ hợp phím sau nó không có tác dụng. Muốn lập lại 2 tổ hợp phím cho 2 macro này (x và chia) thì phải làm thế nào? Mong bạn giúp đỡ.
Cám ơn.
Xin lỗi tập tin ở máy tôi đã xóa 2 macro này rồi, nó giống như file tôi đính kèm ở bài viết đầu tiên của trong mục này. Thông cảm.
Theo thứ tự lập tổ hợp phim trước rồi sau mới viết macro, tôi thực hiện như thế đã đạt theo từng macro một nhưng khi có nhiều macro trong 1 module (như file đính kèm) thì 2 tổ hợp phím sau nó không có tác dụng. Muốn lập lại 2 tổ hợp phím cho 2 macro này (x và chia) thì phải làm thế nào? Mong bạn giúp đỡ.
Cám ơn.
.
Tôi thì làm khác: Viết xong toàn bộ code mới thiết lập phím tắt ---> Bạn không cảm thấy làm vậy sẽ hợp lý hơn sao? Trong quá trình viết code, bạn còn phải chỉnh sửa cơ mà ---> Hoàn thiện xong hẳn tạo phím tắt (đâu có muộn)
Để tạo phím tắt, bấm Alt + F8, chọn tên macro, bấm nút Options
Mỗi macro trong module có thể gán 1 phím tắt, bao nhiêu sub cũng được. Có thể gán ngay trong quá trình ghi Macro, hoặc nhấn nút Option trong hộp thoại Tool - Macro...
Cách đây 1 tháng tôi có gởi vào mail cho bạn 1 file Excel áp dụng các bài tập trong topic "vòng lặp For . . . Next", nhưng không thấy bạn phản hồi gì? (trừ 1 cái auto answer khô khốc)
Ghi chú: Tôi đã dời và đổi tên đề tài, vậy bạn có thắc mắc căn bản nào cứ hỏi vào mục này.
Cám ơn bạn. Lúc ấy, tôi còn chưa có một ấn tượng nào về VBA. Sau đó tôi mới tìm hiểu qua một số tài liệu, có một chút hình tượng. Đúng như khoavu87 nhận xét. Những đoạn code đó, tôi thực hiện theo hướng dẫn và Excel tự ghi, sau đó tôi xóa rồi thêm để tìm hiểu cho nên chưa nắm căn bản có những khi nó cho ra những thứ gì không hiểu nổi. Được các bạn giúp đỡ, bước đầu có sự hiểu biết nhen nhúm.
Cám ơn
các bạn giúp tôi.
Theo hướng dẫn Mở excel à Tools à Macro à Recor new macro khi hoàn thành --> OK thì nó sẽ hiện hộp công cụ SopRec nhưng không biết tại sao cũng như vậy bây giờ không hiện hộp thoại này?
Stop chứ nhỉ?
Excel có 1 số thanh công cụ tự động hiện ra khi cần dùng và tự động biến đi khi không dùng nữa. Các tool bar này nếu tự ý đóng (không chờ tự động đóng) đi thì sẽ mất đi tính tự động hiện. Riêng cái tool bar Stop recording thì không hiểu làm sao mà mất. Bây giờ có cách là trở vào menu tools - Macro - nhấn Stop Recording thay vì nhấn tool bar.
các bạn giúp tôi.
Theo hướng dẫn Mở excel à Tools à Macro à Recor new macro khi hoàn thành --> OK thì nó sẽ hiện hộp công cụ SopRec nhưng không biết tại sao cũng như vậy bây giờ không hiện hộp thoại này?
Cách nhanh nhất (tôi thường dùng) là kéo thanh công cụ Visual Basic ra Toolbars ---> Thanh này có nút Record macro, khi bạn nhấn vào thì nó tự biến thành Stop Recording Ngoàira để hiện trở lại thành Stop Recording, ta dùng đoạn code sau: Application.CommandBars("Stop Recording").Visible = True
Chạy code này xong là mọi chuyện lại được phục hồi như cũ
các bạn giúp tôi.
Theo hướng dẫn Mở excel à Tools à Macro à Recor new macro khi hoàn thành --> OK thì nó sẽ hiện hộp công cụ SopRec nhưng không biết tại sao cũng như vậy bây giờ không hiện hộp thoại này?
[FONT="]Bác nhấn chuột phải vào bất kỳ vào 1 thanh công cụ nào đó, sau đó bác chọn “Stop Recording”. Cái này chỉ xuất hiện khi bác đang để chế độ tự ghi marco[/FONT]
Nhờ các bạn giúp hộ chuyện thế này.
1_Trong file đính kèm, khi tôi gắn 4 đoạn code với 4 tổ hợp phím rồi sử dụng đạt như ý muốn nhưng khi tắt, mở lại file này thì bị lỗi thế này. Các bạn chỉ giúp.
2-.Nhờ các bạn chỉ giúp trình tự, từ bắt đầu mở EXCEL đến ghi code bằng EXCEL. Để sau đó tôi mở Excel ghi thế nào để hiểu nó hơn?
Cám ơn.
Nhờ các bạn giúp hộ chuyện thế này.
1_Trong file đính kèm, khi tôi gắn 4 đoạn code với 4 tổ hợp phím rồi sử dụng đạt như ý muốn nhưng khi tắt, mở lại file này thì bị lỗi thế này. Các bạn chỉ giúp.
2-.Nhờ các bạn chỉ giúp trình tự, từ bắt đầu mở EXCEL đến ghi code bằng EXCEL. Để sau đó tôi mở Excel ghi thế nào để hiểu nó hơn?
Cám ơn.
Có 1 cách chủ động trong việc gán phím tắt là sử dụng lệnh Onkey.
Bạn viết code gán vào sự kiện Open để khi mở file là tự động mở gán.
Trong file ví dụ bạn có thể chủ động chọn phím rồi gán hay xoá gán
1/Sub gán phím tắt
PHP:
Sub Button1_Click()
With Application
If Sheet2.[b2] <> "" Then .OnKey "{" & Sheet2.[b2] & "}", Sheet2.[a2]
If Sheet2.[b3] <> "" Then .OnKey "{" & Sheet2.[b3] & "}", Sheet2.[a3]
If Sheet2.[b4] <> "" Then .OnKey "{" & Sheet2.[b4] & "}", Sheet2.[a4]
If Sheet2.[b5] <> "" Then .OnKey "{" & Sheet2.[b5] & "}", Sheet2.[a5]
End With
End Sub
2/Sub xoá gán:
PHP:
Sub Button2_Click()
With Application
If Sheet2.[b2] <> "" Then .OnKey "{" & Sheet2.[b2] & "}", ""
If Sheet2.[b3] <> "" Then .OnKey "{" & Sheet2.[b3] & "}", ""
If Sheet2.[b4] <> "" Then .OnKey "{" & Sheet2.[b4] & "}", ""
If Sheet2.[b5] <> "" Then .OnKey "{" & Sheet2.[b5] & "}", ""
End With
End Sub
Khi viết xong đoạn code, tôi save thì nhận được 1 câu thêm vào sau đoạn code đó là "ActiveWorkbook.Save" và đoạn code tôi vừa lập thực hiện không được. Nhờ các bạn cho biết câu báo lỗi ấy có ý gì? Muốn khắc phục phải làm bằng cách nào? Cám ơn.
Khi viết xong đoạn code, tôi save thì nhận được 1 câu thêm vào sau đoạn code đó là "ActiveWorkbook.Save" và đoạn code tôi vừa lập thực hiện không được. Nhờ các bạn cho biết câu báo lỗi ấy có ý gì? Muốn khắc phục phải làm bằng cách nào? Cám ơn.
Lệnh này có nghĩa là lưu lại trong workbook đang hiện hành (giống như bấm Ctr+S), anh kiểm tra lại xem đối tượng thực hiện có đúng không? Vì lệnh này báo lỗi thì cũng hơi lạ, vì đã dính VBA thì ai cũng sử dụng đối tượng workbook.
[/ATTACH]Chỉ vì mới học nên phải làm phiền các bạn nữa rồi.
Trước đây tôi cũng viết đoạn code như thế này thì nó chạy bình thường nhưng bây giờ xóa đi rồi viết lại không sao nó không chạy mà tô vàng báo lỗi thế này, nhờ các bạ chỉ giúp. Cám ơn.
[/ATTACH]Chỉ vì mới học nên phải làm phiền các bạn nữa rồi.
Trước đây tôi cũng viết đoạn code như thế này thì nó chạy bình thường nhưng bây giờ xóa đi rồi viết lại không sao nó không chạy mà tô vàng báo lỗi thế này, nhờ các bạ chỉ giúp. Cám ơn.
Cám ơn các ban.
Qua hướng dẫn của các bạn, tôi đã viết được những phép tính cơ bản trên dòng, cột, một số ô bất kì.
Nay muốn vận dụng vào hàm đoạn code sau, tôi dùng đúng cú pháp của hàm Sum trong Excel nhưng không biết tại sao nó báo sai.
Nhờ các bạn có ý kiến giúp đỡ. Cám ơn.
Bạn có thể cài đặt TeamViewer5 vào máy, khi nào có vướng mắc gì mà tôi rảnh, sẽ hướng dẫn trực tiếp hoặc thực hành trực tiếp trên máy bạn.
Còn không, lần sau, bạn chỉ nên chụp hình cái thông báo lỗi, còn code bạn copy đoạn code post lên, chỉ rõ báo lỗi dòng nào thôi:
- không có thông báo lỗi thì không thể giải quyết được
- nếu muốn test lại hộ bạn thì không copy code về test được, vì là hình chụp. Phải gõ lại bằng tay, làm biếng lắm.
Tôi đang online Yahoo Messenger (thanhmy_pham)
Cám ơn các ban.
Qua hướng dẫn của các bạn, tôi đã viết được những phép tính cơ bản trên dòng, cột, một số ô bất kì.
Nay muốn vận dụng vào hàm đoạn code sau, tôi dùng đúng cú pháp của hàm Sum trong Excel nhưng không biết tại sao nó báo sai.
Nhờ các bạn có ý kiến giúp đỡ. Cám ơn.
Code trên thiếu dấu = và dấu ) tại hàm SUM
Lý ra phải vầy: ActiveCell.Offset(, 4) = "=SUM(RC[-1]:RC[-4])" Mấy lỗi đơn giản này, chịu khó "nhìn" là phát hiện ngay!
Theo mình, khuyên Chương khoan quan tâm đến cú fáp With . . . End With vội.
Chỉ cần hiểu nôm na như trong toán học người ta gộp thừa số chung vậy mà:
3 * (n -1) + 5* (1 - n) => (n - 1)* ( 3 - 5)
Sau này trình độ hơi cao rồi thì cú fáp này vừa thoáng vừa mát (Kể cả trên bình diện tốc độ chương trình nữa đó nha)
Bổ sung: Nếu viết như bạn Chương thì:
Để hiểu, ta ví dụ Activecell là Phòng tắm (FT) & vào đầu chương trình ta đang ở fòng khách (FK)
Dòng lệnh 1 ta hạ lệnh nó vô FT đo chiều cao cửa sổ
(Nó sau khi đo xong sẽ ra FK)
Dòng lệnh 2 vô FT đo chiều cao vòi sen
(Nó lại vô FT, đo xong, nó lại ra FK)
Cứ như vậy thêm ba lần bên dưới nữa được lặp lại.
Nếu ta dùng cú fáp With . . . End With thì nó sẽ ở lì trong đó, thực thi toàn bộ 5 nhiệm vụ rồi mới ra FK.
"Đồng bào" Havietchuong thân mến, theo mình hiểu cứ nôm na là như thế này Với cái CELL bạn đang chọn(ActiveCell), bạn muốn làm cái quái gì nó With ActiveCell ( bắt đầu) Bạn có thể định dạng Đậm,Nghiêng cho chữ, định dạng Font chữ, màu nền, màu chữ, gán công thức, gán value, nhích qua phải, quẹo qua trái, đi lên, tuột xuống v v...và v v.. Khi nào chán rồi thì bạn End With cho nó hiểu là bạn không muốn làm gì đụng chạm tới nó nữa Hihi, hiểu có "bi" nhiêu đó thôi
Để hiểu, ta ví dụ Activecell là Phòng tắm (FT) & vào đầu chương trình ta đang ở fòng khách (FK)
Dòng lệnh 1 ta hạ lệnh nó vô FT đo chiều cao cửa sổ
(Nó sau khi đo xong sẽ ra FK)
Dòng lệnh 2 vô FT đo chiều cao vòi sen
(Nó lại vô FT, đo xong, nó lại ra FK)
Cứ như vậy thêm ba lần bên dưới nữa được lặp lại.
Nếu ta dùng cú fáp With . . . End With thì nó sẽ ở lì trong đó, thực thi toàn bộ 5 nhiệm vụ rồi mới ra FK.
Từ ngày biết đến With... End With, em khoái xài vô cùng... vì nó... mát (chắc do được ở lâu trong FT...)
Ẹc... Ẹc...
Một trong những tiện lợi của With... End With (mà em thích) là đở mất công khai báo biến...
Ví dụ thay vì viết thế này:
PHP:
Sub Test()
Dim Dic
Set Dic = CreateObject("Scripting.Dictionary")
If Not Dic.Exists(Gì gì đó) Then
Dic.Add Gì gì đó, ""
End If
...
...
End Sub
Thì em thích "cải tiến" như vầy hơn
PHP:
Sub Test()
With CreateObject("Scripting.Dictionary")
If Not .Exists(Gì gì đó) Then
.Add Gì gì đó, ""
End If
End With
...
...
End Sub
Việc tìm hiểu về các phép tính, phần nào đã được giải toả, nay tôi muốn tìm hiểu thêm về những bài học trên GPE nhưng khi gõ đoạn code sau vào thì không thực hiện được, mong các bạn chỉ giúp. Đoạn code như sau: Bị bào lỗi ở hàng tô màu. Sub hoc1() Range("B2").Select With Selection .HorizontalAlignment = x1Center .VerticalAlignment = x1Center End With Range("B2:F2").Select Selection.Merge End Sub
Đồng ý với bạn nhưng vốn từ mình quá ít không biết cái nào cần chừa, cái nào phải bỏ, thậm chí có một số từ mình chẳng biết mô tê gì cả. Phải mò từ từ cái đã.
Đồng ý với bạn nhưng vốn từ mình quá ít không biết cái nào cần chừa, cái nào phải bỏ, thậm chí có một số từ mình chẳng biết mô tê gì cả. Phải mò từ từ cái đã.
Trước đến giờ em luôn học theo cách này!
Lấy code của người ta về, em chẳng khi nào bằng lòng với nó cả ---> Cứ bỏ bớt rồi chạy... rồi so sánh (nhất là chổ nào mà ta cảm thấy khó hiểu) ---> Cứ thế... cứ thế mà thí nghiệm, tự nhiên rút ra kết luận (ít nhất biết được chổ mình vừa bỏ bớt nó làm cái giống gì)
Trăm nghe không bằng 1 thấy
Trăm thấy không bằng 1 làm
Các bạn thân mến.
Tôi đã làm được 5 bài tập, lưu lại đó làm tài liệu theo dõi nhưng bây giờ mở lên lại bị lỗi. Nhờ các bạn chỉ giúp cách khắc phục.
Sau đây là thông báo lỗi.
Các bạn thân mến.
Tôi đã làm được 5 bài tập, lưu lại đó làm tài liệu theo dõi nhưng bây giờ mở lên lại bị lỗi. Nhờ các bạn chỉ giúp cách khắc phục.
Sau đây là thông báo lỗi. View attachment 43063
Bạn udu mến.
Tôi đã xem lại và chuyển macro/ macro/ security/ medium hoặc row thì trong cửa sổ macro lại thay đổi thế này chuong4.xls!Module1.chuong4trong khi tên macro cũ tôi chỉ ghi chuong4. Xin các bạn giúp ý kiến
Bạn udu mến.
Tôi đã xem lại và chuyển macro/ macro/ security/ medium hoặc row thì trong cửa sổ macro lại thay đổi thế này chuong4.xls!Module1.chuong4trong khi tên macro cũ tôi chỉ ghi chuong4. Xin các bạn giúp ý kiến
Bạn udu mến.
Tôi đã xem lại và chuyển macro/ macro/ security/ medium hoặc row thì trong cửa sổ macro lại thay đổi thế này chuong4.xls!Module1.chuong4trong khi tên macro cũ tôi chỉ ghi chuong4. Xin các bạn giúp ý kiến
Thế lúc mở file lên, bạn có bấm vàonút Enable Macros không? (hay lại bấm vào Disable Macros thì cũng bằng không)
-------------
Lưu ý thêm: Trong Security, bạn nhất định không được check vào "Low..." nhé ---> Chỉ nên check vào "Medium..." thôi... Lý do là:
- Nếu bạn để ở mức Low thì mọi code kể cả virus cũng hoạt động được
- Để ở mức Medium để còn lựa chọn, nếu gặp file lạ mà ta không chắc chắn thì ta vẫn còn có cơ hội bấm Disable Macros để ngăn ngừa virus lây vào máy
Bạn udu mến.
Tôi đã xem lại và chuyển macro/ macro/ security/ medium hoặc row thì trong cửa sổ macro lại thay đổi thế này chuong4.xls!Module1.chuong4trong khi tên macro cũ tôi chỉ ghi chuong4. Xin các bạn giúp ý kiến
Trời đất ơi đến tên sư phụ mà còn viết nhầm Ndu chứ không phải Udu.
chuong4.xls!Module1.chuong4. Bạn kiểm tra lại xem có phải trong file có 2 sub trùng tên chuong4 không ?
Một thắc mắc rất quan trọng khi học lập trình VBA cho excel
Mình là người mới học lập trình VBA cho excel và có một số thắc mắc mà tự cảm thấy nó rất quan trọng và sẽ giúp ích rất nhiều cho việc lập trình (đặc biệt dùng để viết các hàm Function). Mình đã search trên google thông tin này nhưng vẫn chưa có được câu trả lời, rất hi vọng những bạn có sự hiểu biết nhiều về lĩnh vực này có thể giải đáp thắc mắc cho mình. Đó là:
1. Trong excel có rất nhiều hàm có sẵn vd: max, min, sum, vlookup, hlookup, index, offset ... rất nhiều hàm khác nữa. Vậy các hàm này có được xây dựng giống như cách chúng ta đang viết một hàm Function mới không. Và có cách nào để biết code lập trình cho các hàm này ko. Mình mới học lập trình nên nghĩ nếu có cách để học được cách viết code đó thì sẽ thu được rất nhiều kiến thức và học hỏi cách viết code chuyên nghiệp của nhà lập trình MS Office.
2. Trong VBA cho excel ngoài trừ các hàm excel có sẵn có thể gọi vào khi viết Function + các toán tử + hàm toán học + hàm sử lý chuỗi + hàm chuyển đổi dữ liệu còn các hàm nào khác không? Và có tài liệu nào tổng hợp hết và có giải thích cách dùng các hàm còn lại bằng tiếng Việt không?
Mình rất muốn được giải đáp những thắc mắc trên và tìm được những chia sẻ từ những người có kinh nghiệm cho người mới học lập trình như mình.
Cám ơn bạn sealand đã giúp đỡ nhưng còn thắc mắc thứ nhất của mình:
Trong excel có rất nhiều hàm có sẵn vd: max, min, sum, vlookup, hlookup, index, offset ... rất nhiều hàm khác nữa. Vậy các hàm này có được xây dựng giống như cách chúng ta đang viết một hàm Function mới không. Và có cách nào để biết code lập trình cho các hàm này ko? mong các bạn giải đáp nốt thắc mắc này giúp mình
Cám ơn bạn sealand đã giúp đỡ nhưng còn thắc mắc thứ nhất của mình:
Trong excel có rất nhiều hàm có sẵn vd: max, min, sum, vlookup, hlookup, index, offset ... rất nhiều hàm khác nữa. Vậy các hàm này có được xây dựng giống như cách chúng ta đang viết một hàm Function mới không. Và có cách nào để biết code lập trình cho các hàm này ko? mong các bạn giải đáp nốt thắc mắc này giúp mình
Việc này làm được chứ, nhưng quan trọng nhất là tạo hàm mới để làm gì nếu đã có sẵn.
Cần chú ý khi dùng ActiveCell phải chọn 1 ô nào đó trước. Vì lý do nào đó mà code ghi lại không thể xác định được địa chỉ ô hiện hành (ActiveCell) thì nó sẽ thực hiện trên ô bất kỳ nếu bạn vô tình chọn (khó mà undo mới mệt chứ).
Vì vậy trước khi thực hiện điều khiển phải có dòng lệnh chọn ô Range ("nào đó").Select
Cám ơn bạn sealand đã giúp đỡ nhưng còn thắc mắc thứ nhất của mình:
Trong excel có rất nhiều hàm có sẵn vd: max, min, sum, vlookup, hlookup, index, offset ... rất nhiều hàm khác nữa. Vậy các hàm này có được xây dựng giống như cách chúng ta đang viết một hàm Function mới không. Và có cách nào để biết code lập trình cho các hàm này ko? mong các bạn giải đáp nốt thắc mắc này giúp mình
Minh chưa đọc tài liệu nào nói về nội dung các hàm ông Bill và đệ tử viết ra sao nhưng chắc chắn là rất khác. Nó được tích hợp và cấu thành nên Excel. Nó có khả năng sử lý dữ liệu cao hơn VBA nhiều. Người ta có thể ngăn cản hàm UDF hoạt động chứ không ai ngăn được các hàm Excel...
Nói chung, Excel hỗ trợ thêm VBA để cho nó mạnh hơn chứ VBA vốn không phải là yếu tố cấu thành nên nó.
1. Trong excel có rất nhiều hàm có sẵn vd: max, min, sum, vlookup, hlookup, index, offset ... rất nhiều hàm khác nữa. Vậy các hàm này có được xây dựng giống như cách chúng ta đang viết một hàm Function mới không. Và (1) có cách nào để biết code lập trình cho các hàm này ko. (2)Mình mới học lập trình nên nghĩ nếu có cách để học được cách viết code đó thì sẽ thu được rất nhiều kiến thức và học hỏi cách viết code chuyên nghiệp của nhà lập trình MS Office.
(2) Bạn thử bắt tay viết thử hàm tự tạo giống như VLOOPKUP() xem sao
Hàm này chưa thỏa mãn cho các yêu cầu sau:
(a) Khi có nhiều giá trị cần tìm trùng nhau, hàm chỉ trả về trị đầu tiên mà nó tìm thấy; Giờ bạn thử bắt tay viết hàm tự tạo để buộc nó trả về trị cuối khi nó tìm thấy;
(b) Bạn hãy thử viết để hàm trả về tất cả các trị mà nó tìm thấy đúng theo iêu cầu. (Bạn tự viết đó nha; vì cũng trên diễn đàn này có hàm đó rồi!)
Hãy từ đơn giản đến fức tạp khi đã fát hiện ra í tưởng, bạn à, & để giải ~ í tưởng xuất hiện đó.
Chào các anh, chị:
E mới tìm hiểu VBA trong Excel nhưng có đoạn code nhỏ sau mà k hiểu sai chỗ nào ( e gõ theo vd trên net )
(RowCount = Worksheets("Sheet1").Range("A1").CurrentRegion.Row.Count) cứ báo lỗi hoài
PHP:
Private Sub cmdOK_Click()
Dim RowCount As Long
RowCount = Worksheets("Sheet1").Range("A1").CurrentRegion.Row.Count
With Worksheets("Sheet1").Range("A1")
.Offset(RowCount, 0).Value = Me.txtName.Value
.Offset(roucount, 1).Value = Me.txtAge.Value
End With
End Sub
Chào các anh, chị:
E mới tìm hiểu VBA trong Excel nhưng có đoạn code nhỏ sau mà k hiểu sai chỗ nào ( e gõ theo vd trên net )
(RowCount = Worksheets("Sheet1").Range("A1").CurrentRegion.Row.Count) cứ báo lỗi hoài
thanks.
Chào các anh, chị:
E mới tìm hiểu VBA trong Excel nhưng có đoạn code nhỏ sau mà k hiểu sai chỗ nào ( e gõ theo vd trên net )
(RowCount = Worksheets("Sheet1").Range("A1").CurrentRegion.Row.Count) cứ báo lỗi hoài
PHP:
Private Sub cmdOK_Click()
Dim RowCount As Long
RowCount = Worksheets("Sheet1").Range("A1").CurrentRegion.Row.Count
With Worksheets("Sheet1").Range("A1")
.Offset(RowCount, 0).Value = Me.txtName.Value
.Offset(roucount, 1).Value = Me.txtAge.Value
End With
End Sub
Mình mới bắt đầu tập viết Macro cho Excel mong các bạn hướng dẫn mình. Yêu cầu như sau:
- VD: mình làm macro để copy công thức từ 1 o cho trước vào ô hiện hành. Nhưng mình không biết làm sao để xác định ô hiện hành như thế nào.
Sub Macro6()
'
' Macro6 Macro
'
' Keyboard Shortcut: Ctrl+d
'
Range("U8").Select
Selection.Copy
Range("U9").Select (nếu như vậy thì chỉ copy từ U8 sang U9/ Mình muốn copy từ U8 tới O hiện hành thì làm sao)
ActiveSheet.Paste
End Sub
Mình mới bắt đầu tập viết Macro cho Excel mong các bạn hướng dẫn mình. Yêu cầu như sau:
- VD: mình làm macro để copy công thức từ 1 o cho trước vào ô hiện hành. Nhưng mình không biết làm sao để xác định ô hiện hành như thế nào.
Sub Macro6()
'
' Macro6 Macro
'
' Keyboard Shortcut: Ctrl+d
'
Range("U8").Select
Selection.Copy
Range("U9").Select (nếu như vậy thì chỉ copy từ U8 sang U9/ Mình muốn copy từ U8 tới O hiện hành thì làm sao)
ActiveSheet.Paste
End Sub
Mình mới bắt đầu tập viết Macro cho Excel mong các bạn hướng dẫn mình. Yêu cầu như sau:
- VD: mình làm macro để copy công thức từ 1 o cho trước vào ô hiện hành. Nhưng mình không biết làm sao để xác định ô hiện hành như thế nào.
Sub Macro6()
'
' Macro6 Macro
'
' Keyboard Shortcut: Ctrl+d
'
Range("U8").Select
Selection.Copy
Range("U9").Select (nếu như vậy thì chỉ copy từ U8 sang U9/ Mình muốn copy từ U8 tới O hiện hành thì làm sao)
ActiveSheet.Paste
End Sub
Mấy anh chị cho em hỏi! Em mới tập tành ABC về VBA cho em hỏi, làm trong VBE có cách nào xem các thuộc tính của đối tượng ko vậy mấy anh chị?
Ví dụ
FONT: BOLD, COLORINDEX, ITALIC...
HAY LÀ BORDERS.LINESTYLE=XLTHICK, XLCONTINUOU, XLDASH,.XLDASH.......
ý em hỏi là làm sao khi mình gõ trong VBE khi mình gõ....LINESTYLE=... THÌ HIỆN RA DANH SÁCH CHO MÌNH ĐỂ MÌNH CHỌN.
Hix! Em mới học ko biết diễn đạt như vậy có đúng ko nữa! Nhờ anh chị em giúp dùm!
Thanks nhiều!
Mấy anh chị cho em hỏi! Em mới tập tành ABC về VBA cho em hỏi, làm trong VBE có cách nào xem các thuộc tính của đối tượng ko vậy mấy anh chị?
Ví dụ
FONT: BOLD, COLORINDEX, ITALIC...
HAY LÀ BORDERS.LINESTYLE=XLTHICK, XLCONTINUOU, XLDASH,.XLDASH.......
ý em hỏi là làm sao khi mình gõ trong VBE khi mình gõ....LINESTYLE=... THÌ HIỆN RA DANH SÁCH CHO MÌNH ĐỂ MÌNH CHỌN.
Hix! Em mới học ko biết diễn đạt như vậy có đúng ko nữa! Nhờ anh chị em giúp dùm!
Thanks nhiều!
Thấy mấy bạn trên diễn đàn này xôn xao, chạy theo vba để lập trình. Bây giờ cho em chạy theo với, bắt đầu xuất phát theo bản năng, mình cũng không biết sẽ bắt đầu từ đâu và học bao lâu mới biết chút ít. Em có 1 bài thí dụ như vầy (file kèm theo). Vậy lập trình trong vba làm sao cho ô B2 giống kết quả ở cell b2. Cảm ơn
Thấy mấy bạn trên diễn đàn này xôn xao, chạy theo vba để lập trình. Bây giờ cho em chạy theo với, bắt đầu xuất phát theo bản năng, mình cũng không biết sẽ bắt đầu từ đâu và học bao lâu mới biết chút ít. Em có 1 bài thí dụ như vầy (file kèm theo). Vậy lập trình trong vba làm sao cho ô B2 giống kết quả ở cell b2. Cảm ơn
Anh chị cho em hỏi một vài ý nghĩa trong câu lệnh VBA này với
Private Sub CommandButton1_Click()
Dim mark As Integer
Dim grade As String Randomize Timer mark = Int(Rnd * 100) Cells(1, 1).Value = mark
If mark < 20 And mark >= 0 Then
grade = "F"
Cells(2, 1).Value = grade
ElseIf mark < 30 And mark >= 20 Then
grade = "E"
Cells(2, 1).Value = grade
ElseIf mark < 40 And mark >= 30 Then
grade = "D"
Cells(2, 1).Value = grade
ElseIf mark < 50 And mark >= 40 Then
grade = "C-" Cells(2, 1).Value = grade
ElseIf mark < 60 And mark >= 50 Then
grade = "C"
Cells(2, 1).Value = grade
ElseIf mark < 70 And mark >= 60 Then
grade = "C+"
Cells(2, 1).Value = grade
ElseIf mark < 80 And mark >= 70 Then
grade = "B"
Cells(2, 1).Value = grade
ElseIf mark <= 100 And mark > -80 Then
grade = "A"
Cells(2, 1).Value = grade
End If
End Sub
Anh chị có thể cho em hỏi " ý nghĩa của Randomize Timer và Int(Rnd*100) được không ah,
(Sau khi được khởi động) hàm Rnd() sẽ cho ta số ngẫu tứ 0 cho đến dưới 1 kiểu Double; Nếu đem số này nhân với 100 & lấy fần nguyên của tích (dòng lệnh 2) ta sẽ được 1 số ngẫu nhiên từ 0 cho đến 99.
Em đang thử nghiệm chèn sheet với đoạn code này với 1 workbook mới toanh
PHP:
Sub insersheet()
Sheets.Add , Sheets(3), 3
End Sub
Nếu ta chạy code Lần đầu thì nó sẽ chèn 3 sheet mới vào sau sheet3 nhưng nếu ta chạy lần sao thì nó sẽ chèn tiếp 3 sheet mới vào sau sheet3 nữa. Vậy làm sao để khi ta chạy đoạn code này vào lần sau nó sẽ chèn 3 sheet mới vào sau sheet6 được. Em không biết làm sao đổi chỗ sheets(3) được. Thanks
Vậy nếu em muốn đổi tên 3 sheet mới chèn vào mà tiếp theo các tên sheet đã tồn tại trong workbook thì em dùng code này
PHP:
Sub insertchange()
Dim i As Long
Sheets.Add , Sheets(Sheets.Count), 3
For i = 1 To Sheets.Count
Sheets(i).Name = "Data" & i
Next i
End Sub
Mà cái này thì em thấy dùng phí quá tại mình chỉ muốn đổi 3 tên sheet tiếp theo thôi mà đâu cần chạy hết các sheet đâu?? Em không biết giải quyết thế nào? Mong ACE giúp đỡ. Thanks
Vậy nếu em muốn đổi tên 3 sheet mới chèn vào mà tiếp theo các tên sheet đã tồn tại trong workbook thì em dùng code này
PHP:
Sub insertchange()
Dim i As Long
Sheets.Add , Sheets(Sheets.Count), 3
For i = 1 To Sheets.Count
Sheets(i).Name = "Data" & i
Next i
End Sub
Mà cái này thì em thấy dùng phí quá tại mình chỉ muốn đổi 3 tên sheet tiếp theo thôi mà đâu cần chạy hết các sheet đâu?? Em không biết giải quyết thế nào? Mong ACE giúp đỡ. Thanks
Thì đúng là phí rồi còn gì! Add sheet nào thì đổi tên ngay lập tức cho nó khỏe
PHP:
Sub insertchange()
Dim i As Long
For i = 1 To 3
Sheets.Add(, Sheets(Sheets.Count)).Name = "Data" & i
Next i
End Sub
Lưu ý: Còn phải qua 1 công đoạn kiểm tra sự tồn tại của sheet trước khi Add, nếu không sẽ báo lỗi trùng tên
Vậy ta làm cho hoàn chỉnh thế này:
PHP:
Function SheetExist(WorkSheetName As String) As Boolean
On Error Resume Next
SheetExist = Not ThisWorkbook.Sheets(WorkSheetName) Is Nothing
End Function
PHP:
Sub insertchange()
Dim i As Long
For i = 1 To 3
If Not SheetExist("Data" & i) Then
Sheets.Add(, Sheets(Sheets.Count)).Name = "Data" & i
End If
Next i
End Sub
Sub insertchange()
Dim i As Long
For i = 1 To 3
If Not SheetExist("Data" & i) Then
Sheets.Add(, Sheets(Sheets.Count)).Name = "Data" & i
End If
Next i
End Sub
Code này chỉ có hiệu lực khi mình chạy lần đầu thôi, mà với 1 workbook mới thì 3 sheet mặc định của nó đâu có đổi tên đâu vẫn giữ nguyên sheet1,sheet2,sheet3 mới chết chứ. Ý em muốn là khi chạy code thì sheet1, sheet2,sheet3,sheet4,sheet5,sheet6 được đổi tên là lược là Data1,....Data6. Nếu mình add thềm 3 sheet nữa thì được nối tiếp tên là Data7,8,9 cứ như vậy tiếp tục đó anh. Thanks
Code này chỉ có hiệu lực khi mình chạy lần đầu thôi, mà với 1 workbook mới thì 3 sheet mặc định của nó đâu có đổi tên đâu vẫn giữ nguyên sheet1,sheet2,sheet3 mới chết chứ. Ý em muốn là khi chạy code thì sheet1, sheet2,sheet3,sheet4,sheet5,sheet6 được đổi tên là lược là Data1,....Data6. Nếu mình add thềm 3 sheet nữa thì được nối tiếp tên là Data7,8,9 cứ như vậy tiếp tục đó anh. Thanks
Function SheetExist(WorkSheetName As String) As Boolean
On Error Resume Next
SheetExist = Not ThisWorkbook.Sheets(WorkSheetName) Is Nothing
End Function
PHP:
Sub insertchange()
Dim i As Long
Sheets.Add , Sheets(Sheets.Count)
Do
i = i + 1
If Not SheetExist("Data" & i) Then Sheets(i).Name = "Data" & i
Loop Until i = Sheets.Count
End Sub
Sub insertchange()
Dim i As Long
Sheets.Add , Sheets(Sheets.Count)
Do
i = i + 1
If Not SheetExist("Data" & i) Then Sheets(i).Name = "Data" & i
Loop Until i = Sheets.Count
End Sub
Cũng là vòng lập nhưng code của tôi không hẳn là duyệt qua các sheet đâu - Đầu tiên tăng i lên 1 (ban đâu chưa có gì thì i = 0)
- Tiếp theo xem cái tên Data & i có tồn tại không
- Nếu không tồn tại thì đặt tên(nếu tồn tại thì chẳng làm gì và... đi tiếp)
Chính vì lẽ đó, tuy duyệt qua các sheet nhưng thực thi công việc chỉ 1 lần duy nhất khi nó phát hiện tên Data & i không tồn tai ---> Khác với cách của bạn là duyệt qua các sheet và sheet nào cũng đặt tên ---> Đây chính là giải thuật để tăng tốc (không làm chuyện thừa)
Chính vì lẽ đó, tuy duyệt qua các sheet nhưng thực thi công việc chỉ 1 lần duy nhất khi nó phát hiện tên Data & i không tồn tai ---> Khác với cách của bạn là duyệt qua các sheet và sheet nào cũng đặt tên ---> Đây chính là giải thuật để tăng tốc (không làm chuyện thừa)
Dạ nhờ anh giải thích em mới hiểu, em thích nhứt là cái function đó, mà mình có thể "chơi" trực tiếp cái function vào đây không anh? Mà em nghĩ nó không hay hen???
Dạ nhờ anh giải thích em mới hiểu, em thích nhứt là cái function đó, mà mình có thể "chơi" trực tiếp cái function vào đây không anh? Mà em nghĩ nó không hay hen???
Đừng tưởng cái Function ấy ngắn chỉ 2 dòng rồi nghĩ mang nó gộp vào code chính là ngon đâu nha! Sẽ rắc rối cho bạn dài dài vì phải bẩy lỗi, trong khi chỉ cần bẩy lỗi duy nhất 1 lần trong Function là đủ (tức giao việc "nặng nhọc" cho 1 thằng lãnh)
Cứ thử xem là biết chứ gì
Xin chào đại gia đinh GPE! Đầu tiên xin gửi lời cảm ơn Chân thành tới tất cả mọi người.Tôi cũng mới tìm hiểu về VBA để nhằm mục đích phục vụ tốt hơn cho công việc của mình.Vì không học lập trình nên rất mong được mọi người giúp đỡ. Xin chân thành cảm ơn!