Đố vui về VBA!

Liên hệ QC

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,911
Nhằm cũng cố kiến thức về VBA cho các bạn mới bắt đầu và cả những bạn đang ứng dụng mà chưa hiểu nhiều về nó, tôi mở topic này với mong mõi qua những câu hỏi vui, các bạn sẽ nhận định lại sự hiểu biết cũa mình... (Kễ cã chính tôi cũng đang tập tành nên có rất nhiều cái chưa biết)
Mong rằng topic sẽ mang đến cho các bạn những khám phá thú vị với những cái tưỡng chừng như đã biết
Mong nhận dc bài viết về câu đố cũa các cao thủ! Còn các bạn mới thì đừng ngại khi đưa ra ý kiến cũa mình.. Có sai có sữa sẽ hoàn thiện!
Tôi xin mỡ màn trước bằng 1 câu hỏi đơn giãn
ANH TUẤN

CÂU HỎI 1: Tại sao biến K ko hoạt động?
Tôi muốn khi nhấn vào 1 button thì cell A1 sẽ tăng lên 1 đơn vị... Tôi đã làm như sau:
-Tạo 1 Command Button (nút nhấn thuộc thanh Control Toolbox), click phải chuột lên nút nhấn, chọn View code, rồi gõ vào đoạn code sau:
PHP:
Private Sub CommandButton1_Click()
   K = K + 1
   Range("A1").Value = K
End Sub
Ban đầu K chưa có gì, xem như =0, nhấn nút lần thứ nhất thì K dc tăng thêm 1, vậy K hiện tại sẽ bằng 1, và gán K vào cell A1 thì đương nhiên A1 sẽ =1... Nhấn nút lần 2, K lại dc tăng thêm 1 nên hiện tại K sẽ =2 và cell A1 cũng sẽ =2... vân vân.. từ đó diễn tiến tiếp...
Hi.. hi.. Điều này nghe qua có vẽ rất hợp lý, ấy thế mà khi nhấn nút nó chỉ hoạt động dc duy nhất 1 lần (A1 = 1) rồi thôi ko nhút nhít nữa...
Các bạn có thể giãi thích tại sao lại như thế ko? Tại sao những lần nhấn nút sau đó K lại ko tăng thêm tí nào (vì thực tế A1 vẫn cứ = 1 hoài) ?
ANH TUẤN
 
hihi, em làm cách cùi bắp là copy roi chuyen cot.

PHP:
Sub Test()    
Sheet1.Range("A:A,B:B,D:D,J:J,L:L").Copy Sheets("Sheet2").Range("A1")    
Sheet2.Columns("C:C").Cut    
Sheet2.Columns("A:A").Insert Shift:=xlToRight
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Tác giả bảo là không bàn đến Copy mà!
 
Upvote 0
Khà khà... Đây mới gọi là "độc chiêu" nè:
PHP:
Sub Test()
    Sheet1.Activate
    [A1:E1].Value = Array("MATERIAL NAME", "DATE", "DEPT", "QTY.", "AMOUNT(VND)")
    Sheet2.UsedRange.AdvancedFilter xlFilterCopy, , [A1:E1]
End Sub
 
Upvote 0
Khà khà... Đây mới gọi là "độc chiêu" nè:
PHP:
Sub Test()
    Sheet1.Activate
    [A1:E1].Value = Array("MATERIAL NAME", "DATE", "DEPT", "QTY.", "AMOUNT(VND)")
    Sheet2.UsedRange.AdvancedFilter xlFilterCopy, , [A1:E1]
End Sub
Tôi thử bị lỗi ở đây
Sheet2.UsedRange.AdvancedFilter xlFilterCopy, , [A1:E1]
 
Upvote 0
Sao mình chạy báo lỗi '1004' dòng cuối nhỉ?

