Chuyên mục xử lý, gỡ rối code VBA

Liên hệ QC
Status
Không mở trả lời sau này.

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,930
Bạn có code rồi thì cứ chạy thử 1, rồi 2, rồi 3 files xem sao.
Nếu không chạy được thì cho biết còn vướng chỗ nào.
 
Upvote 0
Bạn có code rồi thì cứ chạy thử 1, rồi 2, rồi 3 files xem sao.
Nếu không chạy được thì cho biết còn vướng chỗ nào.

Cảm ơn Anh.Hiện tại Em chạy ổn.
Em muốn tìm 01 giải pháp để làm nhanh hơn, hiện tại số lượng file của em lớn, tầm 300 file rồi.
 
Upvote 0
Copy file vào file là trường hợp cực chẳng đã, không phải là công việc thường xuyên và có tính chất lâu dài.
Miễn nó hoạt động đúng là được rồi, đâu cần phải nhanh.

Nếu việc copy data trở thành công việc thường xuyên thì phải xem lại quy trình làm việc của cty. Có thể dùng phương pháp khác sẽ dễ kiểm soát hơn.
Cứ vài ngày mà phải copy 300 files thì hơi lãng phí.
Nếu là tôi thì thử thí nghiệm cách nhận data theo dạng csv, append chúng vào thành 1 file rồi import vào file tổng. Import xuyên qua Access cũng là 1 cách kiểm soát tốt.
 
Upvote 0
Nhờ các thầy và các anh chỉnh sửa lại code giúp cho em với ạ.
- Khi Enter thì thời gian chạy không có vấn đề gì. Nhưng thời gian chạy lùi không chạy hẳn về "0:00" mà chỉ đến "0:01" rồi đánh chuông và chuyển sang thời gian nghỉ. Kể cả thời gian nghỉ chạy lùi cũng vậy, về đến "0:01" là đã đánh chuông rồi mà không phải là về hẳn "0:00". Do vậy mà thời gian nó như kiểu bị trễ giây ý ạ, và lúc chuyển sang thời gian nghỉ giữa hiệp nó cũng bị mất đi 1s đầu ạ.
---> Chỉnh lại giúp em là: Khi thời gian chạy lùi về "0:00" thì mới đánh chuông (Cả Thời gian thi đấu lẫn Thời gian nghỉ giữa hiệp), sau đó mới chuyển sang sự kiện tiếp theo.
Em cảm ơn ạ.
 

File đính kèm

  • Bang thi dau.rar
    429.9 KB · Đọc: 11
Upvote 0
Các thầy và các anh có giải pháp gì không ạ?
 
Upvote 0
Nhờ các thầy và các anh chỉnh sửa lại code giúp cho em với ạ.
- Khi Enter thì thời gian chạy không có vấn đề gì. Nhưng thời gian chạy lùi không chạy hẳn về "0:00" mà chỉ đến "0:01" rồi đánh chuông và chuyển sang thời gian nghỉ. Kể cả thời gian nghỉ chạy lùi cũng vậy, về đến "0:01" là đã đánh chuông rồi mà không phải là về hẳn "0:00". Do vậy mà thời gian nó như kiểu bị trễ giây ý ạ, và lúc chuyển sang thời gian nghỉ giữa hiệp nó cũng bị mất đi 1s đầu ạ.
---> Chỉnh lại giúp em là: Khi thời gian chạy lùi về "0:00" thì mới đánh chuông (Cả Thời gian thi đấu lẫn Thời gian nghỉ giữa hiệp), sau đó mới chuyển sang sự kiện tiếp theo.
Em cảm ơn ạ.
Chả hiểu chi nữa, thử sửa cái này xem có đúng không?

Mã:
Private Sub DisplayTimer()
Dim i As Long
If Not Pause Then
    If Min = 0 And Sec <= 0 Then
 
Upvote 0
Chả hiểu chi nữa, thử sửa cái này xem có đúng không?

Mã:
Private Sub DisplayTimer()
Dim i As Long
If Not Pause Then
    If Min = 0 And Sec <= 0 Then
Hihi. Cảm ơn ạ. Chạy lùi về 0:00 ổn rồi ạ. Chỉ còn phần thời gian nghỉ giữa hiệp bị trễ mất 1s lúc đầu thôi ạ. Tiếp tục nhờ trợ giúp của mọi người.
 
