Đố vui về VBA!

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
1,820
Được thích
2,826
Điểm
360
Cuối tuần mời các bạn thư giãn nhẹ nhàng:
Mình có 2 thư mục như này:

View attachment 200754
Mỗi thư mục đều chứa file tên là myfile.xlsb
Bây giờ ta đang đứng ở file myfile.xlsb nằm trong thư mục local, mời các bạn thử viết code để chạy các tác vụ:
1/Đóng file myfile.xlsb trong thư mục local.
2/Copy file myfile.xlsb trong thư mục server chép đè vào thư mục local.
3/Mở lại file myfile.xlsb trong thư mục local.

Cám ơn các bạn. --=0--=0
Thêm module với code dưới vào tập tin, không cần lưu lại, sau đó chạy code
Mã:
Sub test()
    Application.DisplayAlerts = False
    ThisWorkbook.ChangeFileAccess xlReadOnly
   
    With CreateObject("Scripting.FileSystemObject")
        .CopyFile Replace(ThisWorkbook.FullName, "\local\", "\server\"), ThisWorkbook.FullName
    End With
    Workbooks.Open ThisWorkbook.FullName
    ThisWorkbook.Close False
    Application.DisplayAlerts = True
End Sub
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,166
Được thích
52,324
Điểm
11,910
Lấy lại kích thước gốc của một hình đã chèn trên bảng tính
Có tình huống thế này:
- Tôi chèn 1 hình vào bảng tính
- Xong, tôi chỉnh lại kích thước cho nó tùy ý (kéo chiều ngang, kéo chiều dọc)
- Cuối cùng tôi lưu và đóng file
Sau này mở file lên, nếu tôi muốn lấy lại kích thước gốc của hình, tôi sẽ chọn vào hình, vào tab Format, bấm mũi tên xổ xuống của nút Reset Picture và chọn "Reset Picture & Size". Vậy là hình sẽ trở lại kích thước nguyên thủy
----------------------------
Xin hỏi: Nếu viết code thì phải viết thế nào (chức năng này không cho record macro)
Trong file đính kèm dưới đây tôi có chèn 1 hình. Các bạn giúp tôi lấy lại kích thước gốc của nó với nhé
 

File đính kèm

huuthang_bd

Chuyên gia GPE
Tham gia ngày
10 Tháng chín 2008
Bài viết
6,987
Được thích
7,803
Điểm
860
Nơi ở
TP.HCM
Lấy lại kích thước gốc của một hình đã chèn trên bảng tính
Có tình huống thế này:
- Tôi chèn 1 hình vào bảng tính
- Xong, tôi chỉnh lại kích thước cho nó tùy ý (kéo chiều ngang, kéo chiều dọc)
- Cuối cùng tôi lưu và đóng file
Sau này mở file lên, nếu tôi muốn lấy lại kích thước gốc của hình, tôi sẽ chọn vào hình, vào tab Format, bấm mũi tên xổ xuống của nút Reset Picture và chọn "Reset Picture & Size". Vậy là hình sẽ trở lại kích thước nguyên thủy
----------------------------
Xin hỏi: Nếu viết code thì phải viết thế nào (chức năng này không cho record macro)
Trong file đính kèm dưới đây tôi có chèn 1 hình. Các bạn giúp tôi lấy lại kích thước gốc của nó với nhé
Cái này search là ra anh.
Mã:
ActiveSheet.Shapes(1).ScaleWidth 1, True
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,166
Được thích
52,324
Điểm
11,910
Đố tiếp anh. Trường hợp nào thì lệnh này không dùng được? :)
Thử thì biết chứ gì. Ví dụ thử với shape (không phải picture)
---------------------------------------
Nói thật là tôi đang cần cái Reset picture này lâu lắm rồi. Tự dưng hôm này tình cờ phát hiện ra, thấy hay nên gửi lên cho bà con tham khảo
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,166
Được thích
52,324
Điểm
11,910
Em vẫn xét picture anh gửi thôi.
Chắc thêm dòng này phía trước bài trên cho chắc ăn:
PHP:
ActiveSheet.Shapes(1).LockAspectRatio = msoTrue
Đúng là chắc ăn hơn thật!
Tại thấy mặc định (chưa can thiệp) thì LockAspectRatio đã được check rồi nên không để ý
----------------
(trời! gửi bài xong thấy hiện ra linh tinh cái gì đâu không, xóa mệt luôn)
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
6,625
Được thích
7,719
Điểm
560
Đố 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)
và lý luận, giải thích cách dùng (2 điểm)

