Bài tập VBA - Macro

Liên hệ QC
Mình post 1 bài ở link này để tạo 1 bài tập về tối ưu thuật toán.
Chú ý chỉ dành cho những bạn còn yếu yếu luện code thôi nha. Còn đối với anh chị em khá khá thì xem code và gợi ý cải thiện code cho vui vẻ topic.
http://www.giaiphapexcel.com/forum/...-giúp-tạo-ra-bảng-so-sánh-từ-2-bảng-cho-trước

Yêu cầu: Ta có bảng 1, 2, 3. Cần tạo ra bảng so sánh như trong file đính kèm.
Code càng ngắn càng tốt.
 

File đính kèm

  • so sanh.xlsx
    8.9 KB · Đọc: 21
Bài tập vòng for, trong đây là những bài tập đơn giản các bạn có thể tham gia. Có cả những bài trích lọc hoặc copy từ chỗ này sang chỗ kia, chủ yếu là thực hành cấu trúc for dành cho những bạn mới biết VBA
http://www.mediafire.com/download/te8yozi89688u4i/FOR.rar
 
Ngồi buồn chẳng biết làm gì, lôi lại em Số Nguyên tố tí tẹo
Bạn phihndhsp nói:
Suy nghĩ lại thuật toán đi nha, tôi nói chạy đến căn bậc 2 là tối ưu nhất
Thầy Ptm nói:
81 thì lại chỉ cần xét đến 3 là ngưng rồi. Còn Phi nói chỉ xét đến căn bậc 2 là đúng. Thêm 1 ý là xét tối đa đến căn bậc 2.
Mấy cái này thì mình hoàn toàn đồng ý.
Nhưng, hôm nay đọc báo thấy xăng có thể tăng giá mạnh, mình đọc lại code này:
Mã:
Function KTNT(n As Long) As Boolean
    ' Chi xet cac so duong thoi
 Dim Tam As Boolean
 Dim i As Long
    If (n = 1) Then
         KTNT = False
        Exit Function
    End If
  
    If (n > 1 And n < 4) Then
        KTNT = True
        Exit Function
    End If
    Tam = True
    [B]For i = 2 To Sqr(n)
        If (n Mod i = 0) Then
              Tam = False
              Exit For
         End If
     Next[/B]
    KTNT = Tam
End Function
Mình có cảm giác nếu chỉnh code lại tí tẹo thì có thể giảm bớt số vòng chạy cho em "i" dù em í vẫn chạy đến Sqr(n), cũng bớt được ....tí xăng
Trong bài của bạn phihndhsp dữ liệu đưa ra chỉ những số "bé tí tẹo", chứ nếu gặp số "bự chá bá lửa" thì căn bậc 2 cũng "bự chà bá", em "i" chạy cũng mỏi chân chứ nhỉ ???
Hông biết phải hông nữa, chỉ là cảm giác của riêng mình.
Híc
 
Nhưng, hôm nay đọc báo thấy xăng có thể tăng giá mạnh, mình đọc lại code này:
Mã:
End Function
Mình có cảm giác nếu chỉnh code lại tí tẹo thì có thể giảm bớt số vòng chạy cho em "i" dù em í vẫn chạy đến Sqr(n), cũng bớt được ....tí xăng
Trong bài của bạn phihndhsp dữ liệu đưa ra chỉ những số "bé tí tẹo", chứ nếu gặp số "bự chá bá lửa" thì căn bậc 2 cũng "bự chà bá", em "i" chạy cũng mỏi chân chứ nhỉ ???
Hông biết phải hông nữa, chỉ là cảm giác của riêng mình.
Híc

Tham gia 1 miếng cho vụ xăng tăng giá, tiết kiệm nửa đường. Ai tiết kiệm hơn nữa thì tham gia.

Thay
Mã:
    For i = 2 To Sqr(n)
        If (n Mod i = 0) Then
              Tam = False
              Exit For
         End If
     Next
