Lỗi "argument not optional" khi chạy code

Liên hệ QC

Thanh Bình PV

Thành viên hoạt động
Tham gia
30/10/19
Bài viết
151
Được thích
19
Em chào mọi người,

Em có xem trên mạng và sửa lại 1 code để sao lưu dữ liệu theo thời gian.
Nhưng khi sử dụng thì bị lỗi "argument not optional". Bác nào giúp em chỉnh code lại với ạ. Và giải thích cho em tại sao bị lỗi này càng tốt ạ.
Em tìm thử trên mạng nhưng biết sửa sao cả.

Em cảm ơn.

1597489499558.png
Mã:
Option Explicit
Dim SchTime As Variant
Mã:
Sub AutoBackup(control As IRibbonControl)
    Dim FileExtStr  As String
    Dim FileFormatNum As Long
    Dim xWs         As Worksheet
    Dim xWb         As Workbook
    Dim FSO         As Object
    Dim MyFiles     As Object
    Dim MyPath      As String
    Dim Check_File  As String
    Dim i           As Integer
    Dim thongbao    As String
    
    Application.ActiveWorkbook.Save
    
    MyPath = ActiveWorkbook.Path & "\Backup"        '<< Duong dan thu muc Import

    If Right(MyPath, 1) = "\" Then
        MyPath = Left(MyPath, Len(MyPath) - 1)
    End If
    
    Set FSO = CreateObject("scripting.filesystemobject")
    On Error Resume Next
    Set MyFiles = FSO.GetFolder(MyPath).Files
    On Error GoTo 0
    If FSO.FolderExists(MyPath) = False Then
        thongbao = "duong dan backup da duoc tao tai duong dan sau:" & vbLf & MyPath

        Dim FolderName As String
        Application.ScreenUpdating = False
        Set xWb = Application.ActiveWorkbook
        FolderName = xWb.Path & "\" & "Backup"        '& DateString
        FSO.CreateFolder (FolderName)
        
        Application.Assistant.DoAlert "Thanh Binh PV", thongbao, 0, 4, 0, 0, 0
        
        i = 1
        ActiveWorkbook.SaveCopyAs ActiveWorkbook.Path & "\Backup\" & _
                                Left(ActiveWorkbook.name, Len(ActiveWorkbook.name) - 5) & " - " & Format(Date, "dd.mm.yyyy") & " - (" & i & ")" & ".xlsm"
    Else
        i = MyFiles.Count + 1
        Check_File = ActiveWorkbook.Path & "\Backup\" & _
                Left(ActiveWorkbook.name, Len(ActiveWorkbook.name) - 5) & " - " & Format(Date, "dd.mm.yyyy") & " - (" & i & ")" & ".xlsm"

        Do While FileExists(Check_File) = True
            i = i + 1
            Check_File = ActiveWorkbook.Path & "\Backup\" & _
                     Left(ActiveWorkbook.name, Len(ActiveWorkbook.name) - 5) & " - " & Format(Date, "dd.mm.yyyy") & " - (" & i & ")" & ".xlsm"
        Loop
        
        ActiveWorkbook.SaveCopyAs Check_File

    End If
    SchTime = Now + Sheet1.Range("A3").Value
    Application.OnTime SchTime, "AutoBackup"
End Sub
Mã:
'Kiem tra file da ton tai chua
Function FileExists(ByVal FName) As Boolean
' Tra ve TRUE neu file ton tai, không ton tai là FALSE
' fname là tên File bao gom ca tên duong dan
Dim x As String
    On Error GoTo TBLoiPath
    x = Dir(FName)
    If x <> "" Then FileExists = True Else FileExists = False
    Exit Function
TBLoiPath:
    FileExists = False
End Function
Mã:
Sub StopTime(control As IRibbonControl)
On Error Resume Next
Application.OnTime SchTime, "AutoBackup", , False
End Sub
 

File đính kèm

  • GPE - Backup.xlsm
    20.9 KB · Đọc: 6
Lỗi này là lỗi thiếu tham số. Bạn xem thử lỗi dòng nào rồi sửa lại.
 
Upvote 0
Lỗi này là lỗi thiếu tham số. Bạn xem thử lỗi dòng nào rồi sửa lại.
Khổ là em không biết tham số nào còn thiếu. Em chạy debug nhưng không ra lỗi ở dòng nào. Khi nó hiện cái bảng thì nhấn "OK" nhưng không có gì xảy ra mặc dù đã gắn breakpoint.
Anh hướng dẫn em cách tìm tham số còn thiếu với ạ.
 