Vấn đề ở Sheet Name và SheetCodeName thôi anh à
Dùng tên sheet trên bảng tính cho chắc:
PHP:
Sub Test()
  Dim SrcRng As Range, rTitle As Range, aTitle
  Set SrcRng = Sheets("Sheet1").Range("A1:L10000")
  aTitle = Array("MATERIAL NAME", "DATE", "DEPT", "QTY.", "AMOUNT(VND)")
  Set rTitle = Sheets("Sheet2").Range("A1:E1")
  rTitle.Value = aTitle
  SrcRng.AdvancedFilter 2, , rTitle
End Sub
Chiêu này học được từ nghiaphuc cũng.. lâu lâu rồi
Advanced Filter mọi người xài nhiều nhưng chắc ít người biết nó có thể trích lọc theo 1 vài cột nào đó tùy ý người dùng chọn mà không cần phải lọc toàn bộ. Ngoài ra, nơi đặt kết quả cũng có thể đảo vị trí cột thoải mái
Ẹc... ẹc...
 
Lần chỉnh sửa cuối:
Upvote 0
Vấn đề ở Sheet Name và SheetCodeName thôi anh à
Dùng tên sheet trên bảng tính cho chắc:
PHP:
Sub Test()
  Dim SrcRng As Range, rTitle As Range, aTitle
  Set SrcRng = Sheets("Sheet1").Range("A1:L10000")
  aTitle = Array("MATERIAL NAME", "DATE", "DEPT", "QTY.", "AMOUNT(VND)")
  Set rTitle = Sheets("Sheet2").Range("A1:E1")
  rTitle.Value = aTitle
  SrcRng.AdvancedFilter 2, , rTitle
End Sub
Chiêu này học được từ nghiaphuc cũng.. lâu lâu rồi
Advanced Filter mọi người xài nhiều nhưng chắc ít người biết nó có thể trích lọc theo 1 vài cột nào đó tùy ý người dùng chọn mà không cần phải lọc toàn bộ. Ngoài ra, nơi đặt kết quả cũng có thể đảo vị trí cột thoải mái
Ẹc... ẹc...

Khoan đã, trong sheet1 nếu có 2 cột QTY. vậy theo đó, nó lấy cột nào?
 
Lần chỉnh sửa cuối:
Upvote 0
Khà khà... Đây mới gọi là "độc chiêu" nè:
PHP:
Sub Test()
    Sheet1.Activate
    [A1:E1].Value = Array("MATERIAL NAME", "DATE", "DEPT", "QTY.", "AMOUNT(VND)")
    Sheet2.UsedRange.AdvancedFilter xlFilterCopy, , [A1:E1]
End Sub

Hay, nếu vậy cần gì Sheet1.Activate chứ bạn NghiaPhuc!

PHP:
Sub Test2()
    Sheet2.[A1:E1].Value = Array("MATERIAL NAME", "DATE", "DEPT", "QTY.", "AMOUNT(VND)")
    Sheet1.UsedRange.AdvancedFilter xlFilterCopy, , Sheet2.[A1:E1]
End Sub
 
Upvote 0
Khoan đã, trong sheet1 nếu có 2 cột QTY. vậy theo đó, nó lấy cột nào?

Dùng công cụ có sẵn của bác Bill thì phải thuộc lòng câu này: CƠ SỞ DỮ LIỆU LUÔN LUÔN CHUẨN
Sao có thể có chuyện trùng tiêu đề được... Và nếu có, vui lòng làm sao cho nó hết trùng nếu muốn xài công cụ có sẵn (bằng không thì.. nghĩ xài)
Ẹc... Ẹc...
 
Upvote 0
Dùng công cụ có sẵn của bác Bill thì phải thuộc lòng câu này: CƠ SỞ DỮ LIỆU LUÔN LUÔN CHUẨN
Sao có thể có chuyện trùng tiêu đề được... Và nếu có, vui lòng làm sao cho nó hết trùng nếu muốn xài công cụ có sẵn (bằng không thì.. nghĩ xài)
Ẹc... Ẹc...

Hỏi là hỏi vậy, chứ biết chắc nó gặp cột đầu tiên sẽ "chụp liền". Có nhiều trường hợp trùng này lắm, chẳng hạn, ô A1:B1 (merge) là LOẠI HÀNG A, A2 là Số lượng, B2 là Thành tiền, cứ như thế cho đến n loại hàng.
 