bằng:
Mã:
    If n mod 2 =0 then KTNT = False   : Exit Function
    For i = 3 to Sqr(n) Step 2
        If (n Mod i = 0) Then
              Tam = False
              Exit For
         End If
     Next

Có thể sai nha. Ai tìm ra chỗ sai, có thưởng
 
Lần chỉnh sửa cuối:
Bài 82 em đã tiết kiệm như vậy rồi.
 
Tham gia 1 miếng cho vụ xăng tăng giá, tiết kiệm nửa đường. Ai tiết kiệm hơn nữa thì tham gia.

Thay
Mã:
    For i = 2 To Sqr(n)
        If (n Mod i = 0) Then
              Tam = False
              Exit For
         End If
     Next
bằng:
Mã:
    If n mod 2 =0 then KTNT = False   : Exit Function
    For i = 3 to Sqr(n) Step 2
        If (n Mod i = 0) Then
              Tam = False
              Exit For
         End If
     Next

Có thể sai nha. Ai tìm ra chỗ sai, có thưởng

Thầy "chơi" kiểu này nó chạy còn mệt hơn nữa chứ. Thầy phải loại n là số chẵn đã
Hình như vẫn còn tiết kiệm được ...tí tí nữa
Híc
 
Thầy "chơi" kiểu này nó chạy còn mệt hơn nữa chứ. Thầy phải loại n là số chẵn đã
Hình như vẫn còn tiết kiệm được ...tí tí nữa
Híc

Loại số chẵn goài. (If n mod 2 =0 then KTNT = False : Exit Function)

Mệt chỗ nào, Cò nói nghe thử? Hỏng lẽ step 2 mệt hơn step 1?
 
Tham gia 1 miếng cho vụ xăng tăng giá, tiết kiệm nửa đường. Ai tiết kiệm hơn nữa thì tham gia.

Thay
Mã:
    For i = 2 To Sqr(n)
        If (n Mod i = 0) Then
              Tam = False
              Exit For
         End If
     Next
bằng:
Mã:
    If n mod 2 =0 then KTNT = False   : Exit Function
    For i = 3 to Sqr(n) Step 2
        If (n Mod i = 0) Then
              Tam = False
              Exit For
         End If
     Next

Có thể sai nha. Ai tìm ra chỗ sai, có thưởng
Lệnh Exit function ở vị trí đó làm hàm luôn thoát mà không cần n mod 2 =0. Bác cần thêm End If nữa.
 
Loại số chẵn goài. (If n mod 2 =0 then KTNT = False : Exit Function)

Mệt chỗ nào, Cò nói nghe thử? Hỏng lẽ step 2 mệt hơn step 1?
Hihi,thì mình nói Thầy phải loại n là số chẵn ra xong mới nhảy cà tưng được, ( code trên hông có) nếu không, gặp n chẵn, em "i" cứ nhảy từ 3, tới 5, tới 7 ........rồi...."tèo" ==> kết quả ?????
Vẫn (có thể) còn tiết kiệm được....tí nữa, nếu tới 23 giờ 37 phút Thầy tìm ra được, mình sẽ đãi Thầy .....một tô bún bò rất Huế
Híc
Hihi, đọc lại mới thấy If n mod 2 =0 then. Híc ( chắc mới thêm vào, chứ hồi nãy hông thấy)
 
Lần chỉnh sửa cuối:
Thầy "chơi" kiểu này nó chạy còn mệt hơn nữa chứ. Thầy phải loại n là số chẵn đã
Hình như vẫn còn tiết kiệm được ...tí tí nữa
Híc
Em có phương pháp này, có thể sẽ tiết kiệm được thời gian nhưng chỉ dùng khi n khá lớn, đó là dùng sàng Eratosten (không biết viết thế này đúng không, nghe cứ như người Hy Lạp). Phương pháp sàng để tìm tất cả các số nguyên tố từ 2 đến m: lấy số 2 là nguyên tố, loại các bội số của 2, số nhỏ nhất còn lại (3) là số nguyên tố, loại các bội số của 3.... cứ như vậy ta lấy hết các số nguyên tố từ 2 đến m.
Để tìm n có phải là SNT không, đặt m=INT(SQR(n)), cứ mỗi lần tìm được 1 SNT bằng sàng, ta lại kiểm tra xem n có chia hết cho số đó không, nếu không thì loại các bội số của SNT đó để lấy SNT tiếp theo: kiểm tra xem n mod 2 =0 hay không, nếu >0 thì loại các bội của 2; được SNT 3, kiểm tra xem n mod 3 = 0, nếu >0 thì loại các bội số của 3...
 
