Đố 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,905
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
 
Để có thể tiếp tục, ban Giám Hiệu yêu cầu Cô giáo phải xác định lại đề bài:
Đề bài được xác định là ba thừa số a, b, c chỉ dùng để lập đa thức dạng aX2 + bX + c. Tức là một đa thức có bậc tối đa là 2, không bắt buộc phải chính xác bậc 2.
a, b, c đều là phần tử của tập hợp R cho nên trị 0 không được ngoại lệ.
 
Upvote 0
Để có thể tiếp tục, ban Giám Hiệu yêu cầu Cô giáo phải xác định lại đề bài:
Đề bài được xác định là ba thừa số a, b, c chỉ dùng để lập đa thức dạng aX2 + bX + c. Tức là một đa thức có bậc tối đa là 2, không bắt buộc phải chính xác bậc 2.
a, b, c đều là phần tử của tập hợp R cho nên trị 0 không được ngoại lệ.
Hổng lẽ bậc của đa thức có thể là số lẻ ?
 
Upvote 0
Hổng lẽ bậc của đa thức có thể là số lẻ ?
X3 thì gọi là bậc mấy?

Chú: tôi học toán ở SG hơn 40 năm về trước cho nên cách học ba môn Đại số (Algebra), Giải tích (Calculus/Analysis), và Toán số (Arithmetics) hơi khác chương trình sau này các bạn học 1 chút.
Bác batman khoảng xấp xỉ tuổi tôi, như vậy có lẽ bác ấy học toán ở HN.
Lúc ấy, SG đang trên đường chuyển chiều hướng giáo dục theo lối Mỹ, tức là bớt Toán 1 chút để bù vào Vật lý và nhất là Hoá. Vì vậy, nếu trình độ dạy toán HN cao hơn SG thì tôi cũng không lấy làm lạ.
Vả lại, tuy tôi học ban Toán nhưng trình sở thích của tôi là Văn.
 
Upvote 0
Bác batman khoảng xấp xỉ tuổi tôi,
Tôi năm 1954.
như vậy có lẽ bác ấy học toán ở HN.
Thế hệ tôi là sơ tán khắp nơi. Năm lớp 7 mới về gần Hà Nội, cấp 3 thì về lại nội thành.
Lúc ấy, SG đang trên đường chuyển chiều hướng giáo dục theo lối Mỹ, tức là bớt Toán 1 chút để bù vào Vật lý và nhất là Hoá. Vì vậy, nếu trình độ dạy toán HN cao hơn SG thì tôi cũng không lấy làm lạ.
Vả lại, tuy tôi học ban Toán nhưng trình sở thích của tôi là Văn.
Tôi chỉ giỏi về Toán, Lý, Hóa, Văn và các môn học thuộc lòng như Sử, Địa thì cố được trung bình. Người ta gọi là học lệch :D
 
Upvote 0
Tôi kém bác 1 tuổi.
Thế hệ tôi là thế hệ "Rớt tú tài anh đi trung sĩ, em ở nhà lấy Mỹ nuôi con". Trung học chia ra làm đệ nhất (6-9) và đệ nhị cấp (10-12). Học xong lớp 11 thi tú tài 1, nếu đậu thì được lên 12 và học xong thì thi tú tài 2. Hầu hết các ĐH chỉ nhận tú tài 2. Hồi đó chính quyền SG tuyển quân nhân theo bằng cấp. Có bằng tú tài 2 thì được thi vào trường Võ Bị Đà Lạt (ra thiếu uý). Có bằng tú tài 1 thì tự động vào võ bị Thủ Đức (ra chuẩn uý). Có bằng Trung học đệ nhất cấp thì đi trường hạ sĩ quan Đồng Đế (ra trung sĩ). Vì vậy mới có bài thơ trên (*). Cũng cần nói thêm là lúc đó ngành phi công Mỹ cũng tuyển tú tài 1 cho nên một số bạn tôi học đến cấp này thì đăng phi công Mỹ.

