Đố vui về VBA! (2 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

anhtuan1066

Thành viên gạo cội
Tham gia
10/3/07
Bài viết
5,802
Được thích
6,912
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
 
Reg thì khó nhưng với những dạng chuỗi như thế này thì anh Nghĩa có thể hiểu "dễ" như sau

Với
Mã:
.Pattern = " +"
+/ Dấu cộng là lặp lại phần đằng trước từ 1 lần trở lên, => phần đằng trước là dấu cách tương ứng mẫu (\s). (cái này tương ứng "\s+") => Trong đoạn Str cứ chỗ nào có 1 dấu cách trở lên thì đánh dấu nó lại
+/ Dùng .replace để thay thế phần đánh dấu đó.

Với
Mã:
.Pattern = "\s{2,}"
thì anh hiểu như sau
+/ mẫu \s là dấu cách
+/ {x,} => Trong đoạn Str cứ chỗ nào lặp lại phía trước (là dấu cách) ít nhất 2 lần (từ 2 dấu cách trở lên) thì đánh dấu (1 dấu cách thì không đánh dấu)
+/ Dùng Replace để thay thế

Những bài viết về Reg của bác SiwTom rất hay anh có thể tham khảo
(Bài viết có cả chân dài, chân ngắn... sinh động và vô cũng lôi cuốn, anh tìm hiểu xem sao nhé . Hihi)

Mới đọc một số thông tin về cái "match" của em Pattern nè (nói thiệt là cố nhớ mà chả nhớ gì được cả):

[NOTE1]Character / Description
\ Marks the next character as either a special character or a literal. For example, "n" matches the character "n". "\n" matches a newline character. The sequence "\\" matches "\" and "\(" matches "(".

^
Matches the beginning of input.

$
Matches the end of input.

*
Matches the preceding character zero or more times. For example, "zo*" matches either "z" or "zoo".

+
Matches the preceding character one or more times. For example, "zo+" matches "zoo" but not "z".

?
Matches the preceding character zero or one time. For example, "a?ve?" matches the "ve" in "never".

.
Matches any single character except a newline character.

(pattern) Matches pattern and remembers the match. The matched substring can be retrieved from the resulting Matches collection, using Item [0]...[n]. To match parentheses characters ( ), use "\(" or "\)".

x|y
Matches either x or y. For example, "z|wood" matches "z" or "wood". "(z|w)oo" matches "zoo" or "wood".

{n}
n is a nonnegative integer. Matches exactly n times. For example, "o{2}" does not match the "o" in "Bob," but matches the first two o's in "foooood".

{n,}
n is a nonnegative integer. Matches at least n times. For example, "o{2,}" does not match the "o" in "Bob" and matches all the o's in "foooood." "o{1,}" is equivalent to "o+". "o{0,}" is equivalent to "o*".

{n,m}
m and n are nonnegative integers. Matches at least n and at most m times. For example, "o{1,3}" matches the first three o's in "fooooood." "o{0,1}" is equivalent to "o?".

[xyz]
A character set. Matches any one of the enclosed characters. For example, "[abc]" matches the "a" in "plain".

[^xyz]
A negative character set. Matches any character not enclosed. For example, "[^abc]" matches the "p" in "plain".

[a-z]
A range of characters. Matches any character in the specified range. For example, "[a-z]" matches any lowercase alphabetic character in the range "a" through "z".

[^m-z]
A negative range characters. Matches any character not in the specified range. For example, "[m-z]" matches any character not in the range "m" through "z".

\b
Matches a word boundary, that is, the position between a word and a space. For example, "er\b" matches the "er" in "never" but not the "er" in "verb".

\B
Matches a non-word boundary. "ea*r\B" matches the "ear" in "never early".

\d
Matches a digit character. Equivalent to [0-9].

\D Matches a non-digit character. Equivalent to [^0-9].

\f Matches a form-feed character.

\n Matches a newline character.

\r Matches a carriage return character.

\s
Matches any white space including space, tab, form-feed, etc. Equivalent to "[ \f\n\r\t\v]".

\S
Matches any nonwhite space character. Equivalent to "[^ \f\n\r\t\v]".

\t
Matches a tab character.

\v
Matches a vertical tab character.

\w
Matches any word character including underscore. Equivalent to "[A-Za-z0-9_]".

\W
Matches any non-word character. Equivalent to "[^A-Za-z0-9_]".

\num
Matches num, where num is a positive integer. A reference back to remembered matches. For example, "(.)\1" matches two consecutive identical characters.

\n
Matches n, where n is an octal escape value. Octal escape values must be 1, 2, or 3 digits long. For example, "\11" and "\011" both match a tab character. "\0011" is the equivalent of "\001" & "1". Octal escape values must not exceed 256. If they do, only the first two digits comprise the expression. Allows ASCII codes to be used in regular expressions.

\xn
Matches n, where n is a hexadecimal escape value. Hexadecimal escape values must be exactly two digits long. For example, "\x41" matches "A". "\x041" is equivalent to "\x04" & "1". Allows ASCII codes to be used in regular expressions.[/NOTE1]
 
Upvote 0
phần đằng trước là dấu cách tương ứng mẫu (\s).

Nói chính xác thì \s không phải là SPACE, tức " ". SPACE " " là dấu cách, còn \s là dấu cách trắng
\s có nghĩa là tất cả các dấu cách trắng, tức " " (dấu cách), \t (TAB), \f (form-feed), \r (vbCr), \n (vbLf), \v
Tương đương với
[ \f\n\r\t\v] - chú ý ở đầu sau ký tự "[" là ký tự " ".
Được phép dùng \s trong […], ví dụ [a-z\s]
 
Upvote 0
Các bạn có thể lấy tiện ích (miễn phí) này để test RegExp:
 

File đính kèm

Upvote 0
Copy mọi thứ có trong cell, trừ object

Giả sử tôi có vùng dữ liệu A1:A6, vùng này đã format sẵn (font chữ, màu nền, đóng khung và cả comment.. ) vân vân...
Một vài cell trong A1:A6 có chứa các hình vẽ
Xin hỏi: Nếu tôi muốn copy A1:A6 Paste All sang C1:C6 nhưng không bao gồm các hình vẻ thì code phải viết thế nào cho gọn?


Capture.JPG
 
Upvote 0
Giả sử tôi có vùng dữ liệu A1:A6, vùng này đã format sẵn (font chữ, màu nền, đóng khung và cả comment.. ) vân vân...
Một vài cell trong A1:A6 có chứa các hình vẽ
Xin hỏi: Nếu tôi muốn copy A1:A6 Paste All sang C1:C6 nhưng không bao gồm các hình vẻ thì code phải viết thế nào cho gọn?
Như thế này đúng không Sư Phụ
[GPECODE=vb]
Sub CopyWithoutShapes()
With Sheet1
Application.CopyObjectsWithCells = False
.Range("B3:B5").Copy .Range("C3")
End With
Application.CopyObjectsWithCells = True
End Sub[/GPECODE]
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Giả sử tôi có vùng dữ liệu A1:A6, vùng này đã format sẵn (font chữ, màu nền, đóng khung và cả comment.. ) vân vân...
Một vài cell trong A1:A6 có chứa các hình vẽ
Xin hỏi: Nếu tôi muốn copy A1:A6 Paste All sang C1:C6 nhưng không bao gồm các hình vẻ thì code phải viết thế nào cho gọn?
Thế này có được không ạ
Mã:
Sub PasteAllWithoutObject()
    [a1:a6].Copy
    [c1].PasteSpecial
End Sub
 
Upvote 0
Như thế này đúng không Sư Phụ
[GPECODE=vb]
Sub CopyWithoutShapes()
With Sheet1
Application.CopyObjectsWithCells = False
.Range("B3:B5").Copy .Range("C3")
End With
Application.CopyObjectsWithCells = True
End Sub[/GPECODE]

Cái mình muốn nói chính là cái này! Vì sau khi có câu lệnh Application.CopyObjectsWithCells = False thì thao tác bằng tay trên bảng tính cũng có tác dụng luôn
Có nghĩa là nếu ta có nhu cầu copy dữ liệu không bao gồm object, ta mở cửa sổ Immediate ra, gõ câu lệnh Application.CopyObjectsWithCells = False rồi Enter 1 phát, xong ra bảng tính copy/paste thoải mái. Xong việc, lại vào cửa sổ Immediate, gõ lệnh Application.CopyObjectsWithCells = True để trả về mặc định
 
Lần chỉnh sửa cuối:
Upvote 0
Làm sao biết một file Excel đã được mở thành công

Giả sử tôi đang có sẵn một code VBA để mở một file Excel nào đó. (Workbooks.Open(..) chẳng hạn)
Sẽ có 2 trường hợp xảy ra:
- File mở thành công
- File bị lỗi gì đó không mở được
Vậy xin hỏi: Tôi phải thêm vào code mở file những đoạn code gì để kiểm tra và biết được file đã được mở thành công hay không?
 
Upvote 0
Giả sử tôi đang có sẵn một code VBA để mở một file Excel nào đó. (Workbooks.Open(..) chẳng hạn)
Sẽ có 2 trường hợp xảy ra:
- File mở thành công
- File bị lỗi gì đó không mở được
Vậy xin hỏi: Tôi phải thêm vào code mở file những đoạn code gì để kiểm tra và biết được file đã được mở thành công hay không?
Thì Anh Duyệt đã có hàm tại đây rồi mà ndu!. Nhưng mà cái này chắc là có nhiều cách lắm nên sợ khó đưa ra đáp án giống ý bạn.
 
Upvote 0
Thì Anh Duyệt đã có hàm tại đây rồi mà ndu!. Nhưng mà cái này chắc là có nhiều cách lắm nên sợ khó đưa ra đáp án giống ý bạn.

Em không để ý nữa!
Nhưng với những bài mà em ĐỐ VUI thì code bảo đảm ngắn gọn (vài dòng thôi) mà cũng có chút gọi là "độc đáo" (ít người biết)
Ẹc... Ẹc...
---------------------------------
Thêm nữa: Em không nói là mở mọi loại tập tin mà chỉ quan tâm đến các FILE EXCEL thôi anh à
 
Lần chỉnh sửa cuối:
Upvote 0
Giả sử tôi đang có sẵn một code VBA để mở một file Excel nào đó. (Workbooks.Open(..) chẳng hạn)
Sẽ có 2 trường hợp xảy ra:
- File mở thành công
- File bị lỗi gì đó không mở được
Vậy xin hỏi: Tôi phải thêm vào code mở file những đoạn code gì để kiểm tra và biết được file đã được mở thành công hay không?
Làm vầy được không anh.
Mã:
Sub CheckOpen()
On Error Resume Next
Dim Wb As Workbook
Set Wb = Workbooks.Open(Filename:="D:\Test.xls")
MsgBox Not Wb Is Nothing
End Sub
 
Upvote 0
Làm vầy được không anh.
Mã:
Sub CheckOpen()
On Error Resume Next
Dim Wb As Workbook
Set Wb = Workbooks.Open(Filename:="D:\Test.xls")
MsgBox Not Wb Is Nothing
End Sub

Vẫn còn cách khác (khá hay... là 1 phương thức có sẵn trong VBA chuyên làm vụ này)
 
Upvote 0
Vẫn còn cách khác (khá hay... là 1 phương thức có sẵn trong VBA chuyên làm vụ này)

Nếu nói về phương thức của VBA (mudule VBA) thì chả nhẽ Tuấn định nói tứi Shell? Nếu thế thì đó không phải là cách hay. Xin nhớ là code phải xác định thành công hay không chứ không phải là người dùng xác định đâu nhé.
--------------
Lưu ý là cách dùng ShellExecute trong code mà thanhlanh gới ý không dùng được. Nếu gặp tập tin bị lỗi không thể mở được thì Excel sẽ bị treo
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ, cái em định nói là FindFile anh à

Nhưng phương thức FindFile của đối tượng nào? Dù gì thì "phương thức có sẵn trong VBA" tôi lại tưởng là phương thức trong module VBA.
Application.FindFile? Nếu thế thì liên quan gì tới mở được hay không mở được?
Mà dù FindFile của "thằng" nào thì cái tên đó gợi ý là tìm được hay không chứ liên quan gì tới mở được hay không mở được nhỉ?
-------------
À, thấy rồi
 
Lần chỉnh sửa cuối:
Upvote 0
Vẫn còn cách khác (khá hay... là 1 phương thức có sẵn trong VBA chuyên làm vụ này)
Chắc anh nói cái này. Làm theo gợi ý của anh.
PHP:
Sub Kiemtra_File_Da_Mo()
Dim kiemtra
kiemtra = Application.FindFile
If kiemtra Then MsgBox "OK"
End Sub
 
Upvote 0
Lưu ý là cách dùng ShellExecute trong code mà thanhlanh gới ý không dùng được. Nếu gặp tập tin bị lỗi không thể mở được thì Excel sẽ bị treo

Đúng rồi, em mới thử dùng thì cũng không được, phải Ctrl + Alt + Delete

Dạ, cái em định nói là FindFile anh à

Hay nhỉ, có một câu lệnh duy nhất mà thay luôn cả Application.FileDialog và Workbooks.Open, ứng dụng luôn được không ta?
 
Upvote 0
Chắc anh nói cái này. Làm theo gợi ý của anh.
PHP:
Sub Kiemtra_File_Da_Mo()
Dim kiemtra
kiemtra = Application.FindFile
If kiemtra Then MsgBox "OK"
End Sub

Nếu đã dùng Application.FindFile thì phải thêm dòng đỏ đỏ,

Mã:
Dim kiemtra
[B][COLOR=#ff0000]On Error Resume Next[/COLOR][/B]

Bởi nếu không thì với 1 tập tin bị lỗi rất có thể không bao giờ code chạy tới dòng

Mã:
If kiemtra Then MsgBox "OK"
 
Upvote 0
Hay nhỉ, có một câu lệnh duy nhất mà thay luôn cả Application.FileDialog và Workbooks.Open, ứng dụng luôn được không ta?

Tôi không hiểu lắm. Tùy việc mà dùng thôi. Giết gà thì dùng dao mổ gà, giết trâu thì dùng dao mổ trâu.
Nếu cần mở tập tin đã biết đường dẫn (vd. được chọn trong ComboBox, có được sau khi đã tìm kiếm ở lần chạy code trước và được nhớ ở biến sPath chẳng hạn v...v) thì chạy code trong bài #711 chứ ai lại dùng code #716 để bắt người dùng nhọc công chọn cái tập tin mà đường dẫn đã được xác định? Còn nếu chưa xác định và cần phải chọn thì chạy code #716. Tùy việc mà chọn công cụ chứ nói cái này ưu điểm vì thay được cái kia thì không đúng.
 
Upvote 0
Tôi không hiểu lắm. Tùy việc mà dùng thôi. Giết gà thì dùng dao mổ gà, giết trâu thì dùng dao mổ trâu.
Nếu cần mở tập tin đã biết đường dẫn (vd. được chọn trong ComboBox, có được sau khi đã tìm kiếm ở lần chạy code trước và được nhớ ở biến sPath chẳng hạn v...v) thì chạy code trong bài #711 chứ ai lại dùng code #716 để bắt người dùng nhọc công chọn cái tập tin mà đường dẫn đã được xác định? Còn nếu chưa xác định và cần phải chọn thì chạy code #716. Tùy việc mà chọn công cụ chứ nói cái này ưu điểm vì thay được cái kia thì không đúng.

Em thì không được học bài bản, nhưng vọc thì rất chịu vọc (có lúc bị treo máy lên treo máy xuống đó chứ), em thường thử nhiều trường hợp cho các thủ tục mới, rồi đo lường thời gian cho dữ liệu nhiều, nếu code nào chạy đúng nhất, nhanh nhất là em dùng cái đó, không cần biết thủ tục đó dài (nhiều dòng) hay nó ngắn (ít dòng).

Cứ tổng quát một chút và hiệu quả một chút là em khoái, không câu nệ là gà hay trâu!

Nhớ một câu chuyện vui về các giai thoại của Anhxtanh (Albert Einstein), ông có nuôi 2 con chó, 1 con chó lớn và 1 con chó nhỏ. Ông làm cái nhà cho 2 con chó ở chung, sau khi làm cái cửa lớn cho con chó lớn xong, ông lại nghĩ cần có thêm 1 cái cửa nhỏ nữa để cho con chó nhỏ, thế là ông lại cưa thêm một cái lỗ nhỏ nữa! (lời bàn: chỉ cần một cửa lớn là 2 con chó cùng ra vào được!)
 
Upvote 0
Tôi không hiểu lắm. Tùy việc mà dùng thôi. Giết gà thì dùng dao mổ gà, giết trâu thì dùng dao mổ trâu.
Nếu cần mở tập tin đã biết đường dẫn (vd. được chọn trong ComboBox, có được sau khi đã tìm kiếm ở lần chạy code trước và được nhớ ở biến sPath chẳng hạn v...v) thì chạy code trong bài #711 chứ ai lại dùng code #716 để bắt người dùng nhọc công chọn cái tập tin mà đường dẫn đã được xác định? Còn nếu chưa xác định và cần phải chọn thì chạy code #716. Tùy việc mà chọn công cụ chứ nói cái này ưu điểm vì thay được cái kia thì không đúng.

Ý em muốn nói mở file với đường dẫn (tên file) chưa biết. Em hay dùng cách này:

Mã:
Sub OpenFile1()    
  With Application.FileDialog(msoFileDialogOpen)
        .InitialFileName = "D:\"
        .AllowMultiSelect = False
        .Filters.Clear
        .Filters.Add "File cua tui", "*.*"
        .Show
        If .SelectedItems.Count Then
            oFile = .SelectedItems(1)
            Set Wb = Workbooks.Open(oFile)
        End If
    End With
End Sub

Với code này em vừa phải dùng Application.FileDialog(msoFileDialogOpen) và vừa phải có Set Wb = Workbooks.Open(oFile).
Nên tính ra cách của ndu giới thiệu rất gọn, nếu nhu cầu chỉ mở file Excel (thử mở loại file khác thấy bị lỗi)
Chỉ có điều cách mới này ta không cố định được thư mục.

Khi hỏi bác Google về Application.FindFile thì thấy cũng ít sử dụng nên mới nghi nghờ vậy thôi.
 
Upvote 0
Nhớ một câu chuyện vui về các giai thoại của Anhxtanh (Albert Einstein), ông có nuôi 2 con chó, 1 con chó lớn và 1 con chó nhỏ. Ông làm cái nhà cho 2 con chó ở chung, sau khi làm cái cửa lớn cho con chó lớn xong, ông lại nghĩ cần có thêm 1 cái cửa nhỏ nữa để cho con chó nhỏ, thế là ông lại cưa thêm một cái lỗ nhỏ nữa! (lời bàn: chỉ cần một cửa lớn là 2 con chó cùng ra vào được!)

Cũng chả biết có phải huyền thoại về Albert Einstein hay không. Cũng có chuyện kể là: Có nhà bác học nọ có nuôi 1 con chó và 1 con mèo ... Và không phải cửa mà là 2 lỗ trên tường (cửa thì là cái đóng vào, mở ra)
Nhưng nghĩ ra cũng có thể ông bác học nọ không lú lẫn. Vì nếu 2 con vật cùng chạy do lý do gì đó thì 2 ô là hợp lý. Rồi nữa, nếu con chó qua 1 nửa mình rồi cứ đứng trêu ngươi con mèo thì sao? He he
 
Upvote 0
Cũng chả biết có phải huyền thoại về Albert Einstein hay không. Cũng có chuyện kể là: Có nhà bác học nọ có nuôi 1 con chó và 1 con mèo ... Và không phải cửa mà là 2 lỗ trên tường (cửa thì là cái đóng vào, mở ra)
Nhưng nghĩ ra cũng có thể ông bác học nọ không lú lẫn. Vì nếu 2 con vật cùng chạy do lý do gì đó thì 2 ô là hợp lý. Rồi nữa, nếu con chó qua 1 nửa mình rồi cứ đứng trêu ngươi con mèo thì sao? He he

Câu chuyện hay! Thử áp dụng cho một gia đình có nhiều người con, ông ta "mỗ" cho mỗi người 1 cửa trên tường! kakaka
 
Upvote 0
Chắc anh nói cái này. Làm theo gợi ý của anh.
PHP:
Sub Kiemtra_File_Da_Mo()
Dim kiemtra
kiemtra = Application.FindFile
If kiemtra Then MsgBox "OK"
End Sub

Chính xác là cái này nhưng phải On error resume next như anh siwtom đã nói
Mã:
Sub Test()
  Dim bChk As [COLOR=#ff0000]Boolean[/COLOR]
  [COLOR=#ff0000]On Error Resume Next[/COLOR]
  bChk = Application.FindFile
  If bChk Then
    MsgBox "File da mo thanh cong"
  Else
    MsgBox "That bai"
  End If
End Sub
Ta biết rằng phương thức Application.FindFile trả về kiểu biến Boolean chứ không "chỉ" đến 1 Workbook cụ thể nào cả. Nhưng điều chắc chắn rằng sau khi dùng FindFile để mở 1 file Excel, nếu file mở thành công thì Wb vừa mở sẽ được Active. Vậy nếu muốn chỉ đến Wb vừa mở, ta chỉ cần thêm câu lệnh Set wkb = ActiveWorkbook là được rồi
(Rảnh rỗi mình hay bấm F2 rồi "mò" trong cái đống hỗn độn, cứ thấy cái nào lạ lạ thì nghiên cứu chơi...)
 
Upvote 0
Xây dựng sự kiện Worksheet_Change

- Tôi có dữ liệu tại Sheet1, Range("A1:A10")
- Tôi muốn xây dựng sự kiện Worksheet_Change cho vùng này (chỉ cần có tác dụng khi nhập liệu bằng tay, không cần có tác dụng đối với trường hợp copy/paste hoặc kéo fill)
- Xin hỏi: Ngoài cách dùng sự kiện Worksheet_Change, ta có thể thiết kế 1 code dạng khác hay không? (có tác dụng như sự kiện Change)
Nói thêm rằng:
- Code này nằm trong 1 Module
- Không dùng Class
- Không dùng Validation để hổ trợ
------------------
Các bạn hãy suy nghĩ xem code ấy sẽ được viết thế nào? (Chẳng hạn tôi muốn khi nhập liệu vùng A1:A10, chỉ cho phép nhập number)
Tóm lại là: Một code gì đó NẰM TRONG 1 MODULE và có tác dụng như sự kiện Worksheet_Change
Ẹc... Ẹc...
 
Lần chỉnh sửa cuối:
Upvote 0
- Tôi có dữ liệu tại Sheet1, Range("A1:A10")
- Tôi muốn xây dựng sự kiện Worksheet_Change cho vùng này (chỉ cần có tác dụng khi nhập liệu bằng tay, không cần có tác dụng đối với trường hợp copy/paste hoặc kéo fill)
- Xin hỏi: Ngoài cách dùng sự kiện Worksheet_Change, ta có thể thiết kế 1 code dạng khác hay không? (có tác dụng như sự kiện Change)
Nói thêm rằng:
- Code này nằm trong 1 Module
- Không dùng Class
- Không dùng Validation để hổ trợ
------------------
Các bạn hãy suy nghĩ xem code ấy sẽ được viết thế nào? (Chẳng hạn tôi muốn khi nhập liệu vùng A1:A10, chỉ cho phép nhập number)
Tóm lại là: Một code gì đó NẰM TRONG 1 MODULE và có tác dụng như sự kiện Worksheet_Change
Ẹc... Ẹc...

Code đây code đây:
Mã:
Sub auto_open()
    ThisWorkbook.Worksheets("Sheet1").OnEntry = "MySub"
End Sub
Sub MySub()
    If Not Application.Intersect(ActiveCell, Range("A1:A10")) Is Nothing Then
        If TypeName(ActiveCell.Value) <> "Double" Then MsgBox "Nhap sai roi, hic!"
    End If
End Sub
 
Upvote 0
Code đây code đây:
Mã:
Sub auto_open()
    ThisWorkbook.Worksheets("Sheet1").OnEntry = "MySub"
End Sub
Sub MySub()
    If Not Application.Intersect(ActiveCell, Range("A1:A10")) Is Nothing Then
        If TypeName(ActiveCell.Value) <> "Double" Then MsgBox "Nhap sai roi, hic!"
    End If
End Sub

Chính xác là cái thằng OnEntry này
Nếu tìm trong Help, bảo đảm lòi con mắt cũng không có
OnEntry thật ra đã có người đăng lên diễn đàn mình từ lâu lắm rồi (có điều chẳng thấy ai để ý nên mới.. ĐỐ)
Ngoài OnEntry ra hình như còn có OnData (tác dụng gần tương tự)
 
Upvote 0
Chính xác là cái thằng OnEntry này
Nếu tìm trong Help, bảo đảm lòi con mắt cũng không có
OnEntry thật ra đã có người đăng lên diễn đàn mình từ lâu lắm rồi (có điều chẳng thấy ai để ý nên mới.. ĐỐ)
Ngoài OnEntry ra hình như còn có OnData (tác dụng gần tương tự)

Nhờ câu đố của ndu mình mới biết điều này, ngoài ra còn biết còn có thằng .OnDoubleClick cũng hay lắm.
 
Upvote 0
Xin mạo muội đố mọi người với file đính kèm ta phải viết code thế nào để có 1 đoạn code ngắn nhất mà có thể lọc được những người có trùng tên ra. Không dùng vòng lặp
 

File đính kèm

Upvote 0
Xin mạo muội đố mọi người với file đính kèm ta phải viết code thế nào để có 1 đoạn code ngắn nhất mà có thể lọc được những người có trùng tên ra. Không dùng vòng lặp

Lọc trùng tên nghĩa là sao đây?
Tôi hiểu ý Hải chỉ muốn xét TÊN, không xét HỌ và CHỮ LÓT
Tuy nhiên tôi chưa hiểu chổ này: Lọc duy nhất (2 tên trở lên chỉ lấy 1) hay chỉ lọc những người bị trùng tên ra? (không trùng thì không lọc)
 
Upvote 0
Lọc trùng tên nghĩa là sao đây?
Tôi hiểu ý Hải chỉ muốn xét TÊN, không xét HỌ và CHỮ LÓT
Tuy nhiên tôi chưa hiểu chổ này: Lọc duy nhất (2 tên trở lên chỉ lấy 1) hay chỉ lọc những người bị trùng tên ra? (không trùng thì không lọc)
Nhìn vào file thì em hiểu thế này: Nhập tên vào ô A1, những người có tên giống tên vừa nhập sẽ được lọc ra cột C.
 
Upvote 0
Lọc trùng tên nghĩa là sao đây?
Tôi hiểu ý Hải chỉ muốn xét TÊN, không xét HỌ và CHỮ LÓT
Tuy nhiên tôi chưa hiểu chổ này: Lọc duy nhất (2 tên trở lên chỉ lấy 1) hay chỉ lọc những người bị trùng tên ra? (không trùng thì không lọc)
Anh nói đúng rồi. Chỉ lấy tên, không dính tới họ hoặc lót. Tất cả có tên giống nhau lấy hết.

Nhìn vào file thì em hiểu thế này: Nhập tên vào ô A1, những người có tên giống tên vừa nhập sẽ được lọc ra cột C.
Vâng, nhập tên vào A1 1 cái tên, dữ liệu được lọc ra tại cột C như file kèm
Sub này mình nghĩ cần 3 dòng lệnh (không tính sự kiện change)
 
Lần chỉnh sửa cuối:
Upvote 0
Anh nói đúng rồi. Chỉ lấy tên, không dính tới họ hoặc lót. Tất cả có tên giống nhau lấy hết.


Vâng, nhập tên vào A1 1 cái tên, dữ liệu được lọc ra tại cột C như file kèm
Sub này mình nghĩ cần 3 dòng lệnh (không tính sự kiện change)
Đoán chắc anh dùng AdvancedFilter, vì khi click vào đó còn "dấu vết" để lại.
 
Upvote 0
Đoán chắc anh dùng AdvancedFilter, vì khi click vào đó còn "dấu vết" để lại.

Em đoán là vậy :
[GPECODE=vb]
Sub LOC()
[IV2] = [A3]: [IV3] = "*" & [A1]
[A3:A1000].AdvancedFilter 2, [IV2:IV3], [C3]
End Sub
[/GPECODE]

Nhưng với code này tên Quý sẽ lọc được 2 tên là " Châu Văn Quý " và " Hồ Quý A"
Không biết ý anh Hải còn cần lọc lấy 1 tên, hay 2 tên như trên là được rồi !

Nếu để lọc lấy Hồ Quý A thì em sửa criteria như sau : "*" & [A1] & "?"
 
Lần chỉnh sửa cuối:
Upvote 0
Thế thì Advanced Filter thôi, có gì đâu chứ

Em đoán chắc anh Hải định nhấn mạnh cách viết : *[A1] , để lấy tên, nhưng theo em cách này thì chưa lấy chính xác được những người có tên trong [A1],<--- Theo em muốn lấy chính xác thì vùng tiêu chuẩn phải là 1 công thức ( true, false ) hay là cái gì gì đó ....
 
Upvote 0
Em đoán chắc anh Hải định nhấn mạnh cách viết : *[A1] , để lấy tên, nhưng theo em cách này thì chưa lấy chính xác được những người có tên trong [A1],<--- Theo em muốn lấy chính xác thì vùng tiêu chuẩn phải là 1 công thức ( true, false ) hay là cái gì gì đó ....

Ý bạn là sao đây?
Có phải ý muốn nói rằng: Nếu lọc những người có TÊN = "NGOC" thì rất có thể lọc nhầm sang những người có CHỮ LÓT = "NGOC", đúng không?
Mấy trò này đã từng có người hỏi đầy trên diễn đàn rồi
Nói chung công thức điều kiện sẽ theo kiểu ="=*"&A1
Ăn tiền là cái dấu = màu đỏ ấy
 
Upvote 0
Em đoán chắc anh Hải định nhấn mạnh cách viết : *[A1] , để lấy tên, nhưng theo em cách này thì chưa lấy chính xác được những người có tên trong [A1],<--- Theo em muốn lấy chính xác thì vùng tiêu chuẩn phải là 1 công thức ( true, false ) hay là cái gì gì đó ....
Muốn chính xác thì vùng điều kiện bạn làm vầy nè:
Mã:
 ="=* "&A1
Anh ndu thiếu một dấu " "
 
Upvote 0
Nếu không có thì như thế nào nhỉ? Cái đoạn công thức của mình là để nhập trực tiếp vào ô điều kiện chứ không phải để trong code đâu nhé.
Đáp án mình viết thế này:
PHP:
Sub LOC()
[IV2] = [A3]: [IV3] = "'=* " & [A1]
[A3:A1000].AdvancedFilter 2, [IV2:IV3], [C3]
End Sub
 
Upvote 0
Đáp án mình viết thế này:
PHP:
Sub LOC()
[IV2] = [A3]: [IV3] = "'=* " & [A1]
[A3:A1000].AdvancedFilter 2, [IV2:IV3], [C3]
End Sub

Nghĩ cũng mắc cười. Cái đáp án của chú nó nằm chình ình trong file (tại cell IV3) ---> Gọi Advanced Filter lên là thấy ---> Vậy cũng đố
Ẹc... Ẹc...
Lần sau rút kinh nghiệm ra
 
Upvote 0
Upvote 0
Nghĩ cũng mắc cười. Cái đáp án của chú nó nằm chình ình trong file (tại cell IV3) ---> Gọi Advanced Filter lên là thấy ---> Vậy cũng đố
Ẹc... Ẹc...
Lần sau rút kinh nghiệm ra

Hức hức ai kêu anh giỏi quá chi nên bị mắc cười ráng chịu. Chứ cái dấu "'=" cũng ít thấy người xài mà
 
Upvote 0
Hức hức ai kêu anh giỏi quá chi nên bị mắc cười ráng chịu. Chứ cái dấu "'=" cũng ít thấy người xài mà

Nhưng nếu là tôi viết, tôi cũng chẳng cần cái dâu ' ấy làm gì ---> Cứ record macro theo kiểu bình thường cũng ra được cái này:
[IV3] = "=""=* ""&R1C1"
 
Upvote 0
Ta thường dùng Immediate test code, sau nhiều lần test thì cửa sổ Immediate như đám rừng không biết đâu là mới đâu là cũ, đố các bạn có dòng lệnh nào xóa Immediate không?

Vụ này có thể đơn giản với các cao thủ nhưng cứ đố để mọi người cùng biết.
 
Upvote 0
Ta thường dùng Immediate test code, sau nhiều lần test thì cửa sổ Immediate như đám rừng không biết đâu là mới đâu là cũ, đố các bạn có dòng lệnh nào xóa Immediate không?

Vụ này có thể đơn giản với các cao thủ nhưng cứ đố để mọi người cùng biết.

Tôi cứ Ctrl+A rồi bấm nút Delete thế thôi!
 
Upvote 0
Ta thường dùng Immediate test code, sau nhiều lần test thì cửa sổ Immediate như đám rừng không biết đâu là mới đâu là cũ, đố các bạn có dòng lệnh nào xóa Immediate không?

Vụ này có thể đơn giản với các cao thủ nhưng cứ đố để mọi người cùng biết.
Dùng vba để xoá nó đi.
Mã:
Application.SendKeys "^g ^a {DEL}"
 
Upvote 0
Upvote 0

Cái này mà anh nói là ĐÚNG Ý thì em thấy.. hơi mắc cười
- Nếu ta "đứng" trên bảng tính, gọi lệnh trên thì nó có chạy không?
- Chẳng lẽ anh phải Alt + F11 (vào môi trường VBA). Xong phải mất công viết cái câu lệnh SendKeys gì gì đó cho nó chạy?
===> Vậy thôi em làm theo cách của Nghĩa: Ctrl + A rồi Delete có phải sướng không?
----------------
ĐỐ VUI nhưng cũng phải có ứng dụng gì đó chứ anh
???
 
Upvote 0
Cái này mà anh nói là ĐÚNG Ý thì em thấy.. hơi mắc cười
- Nếu ta "đứng" trên bảng tính, gọi lệnh trên thì nó có chạy không?
- Chẳng lẽ anh phải Alt + F11 (vào môi trường VBA). Xong phải mất công viết cái câu lệnh SendKeys gì gì đó cho nó chạy?
===> Vậy thôi em làm theo cách của Nghĩa: Ctrl + A rồi Delete có phải sướng không?
----------------
ĐỐ VUI nhưng cũng phải có ứng dụng gì đó chứ anh
???

Nếu đang ở trên bảng tính thì mình sử dụng code sau:

Mã:
Application.SendKeys "%{F11} ^g ^a {DEL}  %{F4}"
 
Upvote 0
Cái này mà anh nói là ĐÚNG Ý thì em thấy.. hơi mắc cười
- Nếu ta "đứng" trên bảng tính, gọi lệnh trên thì nó có chạy không?
- Chẳng lẽ anh phải Alt + F11 (vào môi trường VBA). Xong phải mất công viết cái câu lệnh SendKeys gì gì đó cho nó chạy?
===> Vậy thôi em làm theo cách của Nghĩa: Ctrl + A rồi Delete có phải sướng không?
----------------
ĐỐ VUI nhưng cũng phải có ứng dụng gì đó chứ anh
???

Thay vì Ctrl + A rồi Delete (2 thao thác) thì mình phải gõ dòng lệnh đó sau đó bấm cho chạy lệnh, nó chẳng hiệu quả gì cả.
 
Upvote 0
Nếu đang ở trên bảng tính thì mình sử dụng code sau:

Mã:
Application.SendKeys "%{F11} ^g ^a {DEL}  %{F4}"

Rồi có người thích ở trong cửa số VBA để chạy code thì Hai Lúa tính sao?
Thật ra cái câu hỏi này đã từng có người bàn trên mạng nhiều lắm rồi (Google sẽ thấy) và nó không đơn giản thế đâu
 
Upvote 0
Rồi có người thích ở trong cửa số VBA để chạy code thì Hai Lúa tính sao?
Thật ra cái câu hỏi này đã từng có người bàn trên mạng nhiều lắm rồi (Google sẽ thấy) và nó không đơn giản thế đâu

Vậy thì tùy thôi, ai sử dụng cái nào thì dùng cái ấy, đâu bắt ép, vì Thầy nói ngoài sheet thì thêm lệnh vậy thôi.

To Anh Nghĩa: Anh nói sai rồi, có những dòng lệnh ta cần test nhiều khúc, kết thúc khúc nào ta xóa lúc đó, anh có xóa được khi code đang chạy hay không?
 
Upvote 0
Rồi có người thích ở trong cửa số VBA để chạy code thì Hai Lúa tính sao?
Thật ra cái câu hỏi này đã từng có người bàn trên mạng nhiều lắm rồi (Google sẽ thấy) và nó không đơn giản thế đâu

Google thử thấy cái link này http://dailydoseofexcel.com/archives/2004/06/09/clear-the-immediate-window/

-+*/Hix xem xong thấy chóng mặt buồn nôn,--> chắc là do nội công của e chưa đủ để luyện chiêu này ,!$@!!-+*/
 
Upvote 0
Google thử thấy cái link này http://dailydoseofexcel.com/archives/2004/06/09/clear-the-immediate-window/

-+*/Hix xem xong thấy chóng mặt buồn nôn,--> chắc là do nội công của e chưa đủ để luyện chiêu này ,!$@!!-+*/

Code đó người ta dùng hàm API để xác định cửa sổ Immediate, xong, dùng hàm PostMessage để gửi "thông điệp" Ctrl + A và Del để cửa sổ
Tuy nhiên, ngay chính trong VBA cũng đã có câu lệnh xác định cửa sổ Immediate rồi
Ví dụ:
Mã:
Sub ClearImmediateWindow()
  With Application
    .VBE.Windows("Immediate").SetFocus
    .SendKeys "^a {Del}"
  End With
End Sub
Bất kể cửa số Immediate có đang hiện hay không, bất kể ta "đứng" ở đâu thì code vẫn chạy được
 
Lần chỉnh sửa cuối:
Upvote 0
Cái này mà anh nói là ĐÚNG Ý thì em thấy.. hơi mắc cười
- Nếu ta "đứng" trên bảng tính, gọi lệnh trên thì nó có chạy không?
- Chẳng lẽ anh phải Alt + F11 (vào môi trường VBA). Xong phải mất công viết cái câu lệnh SendKeys gì gì đó cho nó chạy?
===> Vậy thôi em làm theo cách của Nghĩa: Ctrl + A rồi Delete có phải sướng không?
----------------
ĐỐ VUI nhưng cũng phải có ứng dụng gì đó chứ anh
???

Đang đứng tại VBE, thay vì bấm 3 lần: ^G; ^A; Del
Ta bấm Click chuột vào sub (đã viết sẵn) sau rồi Run:

Mã:
Sub ClearImmedia()
     Application.SendKeys "^g ^a {DEL} {f7}"
End Sub

Cũng có thể dùng được đấy chớ, hi ... tại vì không còn gì để đố và cũng chẳng thấy ai đố, buồn sinh chuyện đấy mà, ẹc, ẹc ...
 
Upvote 0
Viết hoa đầu từ
Không dùng vòng lặp,
Application.WorksheetFunction và công cụ RegExp làm thế nào để viết hoa đầu từ tất cả các từ trong chuỗi (chuoi khong co dau)?
ví dụ : Cho chuỗi
"dien dan giai phap excel" làm sao để thành "Dien Dan Giai Phap Excel"
 
Upvote 0
Viết hoa đầu từ
Không dùng vòng lặp,
Application.WorksheetFunction và công cụ RegExp làm thế nào để viết hoa đầu từ tất cả các từ trong chuỗi (chuoi khong co dau)?
ví dụ : Cho chuỗi
"dien dan giai phap excel" làm sao để thành "Dien Dan Giai Phap Excel"
Phải như sau không anh?

Mã:
Sub test()
MsgBox StrConv("dien dan giai phap excel", vbProperCase)
End Sub
 
Upvote 0
Viết hoa đầu từ
Không dùng vòng lặp,
Application.WorksheetFunction và công cụ RegExp làm thế nào để viết hoa đầu từ tất cả các từ trong chuỗi (chuoi khong co dau)?
ví dụ : Cho chuỗi
"dien dan giai phap excel" làm sao để thành "Dien Dan Giai Phap Excel"
Như thế lày có được không bạn :
[GPECODE=vb]
Sub DOVUI_VBA()
MsgBox StrConv("dien dan giai phap excel", vbProperCase)
MsgBox Application.Proper("giai phap excel")
End Sub
[/GPECODE]
 
Upvote 0
Như thế lày có được không bạn :
[GPECODE=vb]
Sub DOVUI_VBA()
MsgBox StrConv("dien dan giai phap excel", vbProperCase)
MsgBox Application.Proper("giai phap excel")
End Sub
[/GPECODE]
Nhanh quá, đúng rồi, ý mình nói dòng đầu (không dùng hàm) tìm trên GPE không thấy tưởng ít người biết, hic
 
Upvote 0
Nhanh quá, đúng rồi, ý mình nói dòng đầu (không dùng hàm) tìm trên GPE không thấy tưởng ít người biết, hic

Không phải là không biết
Hàm StrConv này em cũng dùng nhiều, có điều vbProperCase thì chả mấy ai quan tâm, nó không làm việc được với tiếng Việt Unicode
 
Upvote 0
Thuộc về hàm rồi bạn. Không đúng với yêu cầu.

^^ tại bạn ý nói không dùng Application.WorksheetFunction nên em hiểu nhầm !
Nhân tiên đây em cũng đóng góp thêm 1 câu trong topic (Dành cho các thành viên có < = 1 * sao không xoay thôi nhé !)

Theo các bạn thì : các hàm sau khác nhau ở chỗ nào :
Application.Vlookup <> WorksheetFunction.Vlookup
Application.Match<> WorksheetFunction.Match
 
Upvote 0
^^ tại bạn ý nói không dùng Application.WorksheetFunction nên em hiểu nhầm !
Nhân tiên đây em cũng đóng góp thêm 1 câu trong topic (Dành cho các thành viên có < = 1 * sao không xoay thôi nhé !)

Theo các bạn thì : các hàm sau khác nhau ở chỗ nào :
Application.Vlookup <> WorksheetFunction.Vlookup
Application.Match<> WorksheetFunction.Match

Suýt tí là định tra lời rồi
Quên đọc câu này:
(Dành cho các thành viên có < = 1 * sao không xoay thôi nhé !)
 
Upvote 0
Con số Pi trong VBA

Thật ra câu này đã từng có trên diễn đàn rồi nhưng vẫn cứ đố (nhiều khi có người chưa biết)
---------------
Trên bảng tính có hàm Pi() để lấy số Pi
Vậy trong VBA, nếu không dùng WorksheetFunction.Pi thì ta sẽ làm thế nào để có con số Pi chính xác?
 
Upvote 0
Thật ra câu này đã từng có trên diễn đàn rồi nhưng vẫn cứ đố (nhiều khi có người chưa biết)
---------------
Trên bảng tính có hàm Pi() để lấy số Pi
Vậy trong VBA, nếu không dùng WorksheetFunction.Pi thì ta sẽ làm thế nào để có con số Pi chính xác?

Hỏi: Chính xác đến cỡ nào chớ hình như nhân loại vẫn chưa tìm ra số Pi tuyệt đối?
 
Upvote 0
Thật ra câu này đã từng có trên diễn đàn rồi nhưng vẫn cứ đố (nhiều khi có người chưa biết)
---------------
Trên bảng tính có hàm Pi() để lấy số Pi
Vậy trong VBA, nếu không dùng WorksheetFunction.Pi thì ta sẽ làm thế nào để có con số Pi chính xác?

Vậy thì nó là 4 * Atn(1) phải không Thầy?
 
Upvote 0
^^ tại bạn ý nói không dùng Application.WorksheetFunction nên em hiểu nhầm !
Nhân tiên đây em cũng đóng góp thêm 1 câu trong topic (Dành cho các thành viên có < = 1 * sao không xoay thôi nhé !)

Theo các bạn thì : các hàm sau khác nhau ở chỗ nào :
Application.Vlookup <> WorksheetFunction.Vlookup
Application.Match<> WorksheetFunction.Match
Hình như khác nhau là khi biến gán cho Application.Vlookup phải là Variant, còn WorksheetFunction.Vlookup không nhất thiết vậy
 
Upvote 0
Upvote 0
Upvote 0
Hi, giành phần trả lời của "mấy em" rồi, nhưng giải thích chưa cụ thể.
Em cũng tầm vậy thôi. Giải thích thì em hiểu chưa nhiều nhưng em hiểu đại khái thế này: Với trường hợp không sử dụng thuộc thính WorksheetFunction nếu không tìm thấy giá trị tìm thì lỗi lưu vào biến nên biến buộc phải Variant
 
Upvote 0
Em xin hỏi các anh chị là làm cách nào để lấy dữ liệu của 1 file đang đóng mà không cần mở file đó không?
Ví dụ em lấy dữ liệu từ vùng A1:D150 của file đóng vào file hiện hành.
 
Upvote 0
Em xin hỏi các anh chị là làm cách nào để lấy dữ liệu của 1 file đang đóng mà không cần mở file đó không?
Ví dụ em lấy dữ liệu từ vùng A1:D150 của file đóng vào file hiện hành.

Cái này là ĐỐ à?
Chuyên đề về ADO có cả đống bài liên quan thì còn gì để mà ĐỐ đây?
Còn nếu bạn nhờ giúp thì... LỘN TIỆM nhé
 
Upvote 0
Ở đây là box đố vui về VBA chứ không phải ADO.

Vậy theo bạn thì ADO hổng phải là VBA à?
Nếu bạn đố thế này:
"Lấy dữ liệu từ file đang đóng nhưng BẮT BUỘC không được dùng ADO"
thì đó lại là chuyện khác
(Tôi dùng Macro 4 "nhúng" trong VBA cũng được như thường ---> Dạng này cũng có cả đống rồi)
 
Upvote 0
Vậy theo bạn thì ADO hổng phải là VBA à?
Nếu bạn đố thế này:
"Lấy dữ liệu từ file đang đóng nhưng BẮT BUỘC không được dùng ADO"
thì đó lại là chuyện khác
Tôi nhớ có 1 đợt tôi trả lời =ADO vào 1 box bắt đầu học VBA thì mọi người cho tôi là ngoại đạo, bây giờ thì tiếp tục tôi post bài vào mục VBA thì bạn hỏi vặn tôi, thật tình tôi chẳng hiểu nổi.
 
Upvote 0
Tôi nhớ có 1 đợt tôi trả lời =ADO vào 1 box bắt đầu học VBA thì mọi người cho tôi là ngoại đạo, bây giờ thì tiếp tục tôi post bài vào mục VBA thì bạn hỏi vặn tôi, thật tình tôi chẳng hiểu nổi.
Quá đúng rồi còn gì
Bạn nghĩ người mới học VBA sẽ dễ dàng "nuốt trôi" được mấy kiến thức về ADO à?
Bạn đếm xem trên GPE này có bao nhiêu người BIẾT XÀI ADO? (chỉ biết thôi, khỏi cần nói đến GIỎI)
------------------------------------------------
Vậy tôi xin nói lại là không dùng ADO và Macro4 để lấy dữ liệu từ 1 file đang đóng.

Vậy còn không dùng cái gì nữa bạn liệt kê ra luôn đi
(vì nếu chỉ không dùng 2 cái bạn kể ở trên thì cũng còn.. hơi dễ)
 
Lần chỉnh sửa cuối:
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0
Thêm là không dùng chức năng import của excel và DAO.
Vậy nếu tôi dùng kiểu vầy:
Mã:
Sub GetData(ByVal FileName As String, ByVal SheetName As String, _
             ByVal RangeAddress As String, ByVal Target As Range)
  Dim strLink As String, strFile As String, strPath As String, strName As String
  On Error Resume Next
  strFile = Mid(FileName, InStrRev(FileName, "\") + 1)
  strPath = Mid(FileName, 1, InStrRev(FileName, "\"))
  strName = String(30, "z")
  RangeAddress = Range(RangeAddress).Address(1, 1)
  Application.DisplayAlerts = False
  strLink = "='" & strPath & "[" & strFile & "]" & SheetName & "'!" & RangeAddress
  Target.Worksheet.Parent.Names.Add strName, strLink
  With Target.Range(RangeAddress)
    .FormulaArray = "=" & strName: .Value = .Value
  End With
  Target.Worksheet.Parent.Names(strName).Delete
  Application.DisplayAlerts = True
End Sub
Mã:
Sub Test()
  Dim vFile, FileName As String, SheetName As String, RangeAddress As String
  vFile = Application.GetOpenFilename("Excel Files, *.xls;*.xlsx;*.xlsm")
  If TypeName(vFile) = "String" Then
    FileName = CStr(vFile)
    SheetName = "Sheet1"
    RangeAddress = "A1:D150"
    GetData FileName, SheetName, RangeAddress, Range("A1")
  End If
End Sub
Thì có được xem là hợp lệ không?
Ẹc... Ẹc...
 
Upvote 0
Hổng hẳn là đố, gần như bàn luận hơn:

Đề bài: viết code tính tổng các số nguyên từ n1 đến n2

[code 1]
tong = 0
for i = n1 to n2
tong = tong + i
next i

[code 2]
tong = (n2*n2 + n2 - n1*n1 - n1) / 2 + n1

Theo bạn thì code nào tốt hơn?
 
Upvote 0
Tôi viết 1 hàm tự tạo như thế này
PHP:
Function Check() As Boolean
Application.Volatile
For i = 1 To Sheets.Count - 1
    For j = i + 1 To Sheets.Count
        If Sheets(i).CodeName = Sheets(j).CodeName Then
            Check = True
            Exit Function
        End If
    Next
Next
End Function
Câu hỏi đặt ra là hàm trên có thể trả về kết quả True không? Nếu có thì khi nào?
 
Upvote 0
Tôi viết 1 hàm tự tạo như thế này
PHP:
Function Check() As Boolean
Application.Volatile
For i = 1 To Sheets.Count - 1
    For j = i + 1 To Sheets.Count
        If Sheets(i).CodeName = Sheets(j).CodeName Then
            Check = True
            Exit Function
        End If
    Next
Next
End Function
Câu hỏi đặt ra là hàm trên có thể trả về kết quả True không? Nếu có thì khi nào?

Khi i = j = Sheets.Count, tôi nghĩ như thế.
 
Upvote 0
Upvote 0
i không thể bằng Sheets.Count vì
Mã:
For i = 1 To [COLOR=#ff0000][B]Sheets.Count - 1[/B][/COLOR]
Và j cũng không thể bằng i vì
Mã:
For j =[COLOR=#ff0000][B] i + 1[/B][/COLOR] To Sheets.Count

Có lẽ không bao giờ chúng trở thành TRUE, cho dù ta có hoán đổi vị trí giữa các sheet với nhau.
 
Upvote 0
Đúng là vậy! Đã là ĐỐ VUI thì chắc chắn phải có điểm độc đáo riêng
Câu này thật sự mình không nghĩ ra. Thắng cho đáp án đi

Khi tạo một Sheet mới thì CodeName của sheet đó là chuỗi rỗng cho đến khi ta mở cửa sổ VBE.

Vậy anh chỉ cần tạo 2 sheet mới thì UDF sẽ trả về kết quả True.
 
Upvote 0
Mình đã thử tạo sheet mới, nhưng chỉ tạo 1 sheet nên chưa thành công. Tính thử tiếp thì nghe đt rồi bỏ luôn.
 
Upvote 0
Câu này đơn giản nhưng có thể có người chưa biết.
Hai cách viết như bên dưới có gì khác nhau không?
PHP:
Sub Test()
  ...
  If ... Then ...
  ...
End Sub
PHP:
Sub Test()
  ...
  If ... Then
    ...
  End If
  ...
End Sub
 
Upvote 0
Câu này đơn giản nhưng có thể có người chưa biết.
Hai cách viết như bên dưới có gì khác nhau không?
PHP:
Sub Test()
  ...
  If ... Then ...
  ...
End Sub
PHP:
Sub Test()
  ...
  If ... Then
    ...
  End If
  ...
End Sub

Về cấu trúc thì nó bớt đi dòng "End If", còn cách thực hiện thì nó cũng như nhau thôi.
 
Upvote 0
Khác là khác về kết quả khi run code chứ bỏ bớt cái "End If" thì nói làm gì bạn.


Tôi thì không nghĩ là vậy, bởi trong Help có ghi chú:

Single-Line Syntax

You can use the single-line syntax for short, simple tests. However, the multiple-line syntax provides more structure and flexibility and is usually easier to read, maintain, and debug.


Và điều đó cũng được nói tại đây:

http://msdn.microsoft.com/en-us/library/752y8abs.aspx
 
Upvote 0
Hình như cái 1 trả về 1 cái gì đó khi thỏa điều kiện.
Cái 2 thì có thể thêm vào nhiều kết quả.
 
Upvote 0

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

Back
Top Bottom