Lần chỉnh sửa cuối:
Lệnh Exit function ở vị trí đó làm hàm luôn thoát mà không cần n mod 2 =0. Bác cần thêm End If nữa.
Đó là chỗ sai mà mình ghi chú. Cám ơn bạn.

Hihi, đọc lại mới thấy If n mod 2 =0 then. Híc ( chắc mới thêm vào, chứ hồi nãy hông thấy)

Lão chết tiệt hỏng bao giờ ăn gian. Cò coi giờ lão chết tiệt edit bài và giờ Cò post bài sẽ thấy.
 
Bài tập về Do. . .Loop; Chỉ dành cho thành viên dưới 300 bài!

Mình có dữ liệu liệt kê giá cổ fiếu theo các ngày như trong hình & trong file đính kèm;
Các bạn thuộc diện nêu trên viết giúp một macro để sao cho:

Nếu cổ fiếu 1 ngày nào đó thấp dưới 90% thì ghi dấu lại (bằng số 1 hay gì khác) vô cột [D:D]
(Còn nếu không fải vậy thì ghi số 0)

Và quá trình này tiếp tục xuống các ngày dưới với số liệu mới bằng 90% số liệu vừa mới tìm được

Chúc các bạn thành công!
 

File đính kèm

  • Cổ fiếu.JPG
    Cổ fiếu.JPG
    45.6 KB · Đọc: 17
  • gpeBaiTap.rar
    13.8 KB · Đọc: 19
Nếu cổ fiếu 1 ngày nào đó thấp dưới 90% thì ghi dấu lại (bằng số 1 hay gì khác) vô cột [D:D]
(Còn nếu không fải vậy thì ghi số 0)

Em nộp bài và hóng tiếp

PHP:
Public Sub Check()
Dim i As Long
i = 2
Cells(2, 4) = 0
Do
    Cells(i + 1, 4) = 0
    If Cells(i + 1, 2) <= Cells(i, 2) * 0.9 Then Cells(i + 1, 4) = 1
    i = i + 1
Loop Until Cells(i + 1, 2) = ""
End Sub
 
Những bài tiếp theo học ở đâu vậy bạn ? Ở bài học tạo sổ chi tiết mình làm theo, nhưng mà sao khi mình click chọn tài khoản khác thì bảng bên dưới k tự động chạy theo vậy ?
Cảm ơn bạn !}}}}}
 
kính gởi các bạn mới tập tành vba, tôi có một bài tập viết code vba cho sumif
các bạn cho ý kiến nha
Mã:
Public Sub GPE()
Dim Dic As Object, sArr, v As Variant, I, Q As Long, key As String
Set Dic = CreateObject("Scripting.Dictionary")
[D5:D60000].ClearContents
sArr = Range([b5], [b5].End(xlDown)).Resize(, 3).Value2

For I = 1 To UBound(sArr, 1)
    key = sArr(I, 1)
    If Not Dic.Exists(key) Then
        Dic.Add key, I
        sArr(I, 3) = sArr(I, 2)
    Else
        Dic.Item(key) = Dic.Item(key) & "@" & I
        Q = sArr(Split(Dic.Item(key), "@")(0), 3)
        For Each v In Split(Dic.Item(key), "@")
           sArr(v, 3) = Q + sArr(I, 2)
        Next
    End If
Next I


[b5].Resize(I - 1, 3) = sArr
Set Dic = Nothing
End Sub
 

File đính kèm

  • CODE SUMIF.xlsm
    19.8 KB · Đọc: 18
Web KT
Back
Top Bottom