(*) bài thơ ấy nói lên cái tâm trạng hoang mang của ngừoi thế hệ tôi. Vì vậy tôi nhớ mãi. Tuy nó dở bẹt nhưng đối với tôi nó cũng như câu "ba người anh nới chiến trường Đông Bắc, được tin em gái mất, trước khi em lấy chồng" của Hữu Loan diễn tả cái xáo trộn đời người của thời kháng chiến.
 
Upvote 0
Đố dễ ẹt nè.
Cô giáo ra bài:
Viết code cho 1 hàm VBA nhận 3 số thực a, b, c (3 điểm) và giải phương trình aX2 + bX + c = 0 (5 điểm)
lý luận, giải thích cách dùng (2 điểm)
...

Ăn 5 điểm đỏ đỏ như thế này:
Thiết kế giao diện hàm
Hàm cần làm thế nào để nhận 3 tham -> 3 double byval
Hàm cần làm thế nào để trả về 2 nghiệm (chả nhẽ trả về một Type, gồm 2 nghiệm?) -> 2 double byRef
Hàm cần làm thế nào để trả về con số nghiệm -> hàm trả về 1 Integer: 0 = vô nghiệm, 1 = 1 nghiệm, 2 = 2 nghiệm, 3 (>2) = vô số nghiệm
(nếu muón diễn tả trục trặc thì có thể dùng số âm để trả về)

Function GiaiPTBac2(byVal a As Double, byVal b As Double, byVal c As Double, byRef x1 As Double, byRef x2 As Double) As Integer
' ham giai phuong trinh bac 2, dang aX2 + bX + c = 0
' tham nhan (in) a, b, c
' tham xuat (out) x1, x2 : 2 nghiem cua phuong trinh (neu co)
' Tri tra ve cua ham: 1 Integer: 0 = vô nghiệm, 1 = 1 nghiệm, 2 = 2 nghiệm, 3 = vô số nghiệm
'

...
End Function

Ví dụ cách gọi hàm:

Select Case GiaiPTBac2(a, b, c, x1, x2)
Case 0
MsgBox "PT vo nghiem"
Case 1
MsgBox "PT co 1 nghiem (kep) la " & x1
Case 2
MsgBox "PT co 2 nghiem la " & x1 & " va " & x2
Case Else
MsgBox "PT khong co nghiem nhat dinh"
End Select
(ví dụ của tôi chỉ đại khái thôi. Cái vụ số nghiệm tuỳ theo quan điểm)

(*) Lưu ý: đây không phải là giải pháp duy nhất hoặc hay nhất. Mục đích của bài này là giới thiệu với các bạn về cách thiết kế giao diện hàm.

1. Mời các bạn thử tìm cách hạ điểm trên xuống dưới 5 bằng cách đưa ra khuyết điểm và cách bổ khuyết.

2. Mời các bạn thử lấy 5 điểm còn lại (viết phần code giải)
 
Upvote 0
Đố các bạn khi thực thi một dòng lệnh gán dữ liệu từ mảng xuống sheet (như code bên dưới) thì VBA thực hiện theo thứ tự như thế nào.
  1. Tất cả các ô cùng lúc
  2. Từ trái qua phải, từ trên xuống dưới
  3. Từ trên xuống dưới, từ trái qua phải
  4. Ngẫu nhiên
  5. Khác
Mã:
Sub Test()
Dim i As Long, j As Long
Dim Arr(1 To 10, 1 To 2)
For i = 1 To 10
    For j = 1 To 2
        Arr(i, j) = Cells(i, j).Address(0, 0)
    Next
Next
[A1:B10].Value = Arr
End Sub
 
Upvote 0
Đố các bạn khi thực thi một dòng lệnh gán dữ liệu từ mảng xuống sheet (như code bên dưới) thì VBA thực hiện theo thứ tự như thế nào.
  1. Tất cả các ô cùng lúc
  2. Từ trái qua phải, từ trên xuống dưới
  3. Từ trên xuống dưới, từ trái qua phải
  4. Ngẫu nhiên
  5. Khác