Upvote 0
Khổ là em không biết tham số nào còn thiếu. Em chạy debug nhưng không ra lỗi ở dòng nào. Khi nó hiện cái bảng thì nhấn "OK" nhưng không có gì xảy ra mặc dù đã gắn breakpoint.
Anh hướng dẫn em cách tìm tham số còn thiếu với ạ.
Cái Sub AutoBackup của bạn có một tham số (control As IRibbonControl) trong khi bạn dùng lệnh.
Mã:
Application.OnTime SchTime, "AutoBackup"
Lúc này nó gọi lệnh AutoBackup lại không có tham số rồi lấy cái giống gì để chạy được. Cách khắc phục viết một cái sub và cho tất cả code trong AutoBackup sang cái sub mới này, trong AutoBackup gọi cái sub mới tạo. Còn cuỗi lệnh trong Sub mới này sửa lệnh AutoBackup trong
Mã:
Application.OnTime SchTime, "AutoBackup"
thành tên cái Sub mới tạo ấy.
 
Upvote 0
Cái Sub AutoBackup của bạn có một tham số (control As IRibbonControl) trong khi bạn dùng lệnh.
Mã:
Application.OnTime SchTime, "AutoBackup"
Lúc này nó gọi lệnh AutoBackup lại không có tham số rồi lấy cái giống gì để chạy được. Cách khắc phục viết một cái sub và cho tất cả code trong AutoBackup sang cái sub mới này, trong AutoBackup gọi cái sub mới tạo. Còn cuỗi lệnh trong Sub mới này sửa lệnh AutoBackup trong
Mã:
Application.OnTime SchTime, "AutoBackup"
thành tên cái Sub mới tạo ấy.
Tôi không thích dùng cái lệnh Ontime này nên không thích thử.
Nhưng thường thì những vấn đề này có thể đi vòng bằng cách đặt tham là Optional
 
Upvote 0
Tôi không thích dùng cái lệnh Ontime này nên không thích thử.
Nhưng thường thì những vấn đề này có thể đi vòng bằng cách đặt tham là Optional
Với một biến thông thường thì dùng cái Optional được anh, còn biến kiểu IRibbonControl dùng Optional sao đây anh? Nào giờ em chưa biết Optional control As IRibbonControl = ?, Chổ ? ghi cái gì đây anh? anh có thể cho em khai sáng chút đi ạ. Nếu chỉ sử dụng Optional control As IRibbonControl thôi thì nó vẫn chạy nhưng nếu trong cái Sub đó có dùng control nó sẽ báo lỗi ngay.
 
Lần chỉnh sửa cuối:
Upvote 0
Với một biến thông thường thì dùng cái Optional được anh, còn biến kiểu IRibbonControl dùng Optional sao đây anh? Nào giờ em chưa biết Optional control As IRibbonControl = ?, Chổ ? ghi cái gì đây anh? anh có thể cho em khai sáng chút đi ạ.
Đâu có cần phải cho nó là gì.
Nếu bên trong hàm cần nhắc đến nó thì dùng IsMissing để xét.
Nếu bạn thực sự muốn gán mặc định thì = Nothing (control là object nên mặc định là nothing chẳng ai phàn nàn cả)
 
Upvote 0
Đâu có cần phải cho nó là gì.
Nếu bên trong hàm cần nhắc đến nó thì dùng IsMissing để xét.
Nếu bạn thực sự muốn gán mặc định thì = Nothing (control là object nên mặc định là nothing chẳng ai phàn nàn cả)
Ok, em đã khai sáng được rồi, nào giờ chưa biết vụ này. 2 cách của anh đều chạy ngon, nào giờ toàn tạo thêm cái sub trung gian.
 
Upvote 0
Cái Sub AutoBackup của bạn có một tham số (control As IRibbonControl) trong khi bạn dùng lệnh.
...
Em đã làm được rồi ạ.

Tôi không thích dùng cái lệnh Ontime này nên không thích thử.
Nhưng thường thì những vấn đề này có thể đi vòng bằng cách đặt tham là Optional
Cho em hỏi có lệnh nào khác ngoài Ontime mà dùng tương tự như nó không ạ. Em cũng chỉ biết có mỗi Ontime thôi.

Thấy 2 anh giaiphap VetMini nói về cái tham số Optional không biết có ví dụ không ạ. Có thể cho em 1 ví dụ ngắn về nó không ạ.
 
Upvote 0
. . . . . . nói về cái tham số Optional không biết có ví dụ không ạ. Có thể cho em 1 ví dụ ngắn về nó không ạ.
PHP:
Sub Cha()
 Dim J As Long
 
 Randomize
 J = 9 + 9 * Rnd() \ 1
 If J Mod 2 = 0 Then
    GPE
 Else
    GPE False
 End If
End Sub
Mã:
Sub GPE(Optional W As Boolean = True)
 If W Then
    MsgBox 13 + 35
 Else
    MsgBox 35 - 13
 End If
End Sub
 
Upvote 0
Em đã làm được rồi ạ.
Thấy 2 anh giaiphap VetMini nói về cái tham số Optional không biết có ví dụ không ạ. Có thể cho em 1 ví dụ ngắn về nó không ạ.
Thêm Optional vào trước control trong Sub AutoBackup của bạn. Cụ thể là thế này.
Mã:
AutoBackup( Optional control As IRibbonControl)
Cái này chỉ áp dụng cho file này của bạn thôi nhé, còn file khác thì dùng khác nửa.
 
Upvote 0
Web KT

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

Back
Top Bottom