[Nhờ giúp đỡ] code vba đóng file, sửa tên file, mở lại file (1 người xem)

Liên hệ QC

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

Ngày mai trời lại sáng

Thành viên thường trực
Tham gia
4/7/21
Bài viết
340
Được thích
139
Chào mọi người
Hiện giờ em đang có nhiều file link đến file có tên "A.xlsm" (tất cả các file cùng để chung vào một folder) , nhưng file "A.xlsm" này thường xuyên bị đổi tên theo ngày tháng năm hoặc tên khác không theo quy định nào.
Nhờ mọi người giúp em(cháu) một đoạn code mở file A này lên kiểm tra nếu không file tên "A.xlsm" sẽ đóng lại và sửa tên đúng với "A.xlsm" rồi mở lại file để các file đang mở cùng file "A.xlsm" có thể link được đến file "A.xlsm" .
 
Chào mọi người
Hiện giờ em đang có nhiều file link đến file có tên "A.xlsm" (tất cả các file cùng để chung vào một folder) , nhưng file "A.xlsm" này thường xuyên bị đổi tên theo ngày tháng năm hoặc tên khác không theo quy định nào.
Nhờ mọi người giúp em(cháu) một đoạn code mở file A này lên kiểm tra nếu không file tên "A.xlsm" sẽ đóng lại và sửa tên đúng với "A.xlsm" rồi mở lại file để các file đang mở cùng file "A.xlsm" có thể link được đến file "A.xlsm" .
Khi nó đã đổi tên X,Y,Z => code làm sao biết nó tên gì để mở nó lên?

.
 
Upvote 0
Chào mọi người
Hiện giờ em đang có nhiều file link đến file có tên "A.xlsm" (tất cả các file cùng để chung vào một folder) , nhưng file "A.xlsm" này thường xuyên bị đổi tên theo ngày tháng năm hoặc tên khác không theo quy định nào.
Nhờ mọi người giúp em(cháu) một đoạn code mở file A này lên kiểm tra nếu không file tên "A.xlsm" sẽ đóng lại và sửa tên đúng với "A.xlsm" rồi mở lại file để các file đang mở cùng file "A.xlsm" có thể link được đến file "A.xlsm" .
Thường xuyên bị đổi tên là ai đổi tên? Còn nếu muốn xử lý thì bỏ nó vào một folder mà folder đó chỉ có mình nó, hoặc nếu để chung với các file khác thì nó là file xlsm duy nhất, các file kia là xlsx. Phải có dấu hiệu nhận biết mới xử lý được
 
Upvote 0
Khi nó đã đổi tên X,Y,Z => code làm sao biết nó tên gì để mở nó lên?

.
Em muốn code này trong chính cái file "A.xlsm", nếu mở lên kiểm tra nó nằm trong folder có tên là "link báo cáo" và tền file khác "A.xlsm" thì đổi tên rồi đóng lại sau đó mở lại.

Thường xuyên bị đổi tên là ai đổi tên? Còn nếu muốn xử lý thì bỏ nó vào một folder mà folder đó chỉ có mình nó, hoặc nếu để chung với các file khác thì nó là file xlsm duy nhất, các file kia là xlsx. Phải có dấu hiệu nhận biết mới xử lý được
File "A.xlsm" em copy từ nguồn khác bác ơi, người khác đổi. Trong thư mục có nhiều file nhiều đuôi khác nhau.
 
Upvote 0
Em muốn code này trong chính cái file "A.xlsm", nếu mở lên kiểm tra nó nằm trong folder có tên là "link báo cáo" và tền file khác "A.xlsm" thì đổi tên rồi đóng lại sau đó mở lại.
Ý tưởng của tui là: Nếu tên khác "A.xlsm" sẽ save as với tên "A.xlsm" rồi xóa file cũ.

Dùng Sub Workbook_Open()
 
Upvote 0
Ý tưởng của tui là: Nếu tên khác "A.xlsm" sẽ save as với tên "A.xlsm" rồi xóa file cũ.

Dùng Sub Workbook_Open()
File copy từ nguồn khác mờ, thay vì viết Sub Workbook_Open(), save as thủ công lẹ hơn
Hai bác giúp em bằng đoạn code thực tế để em kiểm nghiệm với, saveAs liệu có ảnh hưởng gì đến các file đang mở và link đến không các bác.
Ví dụ em đang mở file "A.xlsm" và các file link đến file này, sau đó copy lại và mở file "xyz.xlsm" (file để đổi tên sang "A.xlsm") để kiểm tra nếu khác tên "A.xlsm" thì xử lý.. file "xyz.xlsm" đồng thời tắt và xóa hoặc thay tên cho cả file "A.xlsm" đang mở từ trước?
 
