Làm sao khắc phục tình trạng file tạm có tên là ~$ khi mở 1 file excel

Liên hệ QC

Quang_Hải

Thành viên gạo cội
Tham gia
21/2/09
Bài viết
6,070
Được thích
7,994
Nghề nghiệp
Làm đủ thứ
Khi mở 1 file excel có đuôi là A.xls thì không có vấn đề gì, nhưng khi mở 1 file có đuôi là A.xlsx hoặc A.xlsm thì luôn xuất hiện 1 file tạm trong cùng thư mục mang tên ~$A.xlsm. Biết rằng file này tự mất đi khi ta đóng file chính, nhưng điều này ảnh hưởng đến việc chạy code tìm file để xử lý. Có anh chị nào biết cách không cho file này xuất hiện không?
Cho dù ta đang thiết lập chế độ Dont show hidden files vẫn không thể chạy code được
 
Khi mở 1 file excel có đuôi là A.xls thì không có vấn đề gì, nhưng khi mở 1 file có đuôi là A.xlsx hoặc A.xlsm thì luôn xuất hiện 1 file tạm trong cùng thư mục mang tên ~$A.xlsm. Biết rằng file này tự mất đi khi ta đóng file chính, nhưng điều này ảnh hưởng đến việc chạy code tìm file để xử lý. Có anh chị nào biết cách không cho file này xuất hiện không?
Cho dù ta đang thiết lập chế độ Dont show hidden files vẫn không thể chạy code được
Có lẽ đây liên quan đến một tùy chọn gì đó trong Excel. Việc thay đổi tùy chọn này có vẻ hơi khó vì có thể file này sử dụng ở nhiều máy khác nhau. Nhưng ít ra thì việc bỏ qua các file ~$*.* này là việc dễ dàng chứ có khó gì đâu anh, chỉ cần dựa vào LEFT(Tên_file,2) là được mà.
 
Khi mở 1 file excel có đuôi là A.xls thì không có vấn đề gì, nhưng khi mở 1 file có đuôi là A.xlsx hoặc A.xlsm thì luôn xuất hiện 1 file tạm trong cùng thư mục mang tên ~$A.xlsm. Biết rằng file này tự mất đi khi ta đóng file chính, nhưng điều này ảnh hưởng đến việc chạy code tìm file để xử lý. Có anh chị nào biết cách không cho file này xuất hiện không?
Cho dù ta đang thiết lập chế độ Dont show hidden files vẫn không thể chạy code được
Hài có thể cho ví dụ 1 đoạn code ngắn nào đó ảnh hưởng đến công việc của Hải được không?
 
Hài có thể cho ví dụ 1 đoạn code ngắn nào đó ảnh hưởng đến công việc của Hải được không?
Anh xem code này của anh, em kết hợp để mở file trong cùng thư mục. Trước đây xài 2003 không có vấn đề gì, nhưng nếu file lưu dạng .xlsx hoặc .xlsm là không chạy được
PHP:
Function GetListFile(ByVal Folder As String, ByVal Search As String, ByVal InSub As Boolean)
  Dim sComm As String, tmp As String, tmpFile, Arr, sPath As String
  On Error Resume Next
  If Right(Folder, 1) <> "\" Then Folder = Folder & "\"
  sPath = """" & Folder & "*" & Search & "*"""
  With CreateObject("Scripting.FileSystemObject")
    tmpFile = .GetTempName
    sComm = "DIR " & sPath & " /ON /B /A-D " & IIf(InSub, "/S", " ") & " >" & tmpFile
    CreateObject("Wscript.Shell").Run "cmd /u /c " & sComm, 0, True
    With .OpenTextFile(tmpFile, 1, , -2)
      tmp = Trim(.ReadAll)
      If Right(tmp, 2) = vbCrLf Then tmp = Left(tmp, Len(tmp) - 2)
      If Len(tmp) Then GetListFile = Split(tmp, vbCrLf)
      .Close
    End With
  End With
  Kill tmpFile
End Function

PHP:
Sub Main()
Dim Arr, i As Long, WB As Workbook, TH As Workbook
Set TH = ThisWorkbook
Arr = GetListFile(ThisWorkbook.Path, "*.xls?", True)
For i = 0 To UBound(Arr)
   If Arr(i) <> ThisWorkbook.FullName Then
      Set WB = Workbooks.Open(Arr(i))
      With WB
             'code xử lý
         .Close False
      End With
   End If
Next
End Sub
 
Anh xem code này của anh, em kết hợp để mở file trong cùng thư mục. Trước đây xài 2003 không có vấn đề gì, nhưng nếu file lưu dạng .xlsx hoặc .xlsm là không chạy được


