Copilot & VBA

  • Thread starter SA_DQ
  • Ngày gửi
S

SA_DQ

Thành viên Cố vấn - Webketoan Mentors
29/6/05
611
104
43
68
HCM city
Mình có 1 TextBox trên UserForm trong Excel được gán tên là tbDat Mình muốn có :
1./ Một macro để khi mở UserForm lên thì trên tbDat sẽ hiễn thị ngày hiện tại theo kiểu DD-mmm-yyyy
2./ Khi ta nhập vô tbDat chuỗi 1/9 thì một macro sẽ chuyển chuỗi này sang 1 tháng 9 năm hiện tại vẫn có dạng DD-mmm-yyyy
Copilot giúp mình hai vấn đề này với nha & rất cảm ơn bạn!

Copilot:
Chào bạn! Mình sẽ giúp bạn viết hai macro cho yêu cầu của bạn trong Excel VBA.

1. Macro để hiển thị ngày hiện tại khi mở UserForm​

Bạn có thể sử dụng sự kiện UserForm_Initialize để thiết lập giá trị cho tbDat khi UserForm được mở. Dưới đây là mã VBA cho yêu cầu này:
Mã:
Private Sub UserForm_Initialize()
    tbDat.Value = Format(Date, "DD-mmm-yyyy")
End Sub

2. Macro để chuyển chuỗi nhập vào thành ngày hiện tại​

Bạn có thể sử dụng sự kiện tbDat_AfterUpdate để chuyển đổi chuỗi nhập vào thành định dạng ngày mong muốn. Dưới đây là mã VBA cho yêu cầu này:
PHP:
Private Sub tbDat_AfterUpdate()
    Dim inputDate As String
    Dim formattedDate As String
    
    inputDate = tbDat.Value
    On Error Resume Next
    formattedDate = Format(DateValue(inputDate & "/" & Year(Date)), "DD-mmm-yyyy")
    On Error GoTo 0
    
    If IsDate(formattedDate) Then
        tbDat.Value = formattedDate
    Else
        MsgBox "Ngày nhập không hợp lệ. Vui lòng nhập lại.", vbExclamation
    End If
End Sub
 
Khóa học Quản trị dòng tiền
S

SA_DQ

Thành viên Cố vấn - Webketoan Mentors
29/6/05
611
104
43
68
HCM city
XYZ:
Bạn Copilot nhận xét giúp mình cách viết 1 macro VBA này nha:
PHP:
Sub Tao20SoNgauBeHon81() 
 Dim W As Integer, SoNgau As Integer 
 Dim Tmp As String
 For W = 1 To 80
    Tmp = Tmp & Right("0" & CStr(W), 2)
 Next W
 Randomize:                 ReDim Arr(1 To 1, 1 To 20)
 For W = 1 To 20
    SoNgau = 3 + 35 * Rnd() \ 1
    If SoNgau Mod 2 = 0 Then SoNgau = SoNgau + 1
    Arr(1, W) = Mid$(Tmp, SoNgau, 2)
    Tmp = Mid(Tmp, SoNgau + 2, Len(Tmp)) & Left(Tmp, SoNgau - 2)
 Next W
 [A3].Resize(, 20).Value = Arr()
End Sub

Copilot:
Chắc chắn rồi! Mình sẽ xem xét đoạn mã của bạn và đưa ra một số nhận xét:

Điểm mạnh:​

  • Đoạn mã của bạn hiệu quả trong việc tạo và gán các số ngẫu nhiên vào mảng mà không trùng lặp.
  • Bạn đã áp dụng các kỹ thuật định dạng chuỗi và xử lý số ngẫu nhiên một cách sáng tạo.

Gợi ý cải thiện:​

  • Giải thích thêm: Viết thêm ghi chú trong mã để giúp người khác (hoặc chính bạn trong tương lai) dễ dàng hiểu rõ từng bước của đoạn mã.
  • Tối ưu hóa: Mặc dù việc sử dụng Mid$ và việc di chuyển các phần tử trong chuỗi là hiệu quả, bạn có thể cân nhắc sử dụng các cấu trúc dữ liệu khác như mảng động hoặc danh sách để quản lý các số đã sử dụng, điều này có thể làm cho mã dễ đọc hơn và có thể dễ bảo trì hơn.
  • Xử lý lỗi: Kiểm tra và xử lý các tình huống bất thường (ví dụ: nếu Tmp không có đủ số lẻ để chọn) để đảm bảo mã của bạn luôn chạy trơn tru.
Hy vọng những nhận xét này hữu ích cho bạn! Nếu có thêm câu hỏi hoặc cần trợ giúp với bất kỳ điều gì khác, mình luôn sẵn sàng!
 
S

SA_DQ

Thành viên Cố vấn - Webketoan Mentors
29/6/05
611
104
43
68
HCM city
Hôm qua bạn đã giúp mình cách tìm ra các số nguyên tố; Nay bạn Copilot bình phẩm con macro này giúp mình nha:
PHP:
Sub FindPrimeNumbers()
  Dim N As Integer, CounT As Integer, primeCount As Integer
  Dim W As Integer, J As Integer 
 Dim isPrime As Boolean   
  Randomize  
J = 350 - 45 * Rnd() \ 1
  'Duyêt Qua Các So Tù J Dên 2  '
  For N = J To 2 Step -1  
    isPrime = True        ' Kiem Tra Xem N Có Phai Là Sô Nguyên Tô Không  '
        For W = Sqr(N) To 2 Step -1  
         If N Mod W = 0 Then 
             isPrime = False: 
            Exit For  
        End If
      Next W     
 ' Nêu n Là Sô Nguyên Tô, Tang Sô Dém lên 1    '   
   If isPrime Then           
       primeCount = primeCount + 1   
       Debug.Print N & "  " & primeCount            ' Néu Tim Thây 3 Sô Nguyên Tô Liên Tiêp '      
    If primeCount >= 3 Then      
        Exit Sub    
     End If  
    Else 
     ' primeCount = 0 '
     End If
  Next N
End Sub

Copilot:
Rất thú vị! Mình sẽ giúp bạn bình phẩm macro này nhé.

Bình Phẩm:​

  1. Tính ngẫu nhiên:
    • Sử dụng Randomize để tạo ra một số ngẫu nhiên từ 305-45 * Rnd(). Đây là một kỹ thuật thú vị để khởi đầu từ một số ngẫu nhiên khác nhau mỗi khi macro được chạy.
  2. Tính toán số nguyên tố:
    • Macro này lặp qua các số từ J đến 2 để kiểm tra xem liệu mỗi số có phải là số nguyên tố không.
    • Sử dụng vòng lặp For W = Sqr(N) To 2 Step -1 để kiểm tra các ước của số N từ căn bậc hai của N đến 2.
    • Nếu tìm thấy ước của N, đặt isPrime = False và thoát khỏi vòng lặp.
  3. In ra số nguyên tố và đếm:
    • Nếu số là nguyên tố, tăng biến đếm primeCount và in số nguyên tố cùng với số thứ tự của nó.
    • Nếu tìm thấy 3 số nguyên tố liên tiếp, thoát khỏi macro.
  4. Bình luận:
    • Dấu gạch chéo: Trong dòng J = 350 - 45 * Rnd() \ 1, dấu gạch chéo \ không hợp lý. Cần thay bằng Int hoặc Fix để lấy phần nguyên.
    • Đặt tên biến: Nên chọn tên biến dễ hiểu và mô tả rõ ràng hơn, ví dụ number thay vì N, và isPrime có thể là isPrimeNumber.

      Bạn có cần thêm điều gì về đoạn mã này không?
 

Xem nhiều