Upvote 0
Hỏi là hỏi vậy, chứ biết chắc nó gặp cột đầu tiên sẽ "chụp liền". Có nhiều trường hợp trùng này lắm, chẳng hạn, ô A1:B1 (merge) là LOẠI HÀNG A, A2 là Số lượng, B2 là Thành tiền, cứ như thế cho đến n loại hàng.

Thôi thì mấy loại hằm bà lằng này ta khỏi bàn đến đi
Nếu "buộc" phải có loại tiêu đề dạng này, người ta cũng cố tạo thêm 1 dòng nữa là tiêu đề giả ---> Thế nhé
(chẳng ai lại muốn mang khổ vào mình)
Ẹc... Ẹc...
 
Upvote 0
Hay, nếu vậy cần gì Sheet1.Activate chứ bạn NghiaPhuc!
PHP:
Sub Test2()
    Sheet2.[A1:E1].Value = Array("MATERIAL NAME", "DATE", "DEPT", "QTY.", "AMOUNT(VND)")
    Sheet1.UsedRange.AdvancedFilter xlFilterCopy, , Sheet2.[A1:E1]
End Sub
Đâu có được đâu anh. Anh thử đứng ở sheet nguồn và chạy code xem nào! Theo em được biết thì tham số CopyToRange phải nằm trên sheet hiện hành mới được.
Mà anh ndu đưa ra file dữ liệu nghiệt thật, sheet có code name Sheet1 thì lại có tên là Sheet2 và ngược lại, đâm ra lại "loạn cào cào" lên, chẳng biết phải gọi cái nào là Sheet1, cái nào là Sheet2 nữa.
 
Upvote 0
Đâu có được đâu anh. Anh thử đứng ở sheet nguồn và chạy code xem nào! Theo em được biết thì tham số CopyToRange phải nằm trên sheet hiện hành mới được.
Mà anh ndu đưa ra file dữ liệu nghiệt thật, sheet có code name Sheet1 thì lại có tên là Sheet2 và ngược lại, đâm ra lại "loạn cào cào" lên, chẳng biết phải gọi cái nào là Sheet1, cái nào là Sheet2 nữa.

Sao vậy NghiaPhuc? mình gửi file lên nhé, kiểm tra lại đi, sheet nào mình cũng đặt nút lệnh và dùng chung một code hết đấy nhé!

Mã:
Sub Test2()
    [B]Sheet2.Cells.ClearContents[/B] [COLOR=#006400] '<---- Có thêm thì cũng chỉ thêm dòng này thôi.[/COLOR]
    Sheet2.[A1:E1].Value = Array("MATERIAL NAME", "DATE", "DEPT", "QTY.", "AMOUNT(VND)")
    Sheet1.UsedRange.AdvancedFilter xlFilterCopy, , [COLOR=#ff0000][B]Sheet2[/B][/COLOR].[A1:E1]
End Sub

Lỗi phát sinh là ở chỗ màu đỏ đấy, bạn không cho vào thì tèo.
 

File đính kèm

  • Test.xls
    44.5 KB · Đọc: 13
Lần chỉnh sửa cuối:
Upvote 0
Đâu có được đâu anh. Anh thử đứng ở sheet nguồn và chạy code xem nào! Theo em được biết thì tham số CopyToRange phải nằm trên sheet hiện hành mới được.
.
Làm bằng tay thì bắt buộc phải vậy, còn nếu dùng code thì không cần, chỉ cần ghi rõ vùng nào thuộc sheet nào là được rồi
Mà anh ndu đưa ra file dữ liệu nghiệt thật, sheet có code name Sheet1 thì lại có tên là Sheet2 và ngược lại, đâm ra lại "loạn cào cào" lên, chẳng biết phải gọi cái nào là Sheet1, cái nào là Sheet2 nữa.
Tại cố ý làm vậy đấy
Ai biểu dùng sheet code name chi! ---> Code của tôi luôn là Sheets("Tên sheet") cho chắc ---> Nếu người dùng tự ý đổi tên sheet thì đó là vấn đề của họ, không phải lỗi tại tôi
Ẹc... Ẹc...
 
Upvote 0
Sao vậy NghiaPhuc? mình gửi file lên nhé, kiểm tra lại đi, sheet nào mình cũng đặt nút lệnh và dùng chung một code hết đấy nhé!

Mã:
Sub Test2()
    [B]Sheet2.Cells.ClearContents[/B] [COLOR=#006400] '<---- Có thêm thì cũng chỉ thêm dòng này thôi.[/COLOR]
    [COLOR=#0000ff][B]Sheet2.[/B][/COLOR][A1:E1].Value = Array("MATERIAL NAME", "DATE", "DEPT", "QTY.", "AMOUNT(VND)")
    Sheet1.UsedRange.AdvancedFilter xlFilterCopy, , [COLOR=#ff0000][B]Sheet2[/B][/COLOR].[A1:E1]
End Sub
Lỗi phát sinh là ở chỗ màu đỏ đấy, bạn không cho vào thì tèo.
Em nhầm một chút, vấn đề không phải là ở chỗ màu đỏ mà là ở chỗ em quên chỗ màu xanh. Ẩu quá!
À, dòng lệnh anh thêm vào thì lại chẳng có ý nghĩa gì nếu thực sự Sheet2 chỉ sử dụng để lưu kết quả lọc. Kết quả này sẽ được anh chàng AdFi xóa tự động trước khi lấy kết quả mới. Nếu có thêm thì thêm Clear luôn chứ đừng ClearContents, vì Clear sẽ xóa tất cả mọi thứ (cả khung, màu nền,...), còn ClearContents chỉ xóa nội dung.
 
Upvote 0
Xác định tên của Workbook vừa mở

Giả sử các bạn tạo ra 1 Add-In có tên là Test.xla, trong Add-In này có 1 công đoạn xác định tên của Workbook nào đó vừa mở.
Ví dụ: (sau khi Add-In đã được kích hoạt)
- Tôi mở 1 workbook có tên là TestA.xls, lập tức 1 MsgBox xuất hiện với nội dung "Bạn vừa mở file TestA.xls"
- Tôi mở tiếp 1 workbook khác có tên là TestB.xls, lập tức 1 MsgBox xuất hiện với nội dung "Bạn vừa mở file TestB.xls"
Nói tóm lại: Cứ có Workbook nào được mở thì sẽ có thông báo xuất hiện cho biết tên của Workbook đó
Xin hỏi: Tôi phải viết code cho Add-In này như thế nào?
 
Upvote 0
Giả sử các bạn tạo ra 1 Add-In có tên là Test.xla, trong Add-In này có 1 công đoạn xác định tên của Workbook nào đó vừa mở.
Ví dụ: (sau khi Add-In đã được kích hoạt)
- Tôi mở 1 workbook có tên là TestA.xls, lập tức 1 MsgBox xuất hiện với nội dung "Bạn vừa mở file TestA.xls"
- Tôi mở tiếp 1 workbook khác có tên là TestB.xls, lập tức 1 MsgBox xuất hiện với nội dung "Bạn vừa mở file TestB.xls"
Nói tóm lại: Cứ có Workbook nào được mở thì sẽ có thông báo xuất hiện cho biết tên của Workbook đó
Xin hỏi: Tôi phải viết code cho Add-In này như thế nào?

Trường hợp với một cái file mới tạo từ Excel, thì sao ạ?
 
Upvote 0
Người ta đã bào là: TÊN FILE VỪA MỞ rồi mà
File vừa mở nghĩa là file có sẵn mình mở lên, khác với file vừa tạo mới nha

Đúng là không dễ nhai! Với addins nó chạy trước, sau đó mới mở workbook kích hoạt, bị báo lỗi chỗ này hoài!
 
Upvote 0
Web KT

Bài viết mới nhất

Back
Top Bottom