PHP:
Sub Main()
Dim Arr, i As Long, WB As Workbook, TH As Workbook
Set TH = ThisWorkbook
Arr = GetListFile(ThisWorkbook.Path, "*.xls?", True)
For i = 0 To UBound(Arr)
   If Arr(i) <> ThisWorkbook.FullName Then
      Set WB = Workbooks.Open(Arr(i))
      With WB
             'code xử lý
         .Close False
      End With
   End If
Next
End Sub

Vậy thì Hải có thể làm theo cách của bài 2 hoặc cách khác là xét thuộc tính Hidden của file (vì thằng ~$...xlsx nó Hidden đấy) bằng cách sửa đoạn:
Mã:
sComm = "DIR " & sPath & " /ON /B /A-D " & IIf(InSub, "/S", " ") & " >" & tmpFile
Thành:
Mã:
sComm = "DIR " & sPath & " /ON /B /A-D[COLOR=#ff0000][B]-H[/B][/COLOR] " & IIf(InSub, "/S", " ") & " >" & tmpFile
Thử xem! Thiếu gì cách
 
Lần chỉnh sửa cuối:
Vậy thì Hải có thể làm theo cách của bài 2 hoặc cách khác là xét thuộc tính Hidden của file (vì thằng ~$...xlsx nó Hidden đấy)
Vậy tức là mặc định của Office là khi ta mở 1 file sẽ xuất hiện 1 file cùng tên có ~$ phía trước và không thể làm gì hơn là phải chấp nhận điều này. Nếu vậy thì phải dùng ADO thôi.
 
Anh xem code này của anh, em kết hợp để mở file trong cùng thư mục. Trước đây xài 2003 không có vấn đề gì, nhưng nếu file lưu dạng .xlsx hoặc .xlsm là không chạy được

Tập tin ~$ như vậy đã được Excel mở nhưng ở chế độ "không chia sẻ với ai" rồi. Đấy là tôi đoán thế.
Bạn cũng có thể mở tập tin bất kỳ ở chế độ "không chia sẻ với ai"

1. Tạo tập tin "c:\hehe.txt"

2. Mở Excel và cho vào module code dưới đây:

Mã:
Private Const OPEN_EXISTING As Long = 3
Private Const GENERIC_READ As Long = &H80000000
Private Const FILE_SHARE_READ As Long = &H1
Private Const FILE_ATTRIBUTE_NORMAL As Long = &H80

Private Type SECURITY_ATTRIBUTES
    nLength As Long
    lpSecurityDescriptor As Long
    bInheritHandle As Long
End Type

Private Declare Function CreateFile Lib "kernel32.dll" Alias "CreateFileA" (ByVal lpFileName As String, _
    ByVal dwDesiredAccess As Long, ByVal dwShareMode As Long, _
    ByRef lpSecurityAttributes As SECURITY_ATTRIBUTES, ByVal dwCreationDisposition As Long, _
    ByVal dwFlagsAndAttributes As Long, ByVal hTemplateFile As Long) As Long
Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Long) As Long

Sub hehe()
Dim hFile As Long, sa As SECURITY_ATTRIBUTES
    hFile = CreateFile("C:\hehe.txt", GENERIC_READ, [COLOR=#0000ff]FILE_SHARE_READ[/COLOR], sa, _
                                OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
    MsgBox "Tap tin dang mo"
    CloseHandle hFile
End Sub

Sub hichic()
Dim hFile As Long, sa As SECURITY_ATTRIBUTES
    hFile = CreateFile("C:\hehe.txt", GENERIC_READ, [B][COLOR=#ff0000]0[/COLOR][/B], sa, _
                                OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0)
    MsgBox "Tap tin dang mo"
    CloseHandle hFile
End Sub

3. Bạn chạy sub hehe. Không đóng MsgBox bạn mở được và đọc được "c:\hehe.txt" do có chia sẻ cho đọc - FILE_SHARE_READ. Bạn sửa được nhưng không save được. Chỉ saveAs được do không có chia sẻ ghi - FILE_SHARE_WRITE

4. Bạn chạy sub hichic. Cho tới tận khi đóng MsgBox bạn không mở được bằng bất cứ ct nào. Vd. HexEditor và notepad (đúp chuột trên tập tin) đều báo là không mở được. Vì không có chia sẻ ở bất cứ hình thức nào: số 0 đỏ đỏ.

Chỉ khi đóng MsgBox và thực thi CloseHandle thì mới mở được hehe.txt.
 
Web KT

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

Back
Top Bottom