Ba Ếch viết như sau:
Mã:
Sub giaiptbac2()
' sub giải phương trình bậc 2
' chạy sub, gõ các trị a, b, c vào các câu hỏi và nhận kết quả
{ code hỏi và nhận a, b, c ở đây }
' đến đây thì đã có a, b, c
If a = 0 Then
  If b = 0 Then
    MsgBox "Phuong trinh " & IIF(c = 0, "co vo so nghiem", "vo nghiem")
  Else
    MsgBox "Co 1 nghiem la " & -c / b
  End If
  Exit Sub
End If
Dim delta
delta = b*b - 4*a*c
If delta < 0 Then
  MsgBox "Phuong trinh vo nghiem"
ElseIf delta = 0 Then
  MsgBox "Co 1 nghiem la " & -b / 2 / a
Else
  delta = sqrt(delta)
  MsgBox "Co 2 nghiem la " & (-b + delta) / 2 / a & " va " & (-b - delta) / 2 / a
End If
End Sub
Như vậy, Ếch sẽ được bao nhiêu điểm? Và theo bạn, nếu dưới 9 điểm thì muốn 9-10 điểm phải thế nào?
 

Hau151978

Thành viên tích cực
Tham gia ngày
19 Tháng mười 2011
Bài viết
1,234
Được thích
1,066
Điểm
560
Đố 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)
và lý luận, giải thích cách dùng (2 điểm)

Ba Ếch viết như sau:
Mã:
Sub giaiptbac2()
' sub giải phương trình bậc 2
' chạy sub, gõ các trị a, b, c vào các câu hỏi và nhận kết quả
{ code hỏi và nhận a, b, c ở đây }
' đến đây thì đã có a, b, c
If a = 0 Then
  If b = 0 Then
    MsgBox "Phuong trinh " & IIF(c = 0, "co vo so nghiem", "vo nghiem")
  Else
    MsgBox "Co 1 nghiem la " & -c / b
  End If
  Exit Sub
End If
Dim delta
delta = b*b - 4*a*c
If delta < 0 Then
  MsgBox "Phuong trinh vo nghiem"
ElseIf delta = 0 Then
  MsgBox "Co 1 nghiem la " & -b / 2 / a
Else
  delta = sqrt(delta)
  MsgBox "Co 2 nghiem la " & (-b + delta) / 2 / a & " va " & (-b - delta) / 2 / a
End If
End Sub
Như vậy, Ếch sẽ được bao nhiêu điểm? Và theo bạn, nếu dưới 9 điểm thì muốn 9-10 điểm phải thế nào?
Câu hỏi chưa rõ giải phương trình tìm nghiệm trên tập hợp nào, ở đây hiểu là số thực R, nếu trên tập C thì kết quả khác.
Nếu a=b=c=0 thì câu trả lời có vô số nghiệm là chưa đủ mà phải là tất cả R đều là nghiệm.
Đề yêu cầu viết hàm thì ếch viết sub.
Code không chạy vì căn bậc 2 trong vba là SQR, không phải SQRT như trên sheet.
Điểm thì em cũng không biết được mấy vì code không chạy và em cũng không sửa được, chờ mấy thầy chuyên gia sửa điểm ở Lạng Sơn, Hà Giang vào giúp.
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
6,625
Được thích
7,719
Điểm
560
Câu hỏi chưa rõ giải phương trình tìm nghiệm trên tập hợp nào, ở đây hiểu là số thực R, nếu trên tập C thì kết quả khác.
Nếu a=b=c=0 thì câu trả lời có vô số nghiệm là chưa đủ mà phải là tất cả R đều là nghiệm.
Đề yêu cầu viết hàm thì ếch viết sub.
Code không chạy vì căn bậc 2 trong vba là SQR, không phải SQRT như trên sheet.
Điểm thì em cũng không biết được mấy vì code không chạy và em cũng không sửa được, chờ mấy thầy chuyên gia sửa điểm ở Lạng Sơn, Hà Giang vào giúp.
1. Khi tôi nói số thực, mặc định là tập hợp R.
2. Hàm và sub : bạn đúng (bây giờ thử đặt câu hỏi tại sao Cô bảo làm hàm mà không là sub?)
3. SQRT, gõ nhầm, xin lỗi
4. Điểm chỉ là sự tương đối để đánh giá. Lỡ nói chuyện Hà giang rồi thì tôi hé thêm: thực ra bài này còn phần điểm cho thêm (bô nớt). Nếu biết phần ấy thì được trên cả 10. Nhưng cũng thú thật, nó trên trình của tôi.
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
1,820
Được thích
2,826
Điểm
360

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
6,625
Được thích
7,719
Điểm
560
Trich

Pt là bậc 2 khi và chỉ khi a <> 0.
Cái đó không quan trọng, chỉ là vấn đề định nghĩa.
Chỉ cần thêm 1 điều kiện rằng nếu a không khác 0 thì hàm không chịu giải
"This is NOT a quadratic function. You idiot!"
 

Hau151978

Thành viên tích cực
Tham gia ngày
19 Tháng mười 2011
Bài viết
1,234
Được thích
1,066
Điểm
560
Trich

Pt là bậc 2 khi và chỉ khi a <> 0.
Bác ơi đề có bảo là phương trình bậc 2 đâu, đấy là bài làm đặt vậy chứ.
@VetMini em đoán chắc là muốn 11 điểm thì giải luôn phương trình ax^4 + bx^3 +cx^2 + dx + e = 0. Bây giờ bỏ toán 20 năm rồi em chỉ nhớ đến bậc 3 thôi.
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
1,820
Được thích
2,826
Điểm
360
Bác ơi đề có bảo là phương trình bậc 2 đâu, đấy là bài làm đặt vậy chứ.
Theo tôi nếu đề bài là
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)
Mà ta biết là khi học về pt bậc 2 luôn có đk a <> 0 nên ta phải xét dữ liệu nhập:
- nếu a = 0 thì không giải, vì pt không là bậc 2
- nếu a <> 0 thì xét delta rồi ...

Cũng có thể trước khi xét delta thì xét xem có a+b+c=0, a-b+c=0 hay không :D
 
Lần chỉnh sửa cuối:

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
6,625
Được thích
7,719
Điểm
560
@VetMini em đoán chắc là muốn 11 điểm thì giải luôn phương trình ax^4 + bx^3 +cx^2 + dx + e = 0. Bây giờ bỏ toán 20 năm rồi em chỉ nhớ đến bậc 3 thôi.
Không phải vậy đâu. Dân chuyên giải phương trình có con toán gọi là đồng bộ thừa số (terms normalisation/ization)
Ví dụ, nếu a = 1 * 10^-10, b = 2 * 10^-10, c = 3 * 10^-10 thì ngừoi ta đồng bộ chúng thành 1, 2, 3 để giảm thiểu sai số. Đây chỉ là 1 ví dụ, còn nhiều vấn đề nữa, không chỉ có vậy. Đại khái là phải so sánh độ lớn tương đối của các thừa số trước khi bắt đầu giải.
Tức là phải viết thêm 1 hàm đồng bộ. Nhưng đã nói, cái này là trình cao lắm.
 

Hau151978

Thành viên tích cực
Tham gia ngày
19 Tháng mười 2011
Bài viết
1,234
Được thích
1,066
Điểm
560
Không phải vậy đâu. Dân chuyên giải phương trình có con toán gọi là đồng bộ thừa số (terms normalisation/ization)
Ví dụ, nếu a = 1 * 10^-10, b = 2 * 10^-10, c = 3 * 10^-10 thì ngừoi ta đồng bộ chúng thành 1, 2, 3 để giảm thiểu sai số. Đây chỉ là 1 ví dụ, còn nhiều vấn đề nữa, không chỉ có vậy. Đại khái là phải so sánh độ lớn tương đối của các thừa số trước khi bắt đầu giải.
Tức là phải viết thêm 1 hàm đồng bộ. Nhưng đã nói, cái này là trình cao lắm.
Đúng là việc này thường làm khi giải phương trình cụ thể, hóa ra lập trình cũng cần. Em lại tưởng là phải xét trường hợp số nhập vào vượt giới hạn của double, chắc khi đó phải viết lại cả các hàm cộng trừ nhân chia căn.
 

VetMini

Chuyên gia GPE
Tham gia ngày
21 Tháng mười hai 2012
Bài viết
6,625
Được thích
7,719
Điểm
560
Như tôi đã nói, nó cao trên trình của tôi thì còn hỏi "phải làm gì"
Theo tôi thì học sinh chỉ cần chú thích cho Cô giáo biết là mình có biết đến chuyện này, nhưng nó trên trình độ lớp cho nên không thể code. Thế là hưởng 1 điểm. Viết cái code sau đây thì cho 2 điểm. (điểm chỉ là tương đối để nói chuyện thôi)

Function DongBo(byRef a As Double, byRef b As Double, byRef c As Double)
' hàm đồng bộ ba thừa số a b c của phương trình bậc 2 để gảm sai số.
' chỉ biết hàm nó đại khái thế thôi chứ chi tiết nó cao trên trình độ của lớp
End Function

Code giải phương trình gọi hàm này. Vì hàm không làm gì cả cho nên gọi nó cũng chả chết ai. Khi nào biết phải code ra sao thì cho vào hàm.
 

khi ta 20

Thành viên thường trực
Tham gia ngày
26 Tháng ba 2018
Bài viết
260
Được thích
208
Điểm
210
Tuổi
24
Cũng có thể trước khi xét delta thì xét xem có a+b+c=0, a-b+c=0 (*)hay không :D
Em nghĩ cái này không cần thiết, bởi (*) xảy ra thì (delta)^(1/2) =|a-c|
Làm thử : Khi a+b+c=0 =>b=-(a+c)
Delta=b^2-4ac=[-(a+c)]^2-4ac=a^2+c^2-2ac=(a-c)^2
Căn bậc hai của delta =|a-c|
 

batman1

Thành viên gắn bó
Tham gia ngày
8 Tháng chín 2014
Bài viết
1,820
Được thích
2,826
Điểm
360
Em nghĩ cái này không cần thiết, bởi (*) xảy ra thì (delta)^(1/2) =|a-c|
Làm thử : Khi a+b+c=0 =>b=-(a+c)
Delta=b^2-4ac=[-(a+c)]^2-4ac=a^2+c^2-2ac=(a-c)^2
Căn bậc hai của delta =|a-c|
Nhưng tiếp theo thì sao? Dùng công thức biết trước
Mã:
x1 = (-b + (a-c)) / 2a = (- b + a -c) / 2a = 2a / 2a = 1
x2 = (-b - (a-c)) / 2a = (- b - a + c) / 2a = 2c / 2a = c/a
?

Thế có phải là sa đà vào việc tính toán không?

Trong khi đó nếu a + b + c = 0 (a - b +c = 0) thì rõ ràng có ngay 2 nghiệm là 1 và c/a (-1 và -c/a).

Nghiệm 1 và -1 nhìn ra ngay, vd. nhìn ra ngay là khi a + b + c = 0 thì 1 thỏa pt ax² + bx + c = 0. Nghiệm thứ 2 suy ra từ định lý Vi-et: x1 * x2 = c/a

Làm thế để cô giáo biết là em A không phải ... dạng vừa. Vì những trường hợp "đặc biệt" này có học trên lớp. :D
 
Top