Lần chỉnh sửa cuối:
Upvote 0
Xin chào các bạn. Cho mình hỏi: Mình viết 1 code sau, và cho vào thành addin
  1. Sub Auto_open()
  2. On Error Resume Next
  3. Dim i As Long, Tenfile as String
  4. i = Workbooks.Count
  5. Tenfile = Workbooks(i).Name
  6. If Right(Tenfile, 3) = "xls" Then
  7. MsgBox "HE THONG KHONG HO TRO MO DINH DANG FILE NAY"
  8. Workbooks(i).Close Save = False
  9. End If
  10. End Sub
Mục đích: Mỗi khi mở từ file thứ 2 trở đi. mà mở file Excel có đuôi là xls (Định dạng 2003), thì sẽ không cho mở. Nhưng không hiểu sao Addin không tự động chạy mặc dù là Auto_open. Vậy có cách nào khác không, hay code bị lỗi đoạn nào vậy. Mình cảm ơn
 
Upvote 0
Xin chào các bạn. Cho mình hỏi: Mình viết 1 code sau, và cho vào thành addin
  1. Sub Auto_open()
  2. On Error Resume Next
  3. Dim i As Long, Tenfile as String
  4. i = Workbooks.Count
  5. Tenfile = Workbooks(i).Name
  6. If Right(Tenfile, 3) = "xls" Then
  7. MsgBox "HE THONG KHONG HO TRO MO DINH DANG FILE NAY"
  8. Workbooks(i).Close Save = False
  9. End If
  10. End Sub
Mục đích: Mỗi khi mở từ file thứ 2 trở đi. mà mở file Excel có đuôi là xls (Định dạng 2003), thì sẽ không cho mở. Nhưng không hiểu sao Addin không tự động chạy mặc dù là Auto_open. Vậy có cách nào khác không, hay code bị lỗi đoạn nào vậy. Mình cảm ơn
Code AddIn kiểu này chắc chắn không hoạt động, bởi Sub Auto_Open chỉ chạy 1 lần duy nhất khi kích hoạt AddIn mà thôi, và code sẽ không "nhìn" thấy được các file mở sau đó
Muốn làm được yêu cầu trên phải dùng Class. Quy trình như sau:
1> Chèn 1 Class Module, đặt tên là clsWkbEvents
Code trong Class Module:
Mã:
Public WithEvents ExlApp As Application
Private Sub Class_Initialize()
  Set ExlApp = Application
End Sub
Private Sub Class_Terminate()
  Set ExlApp = Nothing
End Sub
Private Sub ExlApp_WorkbookOpen(ByVal Wb As Workbook)
  If UCase(Right(Wb.FullName, 3)) = "XLS" Then
    MsgBox "HE THONG KHÔNG HO TRO MO DINH DANG FILE NÀY"
    Wb.Close False
  End If
End Sub
2> Chèn 1 Module đặt tên tùy ý, với code:
Mã:
Dim ExlObj As New clsWkbEvents
Sub Auto_Open()
  If ExlObj Is Nothing Then Set ExlObj = New clsWkbEvents
End Sub
Sub Auto_Close()
  Set ExlObj = Nothing
End Sub
Giờ Save As file thành XLAM, kích hoạt AddIn và test thử
 
Upvote 0
Code AddIn kiểu này chắc chắn không hoạt động, bởi Sub Auto_Open chỉ chạy 1 lần duy nhất khi kích hoạt AddIn mà thôi, và code sẽ không "nhìn" thấy được các file mở sau đó
Muốn làm được yêu cầu trên phải dùng Class. Quy trình như sau:
1> Chèn 1 Class Module, đặt tên là clsWkbEvents
Code trong Class Module:
Mã:
Public WithEvents ExlApp As Application
Private Sub Class_Initialize()
  Set ExlApp = Application
End Sub
Private Sub Class_Terminate()
  Set ExlApp = Nothing
End Sub
Private Sub ExlApp_WorkbookOpen(ByVal Wb As Workbook)
  If UCase(Right(Wb.FullName, 3)) = "XLS" Then
    MsgBox "HE THONG KHÔNG HO TRO MO DINH DANG FILE NÀY"
    Wb.Close False
  End If
End Sub
2> Chèn 1 Module đặt tên tùy ý, với code:
Mã:
Dim ExlObj As New clsWkbEvents
Sub Auto_Open()
  If ExlObj Is Nothing Then Set ExlObj = New clsWkbEvents