Upvote 0
(@$%@.....các bác đi đâu hết rồi.
Thử code này, có vẻ như đang lỗi với tên file tiếng việt:
Mã:
Option Explicit
Sub NTKTNN()
Dim Wb As Workbook, strWb As String, dFileName As String
Application.DisplayAlerts = False
Set Wb = Application.ThisWorkbook
strWb = LCase(Wb.Name)
dFileName = "A.xlsm"
If strWb <> LCase(dFileName) Then
    Wb.SaveCopyAs Wb.Path & "\" & dFileName
    SuicideSub
Else
    MsgBox dFileName & " - Ten file phu hop"
End If
Application.DisplayAlerts = True
End Sub

Sub SuicideSub()
With ThisWorkbook
    .Saved = True
    .ChangeFileAccess xlReadOnly
    Kill .FullName
    Application.Quit
End With
End Sub
 
Upvote 0
Thử code này, có vẻ như đang lỗi với tên file tiếng việt:
Mã:
Option Explicit
Sub NTKTNN()
Dim Wb As Workbook, strWb As String, dFileName As String
Application.DisplayAlerts = False
Set Wb = Application.ThisWorkbook
strWb = LCase(Wb.Name)
dFileName = "A.xlsm"
If strWb <> LCase(dFileName) Then
    Wb.SaveCopyAs Wb.Path & "\" & dFileName
    SuicideSub
Else
    MsgBox dFileName & " - Ten file phu hop"
End If
Application.DisplayAlerts = True
End Sub

Sub SuicideSub()
With ThisWorkbook
    .Saved = True
    .ChangeFileAccess xlReadOnly
    Kill .FullName
    Application.Quit
End With
End Sub
Em cảm ơn bác, em thử đang bị mấy vấn đề: các file đang mở cùng tắt theo,file không khớp tên sau khi đóng chưa thấy sửa lại tên thành "A.xlsm" cũng không thấy mở lại lên mà tự xóa.
 
Upvote 0
Em cảm ơn bác, em thử đang bị mấy vấn đề: các file đang mở cùng tắt theo,file không khớp tên sau khi đóng chưa thấy sửa lại tên thành "A.xlsm" cũng không thấy mở lại lên mà tự xóa.
Thực ra mình thấy đề bài này không mấy hào hứng, có lẽ bạn có cách khác thực hiện dễ dàng hơn chứ nhỉ?? Mà mình có thắc mắc, bạn đã đi copy file từ nguồn khác về, thì F2 sửa tên cũng một nốt nhạc, sao lại kỳ công để viết code thế nhỉ. hơi khó hiểu
 
Upvote 0
Em muốn code này trong chính cái file "A.xlsm", nếu mở lên kiểm tra nó nằm trong folder có tên là "link báo cáo" và tền file khác "A.xlsm" thì đổi tên rồi đóng lại sau đó mở lại.


File "A.xlsm" em copy từ nguồn khác bác ơi, người khác đổi. Trong thư mục có nhiều file nhiều đuôi khác nhau.
Cứ suy nghĩ thế này cho đơn giản đi

- file copy đầu tiên bạn đổi thành B.xlsm
- Rồi từ đó dùng code ngoài , đổi file B.xlsm thành A.xlsm

Là xong

Đọc xong, thấy có vẻ sai sai thế nào đúng không, nếu tìm ra được chỗ sai sai đó , sẽ có cách
 
Upvote 0
Những người tham gia chủ đề này có đủ trình độ để giúp. Có điều không ai hiểu đúng 100% tình huống, dụng ý của bạn. Thánh cũng chưa hiểu thì sao giúp được, ai rồi cũng thế thôi.
 
Upvote 0
Và thực sự chú ấy cũng đã đến \\^^ // .. chú ơi có chỗ nào chú chưa hiểu cháu sẽ giải thích ạ?
 
Upvote 0
Và thực sự chú ấy cũng đã đến \\^^ // .. chú ơi có chỗ nào chú chưa hiểu cháu sẽ giải thích ạ?
Trích
Ví dụ em đang mở file "A.xlsm" và các file link đến file này, sau đó copy lại và mở file "xyz.xlsm" (file để đổi tên sang "A.xlsm") để kiểm tra nếu khác tên "A.xlsm" thì xử lý.. file "xyz.xlsm" đồng thời tắt và xóa hoặc thay tên cho cả file "A.xlsm" đang mở từ trước?

Code trong A.xlsm, và A.xlsm đang mở thì người dùng biết phải chạy code nào. Nhưng làm sao code biết là phải mở tập tin xyz.xlsm mà không phải là abc.xlsm, "ngay mai em đi.xlsm"? Nếu tôi hiểu bạn viết
nhưng file "A.xlsm" này thường xuyên bị đổi tên theo ngày tháng năm hoặc tên khác không theo quy định nào.
Nếu là thế thì thậm chí bạn còn không biết bây giờ nó tên là gì (không theo quy định nào) chứ nói gì tới code. Nó cũng bó tay thôi. Mà nếu A.xlsm ĐÃ bị đổi tên thành xyz.xlsm thì làm sao lại còn A.xlsm để bạn mở như ở trên?

Và cái gọi là "xử lý" như trong đoạn trích nó là gì? Chỉ đơn giản là đổi tên hay thêm bớt nội dung? Nếu chỉ đổi tên vì nội dung y hệt như A.xlsm thì lại có câu hỏi: khi xyz.xlsm có nội dung y như A.xlsm thì tại sao lại phải xóa A.xlsm và đổi tên xyz.xlsm thành A.xlsm? Có A.xlsm rồi, và A.xlsm tốt ngang hàng xyz.xlsm, thì sao lại phải nhọc công như vậy?

Bạn chờ người khác nhé. Bây giờ mà tôi phải ngồi gõ những cái không hiểu thì tôi ngại lắm. Tốt nhất là cố giải thích cho người khác hiểu. Còn nếu vẫn không ai hiểu thì chịu thôi. Tôi không muốn tham gia, vì tôi chậm hiểu lắm, không lanh lợi được như những người khác.
 
Upvote 0
Trích


Code trong A.xlsm, và A.xlsm đang mở thì người dùng biết phải chạy code nào. Nhưng làm sao code biết là phải mở tập tin xyz.xlsm mà không phải là abc.xlsm, "ngay mai em đi.xlsm"? Nếu tôi hiểu bạn viết

Nếu là thế thì thậm chí bạn còn không biết bây giờ nó tên là gì (không theo quy định nào) chứ nói gì tới code. Nó cũng bó tay thôi. Mà nếu A.xlsm ĐÃ bị đổi tên thành xyz.xlsm thì làm sao lại còn A.xlsm để bạn mở như ở trên?

Và cái gọi là "xử lý" như trong đoạn trích nó là gì? Chỉ đơn giản là đổi tên hay thêm bớt nội dung? Nếu chỉ đổi tên vì nội dung y hệt như A.xlsm thì lại có câu hỏi: khi xyz.xlsm có nội dung y như A.xlsm thì tại sao lại phải xóa A.xlsm và đổi tên xyz.xlsm thành A.xlsm? Có A.xlsm rồi, và A.xlsm tốt ngang hàng xyz.xlsm, thì sao lại phải nhọc công như vậy?

Bạn chờ người khác nhé. Bây giờ mà tôi phải ngồi gõ những cái không hiểu thì tôi ngại lắm. Tốt nhất là cố giải thích cho người khác hiểu. Còn nếu vẫn không ai hiểu thì chịu thôi. Tôi không muốn tham gia, vì tôi chậm hiểu lắm, không lanh lợi được như những người khác.

Chú ơi, cháu tóm gọi lại thế này:

Cháu thường copy /download từ mail 1 file có tên "xyz.xlsm" hoặc là "ngay mai em đi.xlsm", đây gọi là file chứa dữ liệu nguồn để cháu có thể link đến các file tiếp theo cháu tạm gọi file này là file nguồn.xlsm (thay vì trước gọi là "A.xlsm") giờ cháu gọi tên là "nguồn.xlsm", đây là file chưá đoạn code cháu cần xử lý gọi tên là "Xuly_mo_file", đoạn code này khi mở file nếu nó không nằm trong thư mục có tên "link báo cáo" thì không có động tĩnh gì luôn ngược lại nếu nó nằm trong thư mục có tên "link báo cáo" thì nó sẽ sẽ tự động thực thi code với các tính năng sau:

Kiểm tra vòng ngoài:
1. Kiểm tra xem bản thân nó tên là gì có phải "nguồn.xlsm" ?
Nếu đúng khôg làm gì cả, hiện thông báo "OK,không cần phải làm gì thêm."

2.Nếu sai không phải tên là "nguồn.xlsm" mà là "ngày mai em đi.xlsm".. nhưng vì là bản thân các file này trong nó đã có code "Xuly_mo_file" nên nó sẽ hoạt động khi mở file:

Tiếp đến kiểm tra vòng trong mở với file có tên "ngày mai em đi.xlsm":
2.1 Kiểm tra xem các file đang mở có file nào tên là "nguồn.xlsm" không?
Nếu có đóng "nguồn.xlsm" lại và đổi tên file "nguồn.xlsm" sang thành một file có tên khác "chào em.xlsm" ,chỉ đóng duy nhất file "nguồn.xlsm" không đóng file khác nếu cùng mở.

2.2. Tự động đóng "ngày mai em đi.xlsm" và đổi sang tên "nguồn.xlsm"
2.3 Tự mở "nguồn.xlsm" sau khi đã đổi tên hiện thông báo "OK,không cần phải làm gì thêm."

Cháu giải thích vậy chú hiểu không chú?
 
Upvote 0
Chú ơi, cháu tóm gọi lại thế này:

Cháu thường copy /download từ mail 1 file có tên "xyz.xlsm" hoặc là "ngay mai em đi.xlsm", đây gọi là file chứa dữ liệu nguồn để cháu có thể link đến các file tiếp theo cháu tạm gọi file này là file nguồn.xlsm (thay vì trước gọi là "A.xlsm") giờ cháu gọi tên là "nguồn.xlsm", đây là file chưá đoạn code cháu cần xử lý gọi tên là "Xuly_mo_file", đoạn code này khi mở file nếu nó không nằm trong thư mục có tên "link báo cáo" thì không có động tĩnh gì luôn ngược lại nếu nó nằm trong thư mục có tên "link báo cáo" thì nó sẽ sẽ tự động thực thi code với các tính năng sau:

Kiểm tra vòng ngoài:
1. Kiểm tra xem bản thân nó tên là gì có phải "nguồn.xlsm" ?
Nếu đúng khôg làm gì cả, hiện thông báo "OK,không cần phải làm gì thêm."

2.Nếu sai không phải tên là "nguồn.xlsm" mà là "ngày mai em đi.xlsm".. nhưng vì là bản thân các file này trong nó đã có code "Xuly_mo_file" nên nó sẽ hoạt động khi mở file:

Tiếp đến kiểm tra vòng trong mở với file có tên "ngày mai em đi.xlsm":
2.1 Kiểm tra xem các file đang mở có file nào tên là "nguồn.xlsm" không?
Nếu có đóng "nguồn.xlsm" lại và đổi tên file "nguồn.xlsm" sang thành một file có tên khác "chào em.xlsm" ,chỉ đóng duy nhất file "nguồn.xlsm" không đóng file khác nếu cùng mở.

2.2. Tự động đóng "ngày mai em đi.xlsm" và đổi sang tên "nguồn.xlsm"
2.3 Tự mở "nguồn.xlsm" sau khi đã đổi tên hiện thông báo "OK,không cần phải làm gì thêm."

Cháu giải thích vậy chú hiểu không chú?
Tập tin "nguồn.xlsm" có code thì mọi người đã biết từ đâu có. Nhưng "ngày mai em đi.xlsm" từ đâu có mà cũng có code y như "nguồn.xlsm"? Và như tôi đã viết, nếu "ngày mai em đi.xlsm" cũng có nội dung y hệt như "nguồn.xlsm" thì tại sao phải thao tác nhọc công như thế? nguồn.xlsm tốt ngang hàng ngày mai em đi.xlsm cơ mà.

Thực ra cứ viết code như bạn yêu cầu thì cũng chả khó. Nhưng tôi là người không chiều người khác tới bến. Nếu thấy yêu cầu vô lý thì tôi không muốn mất công. Nếu không ai làm hộ thì tối nay tôi sẽ làm. Nhưng chỉ làm như tôi hiểu và làm 1 lần. Giải thích, thông tin nhỏ giọt, đoán mò là những món tôi không thích.
 
Upvote 0
Tập tin "nguồn.xlsm" có code thì mọi người đã biết từ đâu có. Nhưng "ngày mai em đi.xlsm" từ đâu có mà cũng có code y như "nguồn.xlsm"? Và như tôi đã viết, nếu "ngày mai em đi.xlsm" cũng có nội dung y hệt như "nguồn.xlsm" thì tại sao phải thao tác nhọc công như thế? nguồn.xlsm tốt ngang hàng ngày mai em đi.xlsm cơ mà.

Thực ra cứ viết code như bạn yêu cầu thì cũng chả khó. Nhưng tôi là người không chiều người khác tới bến. Nếu thấy yêu cầu vô lý thì tôi không muốn mất công. Nếu không ai làm hộ thì tối nay tôi sẽ làm. Nhưng chỉ làm như tôi hiểu và làm 1 lần. Giải thích, thông tin nhỏ giọt, đoán mò là những món tôi không thích.
"ngày mai em đi.xlsm" là code cháu sẽ đưa vào đây và sẽ nói với cho người sở hữu file "ngày mai em đi.xlsm" này là cháu phải làm vậy, bởi vì mỗi là họ cập nhật thay đổi dữ liệu vào là họ lại phải sửa và gửi tên khác, do đó mà dữ liệu nội dung bên trong là khác với nội dung file cũ.Ví dụ danh sách ca mắc codVid vẫn là file đó hôm nay nội dung khác ngày mai có thể sẽ khác và có thể không khác chỉ khác cái tên .
Cháu từ bài 1 đến bài này chưa thay đổi quan điểm hay ý tưởng,tất cả cháu đã tóm gọn lại ở đây, cháu không thay đôi:
Chú ơi, cháu tóm gọi lại thế này:

Cháu thường copy /download từ mail 1 file có tên "xyz.xlsm" hoặc là "ngay mai em đi.xlsm", đây gọi là file chứa dữ liệu nguồn để cháu có thể link đến các file tiếp theo cháu tạm gọi file này là file nguồn.xlsm (thay vì trước gọi là "A.xlsm") giờ cháu gọi tên là "nguồn.xlsm", đây là file chưá đoạn code cháu cần xử lý gọi tên là "Xuly_mo_file", đoạn code này khi mở file nếu nó không nằm trong thư mục có tên "link báo cáo" thì không có động tĩnh gì luôn ngược lại nếu nó nằm trong thư mục có tên "link báo cáo" thì nó sẽ sẽ tự động thực thi code với các tính năng sau:

Kiểm tra vòng ngoài:
1. Kiểm tra xem bản thân nó tên là gì có phải "nguồn.xlsm" ?
Nếu đúng khôg làm gì cả, hiện thông báo "OK,không cần phải làm gì thêm."

2.Nếu sai không phải tên là "nguồn.xlsm" mà là "ngày mai em đi.xlsm".. nhưng vì là bản thân các file này trong nó đã có code "Xuly_mo_file" nên nó sẽ hoạt động khi mở file:

Tiếp đến kiểm tra vòng trong mở với file có tên "ngày mai em đi.xlsm":
2.1 Kiểm tra xem các file đang mở có file nào tên là "nguồn.xlsm" không?
Nếu có đóng "nguồn.xlsm" lại và đổi tên file "nguồn.xlsm" sang thành một file có tên khác "chào em.xlsm" ,chỉ đóng duy nhất file "nguồn.xlsm" không đóng file khác nếu cùng mở.

2.2. Tự động đóng "ngày mai em đi.xlsm" và đổi sang tên "nguồn.xlsm"
2.3 Tự mở "nguồn.xlsm" sau khi đã đổi tên hiện thông báo "OK,không cần phải làm gì thêm."

Cháu giải thích vậy chú hiểu không chú?
Mong sớm nhận được tin của chú, ơ mà tối rồi nhà nhà đã bắt đầu tắt đèn đi ngủ, chú cũng đừng làm đêm nhé.
 
Upvote 0
"ngày mai em đi.xlsm" là code cháu sẽ đưa vào đây và sẽ nói với cho người sở hữu file "ngày mai em đi.xlsm" này là cháu phải làm vậy, bởi vì mỗi là họ cập nhật thay đổi dữ liệu vào là họ lại phải sửa và gửi tên khác, do đó mà dữ liệu nội dung bên trong là khác với nội dung file cũ.Ví dụ danh sách ca mắc codVid vẫn là file đó hôm nay nội dung khác ngày mai có thể sẽ khác và có thể không khác chỉ khác cái tên .
Cháu từ bài 1 đến bài này chưa thay đổi quan điểm hay ý tưởng,tất cả cháu đã tóm gọn lại ở đây, cháu không thay đôi:

Nếu làm cách này thì bạn nghĩ sao?
Không cần quan tâm đổi tên file vì nội dung thiết kế bên trong là giống nhau, chỉ khác nhau nội dung dữ liệu. Do đó, chỉ cần thêm các cột để phân biệt nội dung mới và cũ như: thêm cột ngày giờ cập nhật, cố định ở ô"A1", khi có sự thay đổi dữ liệu thì người nhập liệu nhập thông tin cho ô A1 này hoặc viết code tự động cập nhật ngày giờ khi có thay đổi.
Từ file xử lý của bạn, có thể kết nối, kiểm tra ô "A1" của file dữ liệu trên để biết nó là mới hay cũ rồi thực hiện các bước xử lý tiếp theo.
 
Upvote 0
Thôi tôi làm theo cách hiểu của mình. Lời qua tiếng lại quá mất thời gian.
Mã:
Option Explicit

Sub doi_ten()
Dim filename As String, myFullName As String, wb As Workbook, fso As Object
    If LCase(ThisWorkbook.Name) <> "nguon.xlsm" Then    ' neu tap tin hien hanh khong phai la nguon.xlsm thi thuc hien
        For Each wb In Application.Workbooks    ' duyet tung tap tin dang mo va neu gap tap tin nguon.xlsm thi dong va ra khoi FOR
            If LCase(wb.Name) = "nguon.xlsm" Then
                wb.Close True
                Exit For
            End If
        Next wb
        myFullName = ThisWorkbook.FullName  ' ten day du cua tap tin co code dang duoc thuc thi
        filename = ThisWorkbook.Path & "\nguon.xlsm"    ' ten day du cua tap tin nguon.xlsm
        Set fso = CreateObject("Scripting.FileSystemObject")
        If fso.FileExists(filename) Then fso.DeleteFile filename, True  ' neu ton tai tap tin ... nguon.xlsm thi xoa
        ThisWorkbook.SaveAs filename    ' ghi tap tin hien hanh voi ten nguon.xlsm
        fso.DeleteFile myFullName   ' xoa tap tin cu sau khi luu voi ten moi la nguon.xlsm
        Set fso = Nothing
    End If
End Sub
 
Upvote 0
Thôi tôi làm theo cách hiểu của mình. Lời qua tiếng lại quá mất thời gian.
Mã:
Option Explicit

Sub doi_ten()
Dim filename As String, myFullName As String, wb As Workbook, fso As Object
    If LCase(ThisWorkbook.Name) <> "nguon.xlsm" Then    ' neu tap tin hien hanh khong phai la nguon.xlsm thi thuc hien
        For Each wb In Application.Workbooks    ' duyet tung tap tin dang mo va neu gap tap tin nguon.xlsm thi dong va ra khoi FOR
            If LCase(wb.Name) = "nguon.xlsm" Then
                wb.Close True
                Exit For
            End If
        Next wb
        myFullName = ThisWorkbook.FullName  ' ten day du cua tap tin co code dang duoc thuc thi
        filename = ThisWorkbook.Path & "\nguon.xlsm"    ' ten day du cua tap tin nguon.xlsm
        Set fso = CreateObject("Scripting.FileSystemObject")
        If fso.FileExists(filename) Then fso.DeleteFile filename, True  ' neu ton tai tap tin ... nguon.xlsm thi xoa
        ThisWorkbook.SaveAs filename    ' ghi tap tin hien hanh voi ten nguon.xlsm
        fso.DeleteFile myFullName   ' xoa tap tin cu sau khi luu voi ten moi la nguon.xlsm
        Set fso = Nothing
    End If
End Sub

Quá chuẩn, cháu không còn ý kiến gì thêm nữa (nhưng cái cháu muốn sub doi_ten chạy tự động khi mở file, không phải là bấm nút)
Cảm ơn chú siêu nhân người dơi rất là nhiều.

Cháu viết lại kết quả mong muốn của cháu bằng hình ảnh,để mọi người hiểu thêm vì cháu thấy mọi người có vẻ vẫn chưa hiểu hết.
Hình ảnh trước khi chạy code:
1629774798908.png

Kết quả sau khi chạy code:

1629774840862.png
 
Lần chỉnh sửa cuối:
Upvote 0
Quá chuẩn, cháu không còn ý kiến gì thêm nữa (nhưng cái cháu muốn sub doi_ten chạy tự động khi mở file, không phải là bấm nút)
Cảm ơn chú siêu nhân người dơi rất là nhiều.

Cháu viết lại kết quả mong muốn của cháu bằng hình ảnh,để mọi người hiểu thêm vì cháu thấy mọi người có vẻ vẫn chưa hiểu hết.
Hình ảnh trước khi chạy code:
View attachment 264628

Kết quả sau khi chạy code:

View attachment 264629
Ngay bài đầu mình đã biết ý của bạn rồi, và thấy không hợp lý, phải thực hiện hàng loạt thao tác: Mở file, mở code, copy code, đóng file lưu, mở file. Chỉ cần bấm chuột phải trong folder đổi tên là xong
 
Upvote 0
Qua mô tả và yêu cầu của thớt thì tôi đoán như thế này:
Thực trạng:
Thớt gửi file cho người khác để nhập dữ liệu sau đó gửi lại cho thớt. Thớt có các file khác link tới file này nhưng do trong quá trình gửi qua gửi lại tên file bị thay đổi nên các file có link tới file gốc không cập nhật được dữ liệu.
Yêu cầu:
Khi mở file nhận từ người khác nếu tên không đúng thì sửa lại cho đúng để các file khác cập nhật được dữ liệu.
--
Mã:
Const sFolderName As String = "MyFolder"
Const sFileName As String = "nguon.xlsm"
Private Sub Workbook_Open()
Dim WB As Workbook, oFSO As Object, sFolderPath As String, sThisFileName As String
Set oFSO = CreateObject("Scripting.FileSystemObject")
sFolderPath = ThisWorkbook.Path
If LCase(oFSO.GetBaseName(sFolderPath)) = LCase(sFolderName) Then
    If LCase(ThisWorkbook.Name) <> LCase(sFileName) Then
        If (MsgBox("Ten file da bi sua, ban co muon sua lai khong?", vbYesNo) = vbYes) Then
            CloseWB sFileName
            If oFSO.FileExists(sFolderPath & "\" & sFileName) Then
                oFSO.GetFile(sFolderPath & "\" & sFileName).Name = Replace(sFileName, ".xlsm", "_" & Format(Format(Now(), "yymmdd hhmmss")) & ".xlsm")
            End If
            sThisFileName = ThisWorkbook.FullName
            ThisWorkbook.SaveAs sFolderPath & "\" & sFileName
            oFSO.DeleteFile sThisFileName, True
        End If
    End If
End If
End Sub
Private Sub CloseWB(sWBName As String)
    On Error Resume Next
    Workbooks(sWBName).Close True
End Sub
 

File đính kèm

Upvote 0
Qua mô tả và yêu cầu của thớt thì tôi đoán như thế này:
Thực trạng:
Thớt gửi file cho người khác để nhập dữ liệu sau đó gửi lại cho thớt. Thớt có các file khác link tới file này nhưng do trong quá trình gửi qua gửi lại tên file bị thay đổi nên các file có link tới file gốc không cập nhật được dữ liệu.
Yêu cầu:
Khi mở file nhận từ người khác nếu tên không đúng thì sửa lại cho đúng để các file khác cập nhật được dữ liệu.
--
Mã:
Const sFolderName As String = "MyFolder"
Const sFileName As String = "nguon.xlsm"
Private Sub Workbook_Open()
Dim WB As Workbook, oFSO As Object, sFolderPath As String, sThisFileName As String
Set oFSO = CreateObject("Scripting.FileSystemObject")
sFolderPath = ThisWorkbook.Path
If LCase(oFSO.GetBaseName(sFolderPath)) = LCase(sFolderName) Then
    If LCase(ThisWorkbook.Name) <> LCase(sFileName) Then
        If (MsgBox("Ten file da bi sua, ban co muon sua lai khong?", vbYesNo) = vbYes) Then
            CloseWB sFileName
            If oFSO.FileExists(sFolderPath & "\" & sFileName) Then
                oFSO.GetFile(sFolderPath & "\" & sFileName).Name = Replace(sFileName, ".xlsm", "_" & Format(Format(Now(), "yymmdd hhmmss")) & ".xlsm")
            End If
            sThisFileName = ThisWorkbook.FullName
            ThisWorkbook.SaveAs sFolderPath & "\" & sFileName
            oFSO.DeleteFile sThisFileName, True
        End If
    End If
End If
End Sub
Private Sub CloseWB(sWBName As String)
    On Error Resume Next
    Workbooks(sWBName).Close True
End Sub
Thực trạng và yêu cầu đúng như bác đang hiểu. Code hay quá:
Xử lý thêm trường hợp nằm trong tên thư mục cần xử lý cái này khá quan trong nếu không có cái này thư mục nào code cũng chạy.
Thêm lựa chọn backup lại file nguồn cũ (không xóa), cái này bác có thể xử lý thêm cho em tự tạo thêm thư mục có tên "Backup" nếu nó chưa có thư mục nằm trong thư mục "MyFolder" và di chuyển file nguồn cũ vào thư mục này được không để thư mục "MyFolder" không bị nhiều file, còn nếu có thư mục "Backup" rồi thì di chuyển file nguồn cũ vào thôi (không xóa hoặc tạo mới)
Cảm ơn bác rất nhiều.
 
Upvote 0
Ngay bài đầu mình đã biết ý của bạn rồi, và thấy không hợp lý, phải thực hiện hàng loạt thao tác: Mở file, mở code, copy code, đóng file lưu, mở file. Chỉ cần bấm chuột phải trong folder đổi tên là xong
Em công nhận để xử lý vấn đề này với người đã biết như em (hoặc những người biết nguyên nhân và xử lý được vấn đề) thì không sao có thể làm được nó rất đơn giản, có những file tên tiếng nước ngoài phải copy ra và dán vào, nhưng với người khác như đồng nghiệp mới,sếp nhiều tuổi, hay những người kiến thức cơ bản excel kém thậm trí chưa biết gì.. nên không biết nguyên nhân thao tác này này để sửa nên mới phải làm vậy bác.
 
Lần chỉnh sửa cuối:
Upvote 0
Thực trạng và yêu cầu đúng như bác đang hiểu. Code hay quá:
Xử lý thêm trường hợp nằm trong tên thư mục cần xử lý cái này khá quan trong nếu không có cái này thư mục nào code cũng chạy.
Thêm lựa chọn backup lại file nguồn cũ (không xóa), cái này bác có thể xử lý thêm cho em tự tạo thêm thư mục có tên "Backup" nếu nó chưa có thư mục nằm trong thư mục "MyFolder" và di chuyển file nguồn cũ vào thư mục này được không để thư mục "MyFolder" không bị nhiều file, còn nếu có thư mục "Backup" rồi thì di chuyển file nguồn cũ vào thôi (không xóa hoặc tạo mới)
Cảm ơn bác rất nhiều.
Chuyển file vào thư mục Backup theo yêu cầu của bạn.
Mã:
Const sFolderName As String = "MyFolder"
Const sFileName As String = "nguon.xlsm"
Private Sub Workbook_Open()
Dim WB As Workbook, oFSO As Object, sFolderPath As String, sThisFileName As String
Set oFSO = CreateObject("Scripting.FileSystemObject")
sFolderPath = ThisWorkbook.Path
If LCase(oFSO.GetBaseName(sFolderPath)) = LCase(sFolderName) Then
    sBackupPath = sFolderPath & "\Backup"
    If LCase(ThisWorkbook.Name) <> LCase(sFileName) Then
        If (MsgBox("Ten file da bi sua, ban co muon sua lai khong?", vbYesNo) = vbYes) Then
            CloseWB sFileName
            If oFSO.FileExists(sFolderPath & "\" & sFileName) Then
                If Not oFSO.FolderExists(sFolderPath & "\Backup") Then
                    oFSO.CreateFolder sFolderPath & "\Backup"
                End If
                oFSO.MoveFile sFolderPath & "\" & sFileName, sFolderPath & "\Backup\" & Replace(sFileName, ".xlsm", "_" & Format(Format(Now(), "yymmdd hhmmss")) & ".xlsm")
            End If
            sThisFileName = ThisWorkbook.FullName
            ThisWorkbook.SaveAs sFolderPath & "\" & sFileName
            oFSO.DeleteFile sThisFileName, True
        End If
    End If
End If
End Sub
Private Sub CloseWB(sWBName As String)
    On Error Resume Next
    Workbooks(sWBName).Close True
End Sub
 
Upvote 0
Chuyển file vào thư mục Backup theo yêu cầu của bạn.
Mã:
Const sFolderName As String = "MyFolder"
Const sFileName As String = "nguon.xlsm"
Private Sub Workbook_Open()
Dim WB As Workbook, oFSO As Object, sFolderPath As String, sThisFileName As String
Set oFSO = CreateObject("Scripting.FileSystemObject")
sFolderPath = ThisWorkbook.Path
If LCase(oFSO.GetBaseName(sFolderPath)) = LCase(sFolderName) Then
    sBackupPath = sFolderPath & "\Backup"
    If LCase(ThisWorkbook.Name) <> LCase(sFileName) Then
        If (MsgBox("Ten file da bi sua, ban co muon sua lai khong?", vbYesNo) = vbYes) Then
            CloseWB sFileName
            If oFSO.FileExists(sFolderPath & "\" & sFileName) Then
                If Not oFSO.FolderExists(sFolderPath & "\Backup") Then
                    oFSO.CreateFolder sFolderPath & "\Backup"
                End If
                oFSO.MoveFile sFolderPath & "\" & sFileName, sFolderPath & "\Backup\" & Replace(sFileName, ".xlsm", "_" & Format(Format(Now(), "yymmdd hhmmss")) & ".xlsm")
            End If
            sThisFileName = ThisWorkbook.FullName
            ThisWorkbook.SaveAs sFolderPath & "\" & sFileName
            oFSO.DeleteFile sThisFileName, True
        End If
    End If
End If
End Sub
Private Sub CloseWB(sWBName As String)
    On Error Resume Next
    Workbooks(sWBName).Close True
End Sub
Code rất chuyên nghiệp,em chưa thấy lỗi (vấn đề) xảy ra. À mà em không làm được nên nhờ vả không dám yêu cầu (@$%@ .
Cảm ơn bác nhiều.
 
Upvote 0

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

Back
Top Bottom