Hỏi đáp về VBA (các vấn đề căn bản nhất)

Liên hệ QC

havietchuong

Thành viên tiêu biểu
Tham gia
16/6/09
Bài viết
490
Được thích
570
Giới tính
Nam
Nghề nghiệp
Giáo viên tiểu học.
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.
 

File đính kèm

  • baitap1.xls
    28 KB · Đọc: 244
Lần chỉnh sửa cuối:
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
 
Lần chỉnh sửa cuối:
Upvote 0
Trong tập tin sau có lỗi gì không trong cách ghi Macro?

PHP:
Sub BaiTap1()
    ActiveCell.Select
    ActiveCell.FormulaR1C1 = "2"
    ActiveCell.Offset(0, 1).Range("A1").Select
    ActiveCell.FormulaR1C1 = "3"
    ActiveCell.Offset(0, 1).Range("A1").Select
    ActiveCell.FormulaR1C1 = "=RC[-2]+RC[-1]"
    ActiveCell.Offset(1, 0).Range("A1").Select
End Sub

Đoạn code có thể chạy đúng theo ý muốn nhưng rườm rà. Sau đây là 1 gợi ý:

Code gốc​
|
Có thể sửa lại​
|
Có thể bỏ bớt​
|
ActiveCell.Select|Bỏ|Bỏ|
ActiveCell.FormulaR1C1 = "2"| ActiveCell.Value = 2| ActiveCell = 2|
ActiveCell.Offset(0, 1).Range("A1").Select| ActiveCell.Offset(0, 1).Select|Bỏ|
ActiveCell.FormulaR1C1 = "3"| ActiveCell.Value = 3| ActiveCell.Offset(0, 1) = 3|
ActiveCell.Offset(0, 1).Range("A1").Select| ActiveCell.Offset(0, 1).Select|Bỏ|
ActiveCell.FormulaR1C1 = "=RC[-2]+RC[-1]"| ActiveCell.FormulaR1C1 = "=RC[-2]+RC[-1]"| ActiveCell.Offset(0, 2).FormulaR1C1 = "=RC[-2]+RC[-1]"|
ActiveCell.Offset(1, 0).Range("A1").Select| ActiveCell.Offset(0, 1).Select|Bỏ|

Code trở thành:

PHP:
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.
 
Lần chỉnh sửa cuối:
Upvote 0
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.
 
Upvote 0
Code trở thành:

PHP:
Sub BaiTap1()
    ActiveCell = 2
    ActiveCell.Offset(0, 1) = 3
    ActiveCell.Offset(0, 2).FormulaR1C1 = "=RC[-2]+RC[-1]"
End Sub
.
Em thường viết theo kiểu này
Hoặc:
PHP:
Sub BaiTap1()
  With ActiveCell
    .Offset(0, 0) = 2
    .Offset(0, 1) = 3
    .Offset(0, 2) = "=RC[-2]+RC[-1]"
  End With
End Sub
Hoặc ngắn hơn:
PHP:
Sub BaiTap1()
  ActiveCell(1, 1) = 2
  ActiveCell(1, 2) = 3
  ActiveCell(1, 3) = "=RC[-2]+RC[-1]"
End Sub
Ghi chú:
Cách viết Vung(dòng, cột) là kiểu truy xuất các phần tử trong mảng ---> Nó gần giống 99% cách truy xuất của hàm INDEX
 
Lần chỉnh sửa cuối:
Upvote 0
Các bạn: Ptm, udu, Khoa và các bạn khác.
Chỉ giúp tôi có cách nào hay tìm hiểu ở đâu để hiểu thêm về các ngôn ngữ VBA. Cám ơn
 
Upvote 0
Các bạn: Ptm, udu, Khoa và các bạn khác.
Chỉ giúp tôi có cách nào hay tìm hiểu ở đâu để hiểu thêm về các ngôn ngữ VBA. Cám ơn
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)
 
Lần chỉnh sửa cuối:
Upvote 0
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.
 
Upvote 0
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
 
Upvote 0
havietchuong đã viết:
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?

Bạn không đọc kỹ phần trả lời của tôi trên kia:

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.
 
Lần chỉnh sửa cuối:
Upvote 0
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ì?

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
 
Upvote 0
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?
 
Upvote 0
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.
 
Upvote 0
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ũ
 
Lần chỉnh sửa cuối:
Upvote 0
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=&quot]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]
 
Upvote 0
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.
 

File đính kèm

  • chuong1.xls
    21.5 KB · Đọc: 34
Upvote 0
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.
Lổi là lổi thế nào? (ghi toàn bộ câu báo lổi lên đây nhé)
Tôi không thấy chổ nào có thể phát sinh lổi cả!
 
Upvote 0
PHP:
Sub BaiTap1()
  ActiveCell(1, 1) = 2
  ActiveCell(1, 2) = 3
  ActiveCell(1, 3) = "=RC[-2]+RC[-1]"
End Sub
Trên bình diện code lớn, có .value vẫn nhanh hơn các bác àh. Em được học thế.
PHP:
Sub BaiTap1()
  ActiveCell(1, 1).value = 2
  ActiveCell(1, 2).value = 3
  ActiveCell(1, 3).value = "=RC[-2]+RC[-1]"
End Sub
 
Upvote 0
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
 

File đính kèm

  • chuong1-1.xls
    39.5 KB · Đọc: 36
Chỉnh sửa lần cuối bởi điều hành viên:
Upvote 0
Web KT
Back
Top Bottom