Lỗi "File already exits" ?

Liên hệ QC

Nguyen Rem

Tất cả chỉ là đưa ra quyết định đúng đắn
Tham gia
23/2/22
Bài viết
211
Được thích
30
Giới tính
Nữ
Em chào các anh chị ^^
Hiện tại em có lỗi như sau mong cách anh chị giúp em giải thích và sửa lỗi :
Ta có 2 folder "Destination" và "Start" :
1652955574390.png

1652955609815.png
Em muốn dùng vòng lặp for each để copy tất cả file từ folder "Start" sang folder "Destination"
1652955455079.png
Nhưng mà đến dòng số 3 từ dưới lên thì nó bị lỗi như trên mặc dù trong folder destination không có gì . Các anh chị giúp em với ^^
 

File đính kèm

  • FSO.xlsm
    23.1 KB · Đọc: 4
Lỗi nó báo rõ rồi bạn. Bạn thêm code kiemr tra file có tồn tại không, nếu tồn tại rồi thì không move nữa.
 
Upvote 0
Lỗi nó báo rõ rồi bạn. Bạn thêm code kiemr tra file có tồn tại không, nếu tồn tại rồi thì không move nữa.
Em vẫn chưa hiểu ý của anh nói cho lắm . Anh có thể nói chi tiết hơn không ạ . Các file hiện có thì nó đều nằm trong folder mà em đã chụp ở hình 1 và 2 rồi ấy anh .
 
Upvote 0
Trong A.Move (...) ... là đường dẫn đầy đủ tới Folder. Tức phải là giá trị STRING. Nhưng không thể ở dạng "D:\EXCEL\VBA\Destination" mà phải là "D:\EXCEL\VBA\Destination\". Trong khi đó Destination_ là OBJECT (Set Destination_ = ...), do không viết tường minh mà lệnh đòi hỏi giá trị STRING nên VBA lấy thuộc tính MẶC ĐỊNH của đối tượng Destination_, đó là thuộc tính Path. Nhưng Destination_.Path = "F:\EXCEL\VBA\Destination", không được chấp nhận.

