Các câu đố, bài tập nhằm ôn tập & bổ sung kiến thức căn bản VBA

Liên hệ QC

Hoàng Trọng Nghĩa

Chuyên gia GPE
Thành viên BQT
Moderator
Tham gia
17/8/08
Bài viết
8,621
Được thích
16,681
Giới tính
Nam
Với tinh thần chơi mà học, học mà chơi, nên tôi đã mở ra topic này, hy vọng các thành viên tham gia, nhất là các thành viên mới biết về VBA.

Sau đây là câu hỏi đầu tiên:

Câu hỏi 1: Bằng phương pháp nào nhanh nhất để tìm ra ô nào trong một cột chứa một điều kiện.

Tôi có 1 file Excel 2007, với cột A, từ A1 đến A1048576 đều có giá trị.

Bằng phương pháp nào nhanh nhất (dùng mảng, dùng For Each v.v...) để tìm ra ô nào trong cột A chứa chữ "Nghia", đồng thời với ô ở cột B tương ứng nhập giá trị "OK" vào đó?

Ví dụ tìm thấy trong ô A2 có giá trị là "Nghia" thì ô B2 nhập vào "OK".

Hiện tại, đáp án nhanh nhất mà tôi có được đã gửi mail riêng (nhằm ghi lại thời gian gửi, để tránh nói ăn gian).

Để tiện việc theo dõi các câu đố, các bài tập tôi đã tạo ra topic này các bạn click vào đây:

Các link của topic "Các câu đố, bài tập nhằm ôn tập & bổ sung kiến thức căn bản VBA"
 

File đính kèm

  • DoVuiCanBan.rar
    1.3 MB · Đọc: 618
Lần chỉnh sửa cuối:
Upvote 0
đoạn này có ý nghĩa gì hén các pro. em chưa học nên không biết

Sarr = Range([A2], [A65536].End(3)).Resize(, 3).Value
 
Upvote 0
đoạn này có ý nghĩa gì hén các pro. em chưa học nên không biết

Sarr = Range([A2], [A65536].End(3)).Resize(, 3).Value

Lấy dữ liệu từ A2 đến dòng cuối cùng cột A --> mở rộng ra đến cột C và nạp vào mảng Sarr.
Giống như cho dữ liệu (A2:C dòng cuối cùng cột A) vào mảng Sarr.
 
Upvote 0
đoạn này có ý nghĩa gì hén các pro. em chưa học nên không biết

Sarr = Range([A2], [A65536].End(3)).Resize(, 3).Value

chắc là vậy
vùng từ A2 đến A có dòng data cuối cùng, mở rộng thêm 3 cột
thành A2:C100 (thí dụ A100 là cell cuối cùng cột A có số liệu)
hỏng bít đúng hong nữa thử vậy xem

Range([A2], [A65536].End(3)).Resize(, 3).select
 
Upvote 0
a. Trước tiên Target trong các thủ tục sự kiện là 1 tham số truyền, và có kiểu Range. (Gọi là biến nghe không ổn lắm)

Những gì Sư phụ nó về SỰ KIỆN của Worksheet thì đã đầy đủ và chính xác rồi, em không thảo luận thêm gì nữa, nhưng em nói rộng một chút về cái phần em tô đậm:

Sự kiện được thực hiện bởi một thủ tục (Sub) chứ không phải một hàm (Function) - cái này cũng đã được Sư phụ nói đến rất rõ.


Cấu trúc của một Sub:

Syntax:

[Private | Public | Friend] [Static] Sub name [(arglist)]

[statements]

[Exit Sub]

[statements]

End Sub


Vậy cái arglist là gì?

Đó chính là 'argument list' gọi nôm na là 'danh sách đối số'.

Thế một argument là gì?

Đó chính là: 'A constant, variable, or expression passed to a procedure' tạm dịch là 'Một hằng số, biến, hoặc biểu hiện thông qua một thủ tục'.

Vậy trong cú pháp của một Sub thì arglist được sử dụng như thế nào?

arglist: Optional. List of variables representing arguments that are passed to the Sub procedure when it is called. Multiple variables are separated by commas.

(tạm dịch là: Tùy chọn. Danh sách các biến đại diện cho đối số được truyền cho thủ tục Sub khi nó được gọi. Nhiều biến số thì được phân cách bằng dấu phẩy (,).)


