Kiểm tra nếu tệp A.xls tồn tại trong cùng thư mục thì mới chạy đoạn code (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

titanic20072007

Thành viên thường trực
Tham gia
10/7/07
Bài viết
217
Được thích
8
Nghề nghiệp
Giáo viên
Sub CapNhat()
Dim rs As New ADODB.Recordset
Dim i, r As Integer
Set cnn = New ADODB.Connection
r = Range("A65000").End(xlUp).Row
With cnn
.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & ThisWorkbook.Path & "\" & Range("F1").Value & ".xls;Extended Properties=Excel 8.0;"
.CursorLocation = adUseClient
.Open
End With
Set rs = Nothing
rs.Open "Select * from [UP$]", cnn, 1, 3
For i = 2 To r
With rs
.AddNew
![MA_SP] = Range("A" & i).Value
!TEN_SP = Range("B" & i).Value
!SL_SP = Range("C" & i).Value
!bbbb = Range("D" & i).Value
!ccc = Range("G" & i).Value
.Update
End With
Next
Range("A2:D65000").ClearContents
Set rs = Nothing
cnn.Close
Set cnn = Nothing
End Sub
Mình đọc và thấy được đoạn code cập nhật dữ liệu từ một tệp sang tệp khác và định sử dụng cho công việc của mình nhưng có một vấn đề nhỏ là: Mình muốn kiểm tra xem tệp A.xls là tệp được cập nhật dữ liệu từ tệp chứa code trên xem có tồn tại hay không nếu có thì mới chạy code trên để cập nhật cong không thì thôngbaos là tệp chứ có hoạt thoát luôn không chạy code. Mong các bạn bổ sung giúp.
 
Bạn thử đoạn code sau xem có được không. Chú ý là WbName phải có phần mở rộng. Ví dụ: A.xls hoặc B.xlsx hoặc C.xlsm

Public Function FileExist(WbName As String) As Boolean

Dim FldrPath As String

On Error Resume Next

FldrPath = ThisWorkbook.Path & IIf(Right(ThisWorkbook.Path, 1) = "\", "", "\") & WbName

FileExist = Not CBool(Dir(FldrPath) = "")

End Function
 
Upvote 0
Ban thêm code này thử nha, nếu mở file A.xls để cập nhật mà file này không tồn tại trong thư mục hiện hành thì sẽ xuất hiện thông báo và không chạy tiếp code còn lại

On Error GoTo thoat
Workbooks.Open ThisWorkbook.Path & "\A.xls"
thoat: MsgBox "File does not exist"
End
 
Upvote 0
Ban thêm code này thử nha, nếu mở file A.xls để cập nhật mà file này không tồn tại trong thư mục hiện hành thì sẽ xuất hiện thông báo và không chạy tiếp code còn lại

On Error GoTo thoat
Workbooks.Open ThisWorkbook.Path & "\A.xls"
thoat: MsgBox "File does not exist"
End
Người ta dùng ADO mà bạn lại mở file để kiểm tra... Nếu không bị lỗi gì, tức mở được file thì cần quái gì dùng ADO, lúc đó ta copy dữ liệu từ file nguồn luôn cho rồi
-----------------------
Bạn thử đoạn code sau xem có được không. Chú ý là WbName phải có phần mở rộng. Ví dụ: A.xls hoặc B.xlsx hoặc C.xlsm

Public Function FileExist(WbName As String) As Boolean

Dim FldrPath As String

On Error Resume Next

FldrPath = ThisWorkbook.Path & IIf(Right(ThisWorkbook.Path, 1) = "\", "", "\") & WbName

FileExist = Not CBool(Dir(FldrPath) = "")

End Function
Đúng là cần phải có 1 hàm kiểm tra nhưng code không phải viết như vậy!
PHP:
Function FileExists(ByVal flePath As String) As Boolean
  Application.Volatile
  FileExists = CreateObject("Scripting.FileSystemObject").FileExists(flePath)
End Function
 
Upvote 0
Người ta dùng ADO mà bạn lại mở file để kiểm tra... Nếu không bị lỗi gì, tức mở được file thì cần quái gì dùng ADO, lúc đó ta copy dữ liệu từ file nguồn luôn cho rồi
-----------------------

Đúng là cần phải có 1 hàm kiểm tra nhưng code không phải viết như vậy!
PHP:
Function FileExists(ByVal flePath As String) As Boolean
  Application.Volatile
  FileExists = CreateObject("Scripting.FileSystemObject").FileExists(flePath)
End Function

Bạn có thể hướng dẫn cách sử dụng hàm trên với thủ tục cập nhật dữ liệu trên như thế nào đi mình đang học VB nên chưa hiểu lắm.
 
Upvote 0
Bạn có thể hướng dẫn cách sử dụng hàm trên với thủ tục cập nhật dữ liệu trên như thế nào đi mình đang học VB nên chưa hiểu lắm.
Thì đơn giản thôi mà
File bạn cần kiểm tra là: ThisWorkbook.Path & "\" & Range("F1").Value & ".xls, đúng không? Vậy thì lồng vào hàm của tôi mà xài thôi. Ví dụ
PHP:
Dim flePath as String
flePath = ThisWorkbook.Path & "\" & Range("F1").Value & ".xls
If Not(FileExists(flePath)) then Exit Sub
''......
''......
With cnn
.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & flePath & ";Extended Properties=Excel 8.0;"
.CursorLocation = adUseClient
.Open
End With
''................
Đại khái thế!
Lưu ý thêm: Code mà bạn sưu tầm chỉ chạy được trên Excel 2003 thôi nha ---> Sang máy khác người ta dùng Excel 2007 hoặc Excel 2010 thì.. tèo
 
Upvote 0
Code mà bạn sưu tầm chỉ chạy được trên Excel 2003 thôi nha ---> Sang máy khác người ta dùng Excel 2007 hoặc Excel 2010 thì.. tèo

Vậy để đoạn code trên chạy được trên cả office 2003, 2007, 2010 thì phải chỉnh lại như thế nào? Bạn giúp mình với. Cảm ơn.
 
Upvote 0
Vậy để đoạn code trên chạy được trên cả office 2003, 2007, 2010 thì phải chỉnh lại như thế nào? Bạn giúp mình với. Cảm ơn.
Với Excel 2003 thì:
.ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & flePath & ";Extended Properties=Excel 8.0;"
Với Excel 2007 thì:
.ConnectionString = "Provider= Microsoft.ACE.OLEDB.12.0;Data Source=" & flePath & ";Extended Properties=Excel 12.0;"
Để biết version của Office ta dùng Val(Application.Version)
Vậy ta có thể dùng phát biểu IF như sau:
Mã:
If Val(Application.Version) < 12 Then
  .ConnectionString = "Provider= Microsoft.Jet.OLEDB.4.0; data source=" & flePath & ";Extended Properties=Excel 8.0;"
Else
  .ConnectionString = "Provider= Microsoft.ACE.OLEDB.12.0;Data Source="  & flePath & ";Extended Properties=Excel 12.0;"
End If
Đại khái thế ---> Bạn tự mình "ráp" vào code mà xài nhé
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn mình đã thử và thấy ok. Với office 2010 thì vẫn chạy đc chứ? Mình chưa thử với 2010.
 
Lần chỉnh sửa cuối:
Upvote 0
đối vơi excel 2010 thì bạn thử thay số 12 thành 14 xem sao
 
Upvote 0
Sao mình copy đoạn code sang một tệp khác khi chạy nó thông báo untitled.JPG có phải là do chưa khai báo gì đó không? Cách xử lý như thế nào mong các bạn chỉ giúp. Cảm ơn.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Sao mình copy đoạn code sang một tệp khác khi chạy nó thông báo có phải là do chưa khai báo gì đó không? Cách xử lý như thế nào mong các bạn chỉ giúp. Cảm ơn.

Bạn thử vào Tools, chọn References, dò tìm cái Microsoft ActiveX Data Objects x.x Library thử xem được không nhé.
Thân mến.
 
Upvote 0
PHP:
Function FileExists(ByVal flePath As String) As Boolean
  Application.Volatile
  FileExists = CreateObject("Scripting.FileSystemObject").FileExists(flePath)
End Function

Lâu lâu đi tìm bài cũ để đọc, tự nhiên thấy bài này, vấn đề là trong hàm trên có câu lệnh Application.Volatile.

Nếu không có nó vẫn thực thi hàm, vậy dùng nó để cho mục đích gì? Làm ơn cho biết cách thức để biết nó làm việc như thế nào.

Cám ơn.
 
Upvote 0
Lâu lâu đi tìm bài cũ để đọc, tự nhiên thấy bài này, vấn đề là trong hàm trên có câu lệnh Application.Volatile.

Nếu không có nó vẫn thực thi hàm, vậy dùng nó để cho mục đích gì? Làm ơn cho biết cách thức để biết nó làm việc như thế nào.

Cám ơn.
Anh xem thử file này coi sao, mình cũng muốn tìm hiểu vấn đề này.
 

File đính kèm

Upvote 0
Lâu lâu đi tìm bài cũ để đọc, tự nhiên thấy bài này, vấn đề là trong hàm trên có câu lệnh Application.Volatile.

Nếu không có nó vẫn thực thi hàm, vậy dùng nó để cho mục đích gì? Làm ơn cho biết cách thức để biết nó làm việc như thế nào.

Cám ơn.

Nếu chỉ dùng hàm bên trong các sub thì khỏi cần lệnh trên.
Nếu dùng hàm để gõ trực tiếp trên bảng tính thì ta cần nó tự cập nhật khi có thay đổi.. và Application.Volatile là thứ chuyên dùng cho vụ tự cập nhật này
Thế thôi
(chúng ta thường dùng lệnh trên khi đếm màu sắc chẳng hạn)
 
Upvote 0
Xin nói thêm lệnh này như phím F9, khi thực hiện các hàm tính toán trên bảng tính (UDF) nó sẽ không tự động cập nhật việc tính toán mỗi khi có thay đổi. Nếu thêm Application.Volatile vào thì nó sẽ tự động cập nhật và tính toán mỗi khi có thay đổi.
 
Upvote 0
Xin nói thêm lệnh này như phím F9.
Hổng phải nha!
Không phải là như phím F9 mà lệnh ấy giúp cho phím F9 có tác dụng... không có nó, bấm phím F9 cũng như không (và ngược lại)
Ví dụ: Với hàm đếm màu, có dòng Application.Volatile ở đầu code thì cũng không phải là hàm sẽ tự cập nhật ngay khi có thay đổi (về màu sắc) mà phải bấm F9... Ngược lại, không có Application.Volatile thì dù có F9 cũng như không
 
Upvote 0
Theo em được biết Application.volatile dùng để cập nhật giá trị cho Hàm cụ thể như sau :
* Nếu có Ap.volatile --> Hàm sẽ chỉ cập nhật khi các giá trị tham biến trong hàm thay đổi
* Ngược lại nếu không có Ap.volatile -> hàm sẽ tự động cập nhật khi một giá trị bất kỳ trên bảng tính thay đổi

** Ví dụ :
PHP:
Function Func3(rng1 As Range, rng2 As Range)   
 Func3 = rng1 * rng2End 
Function

Nếu viết như trên : nếu rng1 và rng2 thay đổi thì func3 sẽ thay đổi,

^^********* Chúc GPE một buổi sáng tốt lành ******

 
Upvote 0
Hổng phải nha!
Không phải là như phím F9 mà lệnh ấy giúp cho phím F9 có tác dụng... không có nó, bấm phím F9 cũng như không (và ngược lại)
Ví dụ: Với hàm đếm màu, có dòng Application.Volatile ở đầu code thì cũng không phải là hàm sẽ tự cập nhật ngay khi có thay đổi (về màu sắc) mà phải bấm F9... Ngược lại, không có Application.Volatile thì dù có F9 cũng như không

Em biết chứ. Em chỉ ví dụ như hàm sẵn có ở excel khi mình chọn tính toán là không tự động cập nhật trong option ấy. Nếu không đưa Application.Volatile vào thì như chọn trong option với hàm sẵn có là không tự động tính toán.
 
Upvote 0

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

Back
Top Bottom