Phải là A.Move (Destination_.Path & "\")

Em vẫn chưa hiểu ý của anh nói cho lắm . Anh có thể nói chi tiết hơn không ạ . Các file hiện có thì nó đều nằm trong folder mà em đã chụp ở hình 1 và 2 rồi ấy anh .
Lỗi không do nguyên nhân đó. Làm gì đã có tập tin trong Destination mà trùng lặp.
 
Upvote 0
Lại là em Cà Rem đây. Hôm nay em online để tiếp tục sự nghiệp. @!>><
 
Upvote 0
Lại là em Cà Rem đây. Hôm nay em online để tiếp tục sự nghiệp. @!>><
Ơ sao là Cà Rem ạ ^^ .
Trong A.Move (...) ... là đường dẫn đầy đủ tới Folder. Tức phải là giá trị STRING. Nhưng không thể ở dạng "D:\EXCEL\VBA\Destination" mà phải là "D:\EXCEL\VBA\Destination\". Trong khi đó Destination_ là OBJECT (Set Destination_ = ...), do không viết tường minh mà lệnh đòi hỏi giá trị STRING nên VBA lấy thuộc tính MẶC ĐỊNH của đối tượng Destination_, đó là thuộc tính Path. Nhưng Destination_.Path = "F:\EXCEL\VBA\Destination", không được chấp nhận.

Phải là A.Move (Destination_.Path & "\")


Lỗi không do nguyên nhân đó. Làm gì đã có tập tin trong Destination mà trùng lặp.
Chắc mai em đọc ạ ^^ Hôm nay em hơi mệt :> . Em cảm ơn anh nhiều lắm hi
 
Upvote 0
Trong A.Move (...) ... là đường dẫn đầy đủ tới Folder. Tức phải là giá trị STRING. Nhưng không thể ở dạng "D:\EXCEL\VBA\Destination" mà phải là "D:\EXCEL\VBA\Destination\". Trong khi đó Destination_ là OBJECT (Set Destination_ = ...), do không viết tường minh mà lệnh đòi hỏi giá trị STRING nên VBA lấy thuộc tính MẶC ĐỊNH của đối tượng Destination_, đó là thuộc tính Path. Nhưng Destination_.Path = "F:\EXCEL\VBA\Destination", không được chấp nhận.

Phải là A.Move (Destination_.Path & "\")


Lỗi không do nguyên nhân đó. Làm gì đã có tập tin trong Destination mà trùng lặp.
Em đã đọc và kiểm tra thử thì chương trình chạy được rồi anh ạ ^^
Nhưng mà cái chỗ em thắc mắc là tại sao phải cho thêm dấu "\" ạ . Tại sao cho thêm dấu "\" vào cuối đường dẫn thì nó lại tìm được đến chỗ thư mục Destination ạ ( Nếu tất cả các đường dẫn em đều thêm "\" ở cuối cùng của đường dẫn thì "nó" có tìm được đúng vị trí của thư mục không?) .
Hay muốn tìm đến thư mục thì ta phải thêm "\" ở cuối còn muốn tìm đến File thì ta không cần thêm. Liệu giả thiết này có đúng không ạ ?
Ví dụ:
Đường dẫn đến thư mục:
F:\EXCEL\VBA\Start\
Đường dẫn đến file:
F:\EXCEL\VBA\Start\a.txt
Phiền anh giải thích giúp em ^^

Với hiện tại em cũng đang có một lỗi nhỏ nữa tiện thể anh giải thích nó luôn giúp em ^^, nó như sau:
1652994293878.png
Cái dòng thứ 2 từ dưới lên
Nếu em thêm dấu ngoặc đơn vào:
FSO.MoveFile (Start_ & "\*", Destination_)
thì nó bị lỗi như sau:
1652994380383.png
Vậy cái lỗi này tại sao có ạ ^^
 
Lần chỉnh sửa cuối:
Upvote 0
Em đã đọc và kiểm tra thử thì chương trình chạy được rồi anh ạ ^^
Nhưng mà cái chỗ em thắc mắc là tại sao phải cho thêm dấu "\" ạ . Tại sao cho thêm dấu "\" vào cuối đường dẫn thì nó lại tìm được đến chỗ thư mục Destination ạ ( Nếu tất cả các đường dẫn em đều thêm "\" ở cuối cùng của đường dẫn thì "nó" có tìm được đúng vị trí của thư mục không?) .
Hay muốn tìm đến thư mục thì ta phải thêm "\" ở cuối còn muốn tìm đến File thì ta không cần thêm. Liệu giả thiết này có đúng không ạ ?
Ví dụ:
Đường dẫn đến thư mục:
F:\EXCEL\VBA\Start\
Đường dẫn đến file:
F:\EXCEL\VBA\Start\a.txt
Phiền anh giải thích giúp em ^^

Với hiện tại em cũng đang có một lỗi nhỏ nữa tiện thể anh giải thích nó luôn giúp em ^^, nó như sau:
View attachment 276182
Cái dòng thứ 2 từ dưới lên
Nếu em thêm dấu ngoặc đơn vào:
FSO.MoveFile (Start_ & "\*", Destination_)
thì nó bị lỗi như sau:
View attachment 276183
Vậy cái lỗi này tại sao có ạ ^^
Nếu muốn chuyển sang thư mục xyz thì bắt buộc phải kết thúc bằng "\". Nguyên nhân là nếu dùng MOVE thì có thể vừa chuyển vừa ĐỔI TÊN tập tin.

Ta xét trường hợp trong thư mục Start có tập tin hichic.txt.
Hãy chạy code
Mã:
Sub test()
Dim A As File
Dim Start_ As Folder, Destination_ As Folder
Dim FSO As FileSystemObject
    Set FSO = New FileSystemObject
    Set Destination_ = FSO.GetFolder("F:\EXCEL\VBA\Destination")
    Set Start_ = FSO.GetFolder("F:\EXCEL\VBA\Start")
  
    Set A = Start_.Files("hichic.txt")
    A.Move ("F:\EXCEL\VBA\blala")
End Sub
Sau khi chạy code trong thư mục VBA có tập tin blala. Nếu phải chuột trên blala rồi chọn Open with rồi chọn notepad thì ta thấy là blala chính là hichic.txt ở thư mục Start. Như vậy có thể chuyển hichic.txt sang thư mục "F:\EXCEL\VBA\" và đồng thời đổi tên thành blala.

1. Ta xét dạng đích "F:\EXCEL\VBA\Destination\". Rõ ràng không có tên mới cho tập tin, vì tên tập tin không thể kết thức bằng ký tự "\". Vậy đây là kiểu chuyển sang thư mục "F:\EXCEL\VBA\Destination\" và giữ nguyên tên nguồn.

2. Ta xét dạng đích "F:\EXCEL\VBA\Destination". Không có gì đảm bảo Destination phải là tên thư mục. Rất có thể ông A nào đó muốn chuyển tập tin sang thư mục "F:\EXCEL\VBA\" đồng thời đổi tên thành Destination (lúc trước ông A đổi tên thành blala nhưng bây giờ lại muốn đổi tên thành Destination). Ai dám mang đầu ra đảm bảo là ông A không có ý định đó? Vậy code VBA cứ thử chuyển sang thư mục "F:\EXCEL\VBA\" và đổi tên tập tin thành Destination. Và ở thời điểm này sảy ra lỗi, vì trong cùng một thư mục (ở đây là VBA) không thể có 2 thư mục cùng tên, không thể có 2 tập tin cùng tên, không thể có 1 thư mục và 1 tập tin cùng tên. Vì thế khi code cố làm theo ý người viết code là bạn thì sảy ra lỗi "File already exits" (trong VBA đã tồn tại thư mục tên là Destination)
---------------
Nếu bạn có
Sub hichic(ByVal a As String, ByVal b As String)

Thì bạn có thể gọi bằng 2 cách

- hichic "Ngay mai em di", "Bien nho ten em goi ve"

- CALL hichic("Ngay mai em di", "Bien nho ten em goi ve")

Vậy thì hoặc

FSO.MoveFile Start_ & "\*", Destination_

hoặc

Call FSO.MoveFile (Start_ & "\*", Destination_)

Bạn mới học thì không nên học thói quen rất xấu của người khác. Hãy tập viết tường minh. Destination trong MoveFile là String, trong khi đó Destination_ là object.
 
Upvote 0
Nếu muốn chuyển sang thư mục xyz thì bắt buộc phải kết thúc bằng "\". Nguyên nhân là nếu dùng MOVE thì có thể vừa chuyển vừa ĐỔI TÊN tập tin.

Ta xét trường hợp trong thư mục Start có tập tin hichic.txt.
Hãy chạy code
Mã:
Sub test()
Dim A As File
Dim Start_ As Folder, Destination_ As Folder
Dim FSO As FileSystemObject
    Set FSO = New FileSystemObject
    Set Destination_ = FSO.GetFolder("F:\EXCEL\VBA\Destination")
    Set Start_ = FSO.GetFolder("F:\EXCEL\VBA\Start")
 
    Set A = Start_.Files("hichic.txt")
    A.Move ("F:\EXCEL\VBA\blala")
End Sub
Sau khi chạy code trong thư mục VBA có tập tin blala. Nếu phải chuột trên blala rồi chọn Open with rồi chọn notepad thì ta thấy là blala chính là hichic.txt ở thư mục Start. Như vậy có thể chuyển hichic.txt sang thư mục "F:\EXCEL\VBA\" và đồng thời đổi tên thành blala.

1. Ta xét dạng đích "F:\EXCEL\VBA\Destination\". Rõ ràng không có tên mới cho tập tin, vì tên tập tin không thể kết thức bằng ký tự "\". Vậy đây là kiểu chuyển sang thư mục "F:\EXCEL\VBA\Destination\" và giữ nguyên tên nguồn.

2. Ta xét dạng đích "F:\EXCEL\VBA\Destination". Không có gì đảm bảo Destination phải là tên thư mục. Rất có thể ông A nào đó muốn chuyển tập tin sang thư mục "F:\EXCEL\VBA\" đồng thời đổi tên thành Destination (lúc trước ông A đổi tên thành blala nhưng bây giờ lại muốn đổi tên thành Destination). Ai dám mang đầu ra đảm bảo là ông A không có ý định đó? Vậy code VBA cứ thử chuyển sang thư mục "F:\EXCEL\VBA\" và đổi tên tập tin thành Destination. Và ở thời điểm này sảy ra lỗi, vì trong cùng một thư mục (ở đây là VBA) không thể có 2 thư mục cùng tên, không thể có 2 tập tin cùng tên, không thể có 1 thư mục và 1 tập tin cùng tên. Vì thế khi code cố làm theo ý người viết code là bạn thì sảy ra lỗi "File already exits" (trong VBA đã tồn tại thư mục tên là Destination)
---------------
Nếu bạn có
Sub hichic(ByVal a As String, ByVal b As String)

Thì bạn có thể gọi bằng 2 cách

- hichic "Ngay mai em di", "Bien nho ten em goi ve"

- CALL hichic("Ngay mai em di", "Bien nho ten em goi ve")

Vậy thì hoặc

FSO.MoveFile Start_ & "\*", Destination_

hoặc

Call FSO.MoveFile (Start_ & "\*", Destination_)

Bạn mới học thì không nên học thói quen rất xấu của người khác. Hãy tập viết tường minh. Destination trong MoveFile là String, trong khi đó Destination_ là object.
Dạ vâng ạ ! Em hiểu rồi ạ . Em cảm ơn anh nhiều lắm ^^
Hãy tập viết tường minh. Destination trong MoveFile là String, trong khi đó Destination_ là object
Vâng ạ ! Em hiểu ý anh ^^ ( Destination:= Destination_.path & "\" )
Em sẽ rút kinh nhiệm cho lần sau ạ hi
 
Upvote 0
Web KT
Back
Top Bottom