Mã:
Sub Test()
Dim i As Long, j As Long
Dim Arr(1 To 10, 1 To 2)
For i = 1 To 10
    For j = 1 To 2
        Arr(i, j) = Cells(i, j).Address(0, 0)
    Next
Next
[A1:B10].Value = Arr
End Sub
Em đoán là đáp án thứ 2.Vì Khi dữ liệu mảng nhiều thì nó thực hiện chậm hơn.
 
Upvote 0
Đố các bạn khi thực thi một dòng lệnh gán dữ liệu từ mảng xuống sheet (như code bên dưới) thì VBA thực hiện theo thứ tự như thế nào.
  1. Tất cả các ô cùng lúc
  2. Từ trái qua phải, từ trên xuống dưới
  3. Từ trên xuống dưới, từ trái qua phải
  4. Ngẫu nhiên
  5. Khác
Mã:
Sub Test()
Dim i As Long, j As Long
Dim Arr(1 To 10, 1 To 2)
For i = 1 To 10
    For j = 1 To 2
        Arr(i, j) = Cells(i, j).Address(0, 0)
    Next
Next
[A1:B10].Value = Arr
End Sub
Dzụ này đúng là chưa biết, nhưng thử từ 1000 dòng, đến 10k đến 100k và 500k dòng thì nó đổ cùng lúc, càng nhiều dòng thì mất thời gian duyệt vòng lặp thôi. Vậy đáp án 1, thực thi dòng lệnh gán mảng xuống sheet là tất cả các ô cùng lúc.
 
Upvote 0
Đố các bạn khi thực thi một dòng lệnh gán dữ liệu từ mảng xuống sheet (như code bên dưới) thì VBA thực hiện theo thứ tự như thế nào.
  1. Tất cả các ô cùng lúc
  2. Từ trái qua phải, từ trên xuống dưới
  3. Từ trên xuống dưới, từ trái qua phải
  4. Ngẫu nhiên
  5. Khác
Mã:
Sub Test()
Dim i As Long, j As Long
Dim Arr(1 To 10, 1 To 2)
For i = 1 To 10
    For j = 1 To 2
        Arr(i, j) = Cells(i, j).Address(0, 0)
    Next
Next
[A1:B10].Value = Arr
End Sub
Dùng sự kiện để test thấy gán 1 lần
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim i As Long
  If Not Intersect(Target, Range("A1:B10")) Is Nothing Then
    i = Application.Count(Range("E1:E100"))
    Cells(i + 1, 4) = i + 1
    Cells(i + 1, 5) = Target.Address(0, 0)
  End If
End Sub

Sub Test()
Dim i As Long, j As Long
Dim Arr(1 To 10, 1 To 2)
For i = 1 To 10
    For j = 1 To 2
        Arr(i, j) = Cells(i, j).Address(0, 0)
    Next