End Sub
Sub Auto_Close()
  Set ExlObj = Nothing
End Sub
Giờ Save As file thành XLAM, kích hoạt AddIn và test thử

Đụng đến "Class Module" thì e chỉ bít Copy và Paste chứ chưa thể hiểu được. Addin chạy ngon lành. Cảm ơn thầy nhiều. Chúc thầy buổi chiều vui vẻ :)
 
Upvote 0
Code AddIn kiểu này chắc chắn không hoạt động, bởi Sub Auto_Open chỉ chạy 1 lần duy nhất khi kích hoạt AddIn mà thôi, và code sẽ không "nhìn" thấy được các file mở sau đó
Muốn làm được yêu cầu trên phải dùng Class. Quy trình như sau:
1> Chèn 1 Class Module, đặt tên là clsWkbEvents
Code trong Class Module:
Mã:
Public WithEvents ExlApp As Application
Private Sub Class_Initialize()
  Set ExlApp = Application
End Sub
Private Sub Class_Terminate()
  Set ExlApp = Nothing
End Sub
Private Sub ExlApp_WorkbookOpen(ByVal Wb As Workbook)
  If UCase(Right(Wb.FullName, 3)) = "XLS" Then
    MsgBox "HE THONG KHÔNG HO TRO MO DINH DANG FILE NÀY"
    Wb.Close False
  End If
End Sub
2> Chèn 1 Module đặt tên tùy ý, với code:
Mã:
Dim ExlObj As New clsWkbEvents
Sub Auto_Open()
  If ExlObj Is Nothing Then Set ExlObj = New clsWkbEvents
End Sub
Sub Auto_Close()
  Set ExlObj = Nothing
End Sub
Giờ Save As file thành XLAM, kích hoạt AddIn và test thử
Thầy ơi, chưa lần nào thầy sửa giúp e cả. Hix..
 
Upvote 0
Xin chào các bạn. Cho mình hỏi: Mình viết 1 code sau, và cho vào thành addin
  1. Sub Auto_open()
  2. On Error Resume Next
  3. Dim i As Long, Tenfile as String
  4. i = Workbooks.Count
  5. Tenfile = Workbooks(i).Name
  6. If Right(Tenfile, 3) = "xls" Then
  7. MsgBox "HE THONG KHONG HO TRO MO DINH DANG FILE NAY"
  8. Workbooks(i).Close Save = False
  9. End If
  10. End Sub
Mục đích: Mỗi khi mở từ file thứ 2 trở đi. mà mở file Excel có đuôi là xls (Định dạng 2003), thì sẽ không cho mở. Nhưng không hiểu sao Addin không tự động chạy mặc dù là Auto_open. Vậy có cách nào khác không, hay code bị lỗi đoạn nào vậy. Mình cảm ơn
Dán đoạn code này vào thisworkbook là được.

Mã:
Dim WithEvents app As Excel.Application


Private Sub app_WorkbookOpen(ByVal Wb As Workbook)
    On Error Resume Next
   
    If Application.Workbooks.Count >= 2 Then
        If Strings.UCase(Strings.Right$(Wb.Name, 3)) = "XLS" Then
            MsgBox "He thong khong ho tro loai file nay"
            Wb.Close False
           
        End If
    End If
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    'Set app = Nothing
End Sub

Private Sub Workbook_Open()
    Set app = Application
End Sub
 
Upvote 0
Dán đoạn code này vào thisworkbook là được.

Mã:
Dim WithEvents app As Excel.Application


Private Sub app_WorkbookOpen(ByVal Wb As Workbook)
    On Error Resume Next
  
    If Application.Workbooks.Count >= 2 Then
        If Strings.UCase(Strings.Right$(Wb.Name, 3)) = "XLS" Then
            MsgBox "He thong khong ho tro loai file nay"
            Wb.Close False
          
        End If
    End If
End Sub

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    'Set app = Nothing
End Sub

Private Sub Workbook_Open()
    Set app = Application
End Sub

Bạn ơi. Vấn đề là cái workbook mà đuôi xls, đâu pải là của mình. Nên phải tạo addin đó bạn. Chứ dán vào ThisWorkBook đâu có tác dụng j đâu
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT
Back
Top Bottom