Từ những việc nói trên, ta có thể khẳng định rằng Target chính là một biến, biến đó là đối số được truyền trong thủ tục, mà nói ngắn gọn như Sư phụ là một tham số truyền, còn việc "Gọi biến là không ổn" là chưa chính xác vì nó rất "ổn" và rất chính xác.
 
Upvote 0
Vậy cái arglist là gì?

Đó chính là 'argument list' gọi nôm na là 'danh sách đối số'.

Thế một argument là gì?

Đó chính là: 'A constant, variable, or expression passed to a procedure' tạm dịch là 'Một hằng số, biến, hoặc biểu hiện thông qua một thủ tục'.

Từ những việc nói trên, ta có thể khẳng định rằng Target chính là một biến, biến đó là đối số được truyền trong thủ tục, mà nói ngắn gọn như Sư phụ là một tham số truyền, còn việc "Gọi biến là không ổn" là chưa chính xác vì nó rất "ổn" và rất chính xác.

Nghĩa luôn luôn nhầm lẫn giữa chung và riêng. Lần trước trong cú pháp hàm InputBox cũng nhầm lẫn tham số của hàm với hằng. Lần này lại lấy cái riêng gán cho cái chung.

Chính trong câu trích của Nghĩa, bên trong thủ tục là Argument List, và nó không phải chỉ là biến, nó còn là hằng, là expression, ...

Vậy thì trong bài viết mang tính tổng quát, phải nói đến cái chung là arguments các loại (tham số), chứ không nói đến cái riêng là biến, dù Target có thể là biến.

Tôi nói rất rõ trong bài trên (lúc chưa viết lại) là Nghĩa không sai, chỉ là không đầy đủ. Khi viết chính thức, tôi cũng không bảo là sai, mà chỉ bảo là không ổn.

Nếu tôi không ghi chữ "không ổn" và Nghĩa không phản ứng, thì người mới học đâu có được Nghĩa giới thiệu nào là argument, nào là const, nào là expression?

Viết tổng quát thì phải viết bằng danh từ chỉ cái chung, nếu nói chi tiết đến cái riêng thì phải liệt kê hết những cái riêng ngay từ đầu chứ?
 
Upvote 0
Những gì Sư phụ nó về SỰ KIỆN của Worksheet thì đã đầy đủ và chính xác rồi, em không thảo luận thêm gì nữa, nhưng em nói rộng một chút về cái phần em tô đậm:

Sự kiện được thực hiện bởi một thủ tục (Sub) chứ không phải một hàm (Function) - cái này cũng đã được Sư phụ nói đến rất rõ.


Cấu trúc của một Sub:

Syntax:

[Private | Public | Friend] [Static] Sub name [(arglist)]

[statements]

[Exit Sub]

[statements]

End Sub


Vậy cái arglist là gì?

Đó chính là 'argument list' gọi nôm na là 'danh sách đối số'.

Thế một argument là gì?

Đó chính là: 'A constant, variable, or expression passed to a procedure' tạm dịch là 'Một hằng số, biến, hoặc biểu hiện thông qua một thủ tục'.

Vậy trong cú pháp của một Sub thì arglist được sử dụng như thế nào?

arglist: Optional. List of variables representing arguments that are passed to the Sub procedure when it is called. Multiple variables are separated by commas.

(tạm dịch là: Tùy chọn. Danh sách các biến đại diện cho đối số được truyền cho thủ tục Sub khi nó được gọi. Nhiều biến số thì được phân cách bằng dấu phẩy (,).)


Từ những việc nói trên, ta có thể khẳng định rằng Target chính là một biến, biến đó là đối số được truyền trong thủ tục, mà nói ngắn gọn như Sư phụ là một tham số truyền, còn việc "Gọi biến là không ổn" là chưa chính xác vì nó rất "ổn" và rất chính xác.
Thấy A viết khá hay, phiềm A nêu rõ thêm định nghĩa: thế nào là biến , và thế nào là tham số đc ko?
 
Upvote 0
Nghĩa luôn luôn nhầm lẫn giữa chung và riêng. Lần trước trong cú pháp hàm InputBox cũng nhầm lẫn tham số của hàm với hằng. Lần này lại lấy cái riêng gán cho cái chung.

Chính trong câu trích của Nghĩa, bên trong thủ tục là Argument List, và nó không phải chỉ là biến, nó còn là hằng, là expression, ...

Vậy thì trong bài viết mang tính tổng quát, phải nói đến cái chung là arguments các loại (tham số), chứ không nói đến cái riêng là biến, dù Target có thể là biến.

Tôi nói rất rõ trong bài trên (lúc chưa viết lại) là Nghĩa không sai, chỉ là không đầy đủ. Khi viết chính thức, tôi cũng không bảo là sai, mà chỉ bảo là không ổn.

Nếu tôi không ghi chữ "không ổn" và Nghĩa không phản ứng, thì người mới học đâu có được Nghĩa giới thiệu nào là argument, nào là const, nào là expression?

Viết tổng quát thì phải viết bằng danh từ chỉ cái chung, nếu nói chi tiết đến cái riêng thì phải liệt kê hết những cái riêng ngay từ đầu chứ?

Em định nghĩa cái arguments là cái tổng thể, còn trường hợp riêng của Sub nó chỉ là List của các biến mà thôi, không hề có một hằng hay một thứ gì khác!

arglist: Optional. List of variables representing arguments that are passed to the Sub procedure when it is called. Multiple variables are separated by commas.

(tạm dịch là: Tùy chọn. Danh sách các biến đại diện cho đối số được truyền cho thủ tục Sub khi nó được gọi. Nhiều biến số thì được phân cách bằng dấu phẩy (,).)

Cho nên nó chỉ là BIẾN chứ không là những thứ khác được! Còn cách gọi trong trường hợp này gọi chúng là gì thì ta gọi nó là "tham số truyền" hay "đối số truyền", còn câu hỏi của em là "Target là gì?".
 
Upvote 0
Thấy A viết khá hay, phiềm A nêu rõ thêm định nghĩa: thế nào là biến , và thế nào là tham số đc ko?
Không biết Good-Luck hỏi học hay hỏi đố nữa, tuy nhiên hỏi kiểu nào cũng được vì câu hỏi đó khá đơn giản!

Theo Toán Học:


Tham số là gì?

Một tham số là một đối số của một hàm toán học

Trong toán học, sự khác nhau giữa một "tham số" (parameter) và một "đối số" (argument) của một hàm là: tham số là các kí hiệu thuộc phần định nghĩa của hàm, trong khi các đối số là các kí hiệu được cung cấp cho hàm khi nó được dùng.


Biến là gì?

Biến số là một số có giá trị bất kỳ, không bắt buộc phải duy nhất có một giá trị (không có giá trị nhất định), biến số là số có thể thay đổi giá trị trong một tình huống có thể thay đổi. Ngược lại với khái niệm biến số là một khái niệm hằng số. Hằng số là một số không thể thay đổi trong bất kỳ các tình huống nào đó.

VBA cũng định nghĩa chúng theo phương pháp toán học mà thôi.
 
Upvote 0
theo tôi được biết trong ngôn ngữ lập trình C++
biến là một vùng nhớtên dùng để lưu trữ các giá trị khi tính toán, các giá trị của biến có thể thay đổi trong suốt thời gian chương trình thực thi.
vùng nhớ này có độ lớn nhỏ tùy theo kiểu dữ liệu
 
Upvote 0
Câu hỏi 8: Làm sao để có được dòng Option Explicit tự động khi bạn tạo Module mới ?

Liên quan đến bài này:

Câu hỏi 5: Bằng câu lệnh nào khi chạy code sẽ thông báo lỗi khi không khai báo biến?

Và một bạn đã trả lời:

À cái này mình biết, đó là

Option Explicit
ngay dòng đầu tiên luôn

Câu hỏi đặt ra là làm sao bạn có thể đặt Option Explicit một cách tự động khi bạn tạo một Module mới mà không cần phải gõ thủ công?
 
Upvote 0
Liên quan đến bài này:
Câu hỏi 5: Bằng câu lệnh nào khi chạy code sẽ thông báo lỗi khi không khai báo biến?
Và một bạn đã trả lời:
Câu hỏi đặt ra là làm sao bạn có thể đặt Option Explicit một cách tự động khi bạn tạo một Module mới mà không cần phải gõ thủ công?
Vào Tools > Options > Tab Editor > Check Require Variable Declaration > OK.
1.jpg
 
Upvote 0
Câu hỏi 9: Làm sao để ẩn Tên Macro ở cửa sổ Macro (Alt+F8), có bao nhiêu cách

Nhân tiện đây xin đố luôn, không mới nhưng sẽ có người không biết (Chỉ dành cho người mới tập viết VBA):

Làm sao để ẩn Tên Macro ở cửa sổ Macro (Alt+F8), có bao nhiêu cách để ẩn?
 
Lần chỉnh sửa cuối:
Upvote 0
Nhân tiện đây xin đố luôn, không mới nhưng sẽ có người không biết (Chỉ dành cho người mới tập viết VBA):
Làm sao để ẩn Tên Macro ở cửa sổ Macro (Alt+F8), có bao nhiêu cách để ẩn?
Thay Sub thành Private Sub.
Còn cách khác thì em chưa biết, chờ các bạn khác giải đáp.
 
Upvote 0
Nhân tiện đây xin đố luôn, không mới nhưng sẽ có người không biết (Chỉ dành cho người mới tập viết VBA):

Làm sao để ẩn Tên Macro ở cửa sổ Macro (Alt+F8), có bao nhiêu cách để ẩn?
Cho mình xin cái tiêu đề nhé, nhằm mục đích cập nhật link bài viết, chẳng hạn như:

Câu hỏi 9: Làm sao để ẩn Tên Macro ở cửa sổ Macro (Alt+F8), có bao nhiêu cách để ẩn?

Với câu này, khi đang "đau khổ" mình đã có lần hỏi trên diễn đàn và được giúp đỡ.
 
Upvote 0
Cho mình xin cái tiêu đề nhé, nhằm mục đích cập nhật link bài viết, chẳng hạn như:

Câu hỏi 9: Làm sao để ẩn Tên Macro ở cửa sổ Macro (Alt+F8), có bao nhiêu cách để ẩn?

Với câu này, khi đang "đau khổ" mình đã có lần hỏi trên diễn đàn và được giúp đỡ.
Đang ngồi hóng để học ké mấy cái cơ bản. Mình toàn mò mẩm edit nên chẳng có cơ bản gì ráo trọi. Câu hỏi này mình cũng không biết trả lời luôn.
 
Upvote 0
Em định nghĩa cái arguments là cái tổng thể, còn trường hợp riêng của Sub nó chỉ là List của các biến mà thôi, không hề có một hằng hay một thứ gì khác!



Cho nên nó chỉ là BIẾN chứ không là những thứ khác được! Còn cách gọi trong trường hợp này gọi chúng là gì thì ta gọi nó là "tham số truyền" hay "đối số truyền", còn câu hỏi của em là "Target là gì?".

Nghĩa chẳng bao giờ hiểu được tôi (hoặc người mà Nghĩa muốn phản bác) muốn nói gì.

Tôi nói đơn giản 1 câu: Nghĩa không bao giờ giới thiệu cái chung, chưa bao giờ viết 1 bài tổng quát ra hồn. Nghĩa toàn hỏi, hoặc đố, hoặc thí dụ, hoặc giải thích 1 cái riêng, cái nhỏ trong tổng thể.

Tôi nhắc lại, viết trong topic này là viết cho người mới học, từng câu từng chữ phải cân nhắc. Giới thiệu phải giới thiệu tổng quát, giới thiệu chi tiết thì phải giới thiệu hết chi tiết. Chứ không phải nay xì ra 1 dạng variable, mai xì ra 1 const, 1 expression, ... trong khi chỉ cần nói chung là Argument.

Nghĩa có thể biết hết đấy, nhưng viết ra hồn thì không viết. Nếu có ai nói Nghĩa không tổng quát thì Nghĩa phản bác tới cùng. Vụ việc InputBox, vụ việc For next hay Do Loop, vụ việc GoTo, và bên topic khác là vụ việc hàm Joint, Nghĩa luôn luôn đúng, và người khác luôn luôn sai.

Nói 1 câu Nghĩa có thể buồn hoặc giận, chứ Nghĩa chưa có khả năng viết bài giới thiệu kiến thức.

Nói thêm 1 câu, có thể Nghĩa sẽ chửi tôi, chứ tôi thấy nói với đầu gối sướng hơn.
 
Upvote 0
Web KT
Back
Top Bottom