Next
[A1:B10].Value = Arr
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Khái niệm "đổ cùng lúc" là thế nào? Người ta nói "Trong Windows tất cả mọi program đều thực hiện cùng lúc". Làm gì có chuyện ở mỗi thời điểm mọi program đều được thực hiện. Chỉ có điều mỗi program được thực hiện trong một khoảng thời gian rất nhỏ", Program 1 được thực hiện trong một khoảng thời gian rất nhỏ, sau đó "control" sẽ được chuyển sang program 2 (Windows chuyển context), và nó cũng được thực hiện trong một khoảng thời gian rất nhỏ. Cứ thế lần lượt mỗi program. Vì lẽ đó nên nếu ta chuyển liên tục từ program này sang program khác thì có cảm giác là ở mọi thời điểm mỗi program đều đang được thực hiện.
Tôi không rõ các phần tử của mảng sẽ được đập xuống sheet như thế nào. Nhưng tôi tin rằng dù đập xuống sheet bằng cách nào thì khi tất cả mọi phần tử đã được đập xuống sheet thì lúc đó nếu có những công thức tham chiếu tới vùng được đập thì các công thức đó mới được tính lại. Tức nếu cần phải thực hiện calculation thì nó sẽ được thực hiện sau khi mọi phần tử của mảng được đập xuống sheet. Với cách hiểu như thế thì không cần phải quan tâm, các phần tử đã được đập xuống sheet theo cách nào. Không có chuyện đập vào A1 rồi công thức tham chiếu tới vd. A1:C20 được tính lại, rồi sau khi đập xuống A2 thì công thức lại được tính lại, cứ đan xen như thế cho tới khi đập xuống B10 và tính lại công thức. Không, tôi tin là sau khi đập xong A1, ..., A10, B1, ..., B10 thì công thức mới được tính. Nó cho ta cảm giác là "Tất cả các ô cùng lúc", nhưng đó là cảm giác. Ở mỗi thời điểm thì chỉ có 1 phần tử được đổ thôi. "Cùng lúc" chỉ là cách nói mà không có định nghĩa nó là thế nào.
Ở đây tương tự như tình huống: ta có công thức tham chiếu tới A1:B10. Nếu ta chọn A1:B10 và nhấn Ctrl + V để dán 20 giá trị bằng "một thao tác" vào vùng A1:B10 thì phải sau khi 20 giá trị được dán thì công thức mới được tính. Nếu ta có code Worksheet_Change thì sự kiện Worksheet_Change chỉ sảy ra 1 lần chứ không phải 20 lần, và sự kiện đó chỉ sảy ra khi tất cả 20 giá trị đã được gán cho A1:B10.

Còn nếu tò mò là các ô được gán theo thứ tự nào thì tôi đoán là theo cột. Gán xong cột 1 thì gán cột 2, cột 3, cột 4 ...
 
Upvote 0
Em đoán là đáp án thứ 2.Vì Khi dữ liệu mảng nhiều thì nó thực hiện chậm hơn.
Có cơ sở gì không bạn? Mảng lớn chậm có thể là gán từng ô đúng nhưng chắc gì đã là thứ tự như vậy.
Bài đã được tự động gộp:

Dùng sự kiện để test thấy gán 1 lần
Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim i As Long
  If Not Intersect(Target, Range("A1:B10")) Is Nothing Then
    i = Application.Count(Range("E1:E100"))
    Cells(i + 1, 4) = i + 1
    Cells(i + 1, 5) = Target.Address(0, 0)
  End If
End Sub

Sub Test()
Dim i As Long, j As Long
Dim Arr(1 To 10, 1 To 2)
For i = 1 To 10
    For j = 1 To 2
        Arr(i, j) = Cells(i, j).Address(0, 0)
    Next
Next
[A1:B10].Value = Arr
End Sub
Như anh batman1 phân tích sự kiện xảy ra 1 lần không có nghĩa là cả mảng được gán 1 lần.
Anh batman1 cũng chỉ đoán thôi chứ cũng không có cơ sở.
 
Lần chỉnh sửa cuối:
Upvote 0
Đố các bạn khi thực thi một dòng lệnh gán dữ liệu từ mảng xuống sheet (như code bên dưới) thì VBA thực hiện theo thứ tự như thế nào.
  1. Tất cả các ô cùng lúc
  2. Từ trái qua phải, từ trên xuống dưới
  3. Từ trên xuống dưới, từ trái qua phải
  4. Ngẫu nhiên
  5. Khác
Mã:
Sub Test()
Dim i As Long, j As Long
Dim Arr(1 To 10, 1 To 2)
For i = 1 To 10
    For j = 1 To 2
        Arr(i, j) = Cells(i, j).Address(0, 0)
    Next
Next
[A1:B10].Value = Arr
End Sub
Mạnh dạn chọn đáp án 4.

Trong này có bác nào rành phần cứng (CPU) chắc giải thích được. Liên quan tới 'thread và process' gì đó... vì cho dù là siêu máy tính thì vẫn chỉ có duy nhất một process được chạy trong một đơn vị thời gian mà thôi.
 
Upvote 0
Có cơ sở gì không bạn? Mảng lớn chậm có thể là gán từng ô đúng nhưng chắc gì đã là thứ tự như vậy.
Bài đã được tự động gộp:


Như anh batman1 phân tích sự kiện xảy ra 1 lần không có nghĩa là cả mảng được gán 1 lần.
Anh batman1 cũng chỉ đoán thôi chứ cũng không có cơ sở.
Gán 1 lần hay gán nhiều lần chỉ mang ý nghĩa tương đối theo cách nhìn nhận khác nhau, tương tự như phép tính 2+3 là 1 phép tính hay nhiều phép tính trong VBA, nếu truy tới xử lý nhị phân thì là nhiều phép tính, nhưng về toán tử là 1 phép tính
Vấn đề là VBA xem thế nào là gán 1 lần, gán 2 lần ... Gán dữ liệu là sự kiện, dùng sự kiện thay đổi để xác định số lần gán là hợp lý, còn xử lý để gán như thế nào là vấn đề khác, không phải số lần gán mảng vào Cells
 
Upvote 0
Anh batman1 cũng chỉ đoán thôi chứ cũng không có cơ sở.
Đoán là khi nói về cách gán xuống sheet.

Còn chuyện là sự kiện sảy ra 1 lần thì rõ ràng mà.

Tôi chỉ thắc mắc là có khái niệm "cùng lúc" (Tất cả các ô cùng lúc) nhưng không có định nghĩa khái niêm đó. Vì làm gì có cùng lúc với cách hiểu là 1 thời điểm - 1 vị trí trên trục thời gian? Vì mảng đập xuống sheet là cả 1 quá trình, mảng càng lớn thì thời gian đập xuống sheet càng lớn. Vd. mảng đập xuống sheet trong quá trình 0,5 s thì rõ ràng ở mọi thời điểm t, với t < 0,5 thì vùng "chưa đầy". Không có thời điểm t < 0,5 s nào mà tất cả các ô trong vùng đều có giá trị.

Còn chuyện mọi calculation chỉ được thực hiện khi toàn bộ mảng được nhập xuống sheet xong thì là điều tôi chắc chắn chứ không phải đoán mò. Và có thể cho vd. để chứng tỏ điều này.

Còn về cách thức nhập vào từng ô thì tôi mới đoán mò là nhập theo từng cột. Tuy là đoán mò nhưng cũng phải có cơ sở, đúng hay sai, cho cái đoán mò đó. Không phải đoán mò trên cơ sở tung đồng xu. Trong VBA chỉ được phép Redim Preserve với thay đổi số cột. Vì mảng được ghi theo từng cột. Có thể viết 1 lệnh đề copy toàn bộ 1 cột sang 1 mảng 1 chiều nhưng không viết được 1 lệnh để copy cả dòng sang mảng 1 chiều.
 
Lần chỉnh sửa cuối:
Upvote 0
Đoán là khi nói về cách gán xuống sheet.

Còn chuyện là sự kiện sảy ra 1 lần thì rõ ràng mà.

Tôi chỉ thắc mắc là có khái niệm "cùng lúc" (Tất cả các ô cùng lúc) nhưng không có định nghĩa khái niêm đó. Vì làm gì có cùng lúc với cách hiểu là 1 thời điểm - 1 vị trí trên trục thời gian? Vì mảng đập xuống sheet là cả 1 quá trình, mảng càng lớn thì thời gian đập xuống sheet càng lớn. Vd. mảng đập xuống sheet trong quá trình 0,5 s thì rõ ràng ở mọi thời điểm t, với t < 0,5 thì vùng "chưa đầy". Không có thời điểm t < 0,5 s nào mà tất cả các ô trong vùng đều có giá trị.

Còn chuyện mọi calculation chỉ được thực hiện khi toàn bộ mảng được nhập xuống sheet xong thì là điều tôi chắc chắn chứ không phải đoán mò. Và có thể cho vd. để chứng tỏ điều này.

Còn về cách thức nhập vào từng ô thì tôi mới đoán mò là nhập theo từng cột. Tuy là đoán mò nhưng cũng phải có cơ sở, đúng hay sai, cho cái đoán mò đó. Không phải đoán mò trên cơ sở tung đồng xu. Trong VBA chỉ được phép Redim Preserve với thay đổi số cột. Vì mảng được ghi theo từng cột. Có thể viết 1 lệnh đề copy toàn bộ 1 cột sang 1 mảng 1 chiều nhưng không viết được 1 lệnh để copy cả dòng sang mảng 1 chiều.
Đúng vậy, khái niệm cùng lúc phải xem lại Vì máy tính không có khái niệm cùng lúc cùng thời điểm, chỉ là tương đối.
 
Upvote 0
Còn về cách thức nhập vào từng ô thì tôi mới đoán mò là nhập theo từng cột. Tuy là đoán mò nhưng cũng phải có cơ sở, đúng hay sai, cho cái đoán mò đó. Không phải đoán mò trên cơ sở tung đồng xu. Trong VBA chỉ được phép Redim Preserve với thay đổi số cột. Vì mảng được ghi theo từng cột. Có thể viết 1 lệnh đề copy toàn bộ 1 cột sang 1 mảng 1 chiều nhưng không viết được 1 lệnh để copy cả dòng sang mảng 1 chiều.
Thì em nói anh đoán không có cơ sở là nói thứ tự theo cột này.
Đáp án em cho là đúng là đáp án số 2 (Từ trái qua phải, từ trên xuống dưới ) dựa vào kết quả của đoạn code sau:
Mã:
Sub Test()
Dim i As Long, j As Long
Dim Arr(1 To 10, 1 To 2)
For i = 1 To 10
    For j = 1 To 2
        Arr(i, j) = Cells(i, j).Address(0, 0)
    Next
Next
Arr(4, 2) = "=()"
[A1:B10].Value = Arr
End Sub
 
Upvote 0
Lúc đầu tôi ngỡ câu lệnh gán mảng xuống sheet là atomic (trọn vẹn, không tách ra từng giai đoạn được). Và nếu thế thì ngang hay dọc tuỳ theo thiết kế map giữa mảng và bảng tính: mảng là cột-dòng, bảng tính là dòng-cột. Và thiết kế này nằm bên trong nội bộ:
- Excel không phải là mã nguồn mở. Nếu MS không cho biết trong tài liệu của họ thì chịu. (luật mã nguồn mở)
- Range là một đối tượng hoàn toàn. Lệnh gán là hàm nội bộ của range. Range hoàn toàn có quyền thay đổi cách hoạt động bên trong của nó, tuỳ theo phiên bản. (luật hướng đối tượng)

Tuy nhiên, tét code ở bài #1377 cho thấy MS tệ hơn mình nghĩ. Câu lệnh gán cuối cùng không phải là atomic. Nếu nó atomic thì nó phải có các tính chất sau:
i) kết thúc một loạt, nếu giữa chừng không tiếp tục được thì phải lùi về chỗ cũ, trước khi gán. HOẶC
ii) bắt lỗi liên tục, nếu giữa chừng bị lỗi thì vẫn tiếp tục lướt qua cho đến hết.

Tại sao tôi cho là MS tệ? Vì nếu câu lệnh gán không atomic thì đáng lẽ họ phải:
1. cho biết trong tài liệu, VÀ
2. cho tuỳ chọn, lỗi thì dừng lại, hoặc tiếp tục đi đến hết. (đòi hỏi phải lộn về đầu trước khi gán có lẽ hơi khó)
 
Upvote 0
Thêm câu nữa: Chia 1 cột thành nhiều cột không dùng vòng lặp, không dùng công thức (Viết code để thực hiện giống như file đính kèm mà không dùng vòng lặp, không dùng công thức)
 

File đính kèm

  • Chia cot.xlsm
    18.2 KB · Đọc: 27
Upvote 0
Web KT
Back
Top Bottom