MÃ VBA ĐỂ LƯU NHƯ MỘT PHIÊN BẢN MỚI NẾU TỆP ĐÃ CÓ SẴN

KIỂM SOÁT PHIÊN BẢN

Việc theo dõi các phiên bản khác nhau của một tệp luôn khiến tôi đau đầu. Tôi biết ơn rằng mình có quyền truy cập Microsoft SharePoint ở công ty và có khả năng dễ dàng lưu phiên bản mới mà chẳng cần suy nghĩ. Tuy nhiên, tôi đã nhận được một câu hỏi từ một độc giả có tên Kauket, hỏi rằng liệu có khả thi khi tự động lưu phiên bản mới của một tệp. Đây là một câu hỏi rất hay và thật sự khiến tôi phải suy nghĩ. Hãy bàn về cách mà cá nhân tôi xử lý vấn đề này và xem xem chúng ta có thể nghĩ ra một giải pháp hiệu quả hay không.

LÔGIC

Đầu tiên, hãy suy nghĩ về cái mà chúng ta sẽ cần lập trình. Dưới đây, tôi sẽ liệt kê vài tính năng quan trọng mà mã VBA của chúng ta cần có:

  • Xác định liệu phiên bản trước đã tồn tại hay chưa
  • Xác định nơi tệp được lưu (hay liệu nó có được lưu hay không)
  • Tạo phiên bản mới có tên mở rộng (ví dụ thêm “_v2” vào cuối tên tệp)

Tôi quyết định viết mã cho Excel cũng như Microsoft Word và PowerPoint phòng khi bạn muốn sử dụng cùng một quá trình cho văn bản và bài thuyết trình của mình. Thật may, không có quá nhiều điểm khác biệt giữa ba bộ macro này.

TÍNH NĂNG XÁC ĐỊNH LIỆU TỆP CÓ TỒN TẠI HAY CHƯA

Để mã chính VBA hoạt động, bạn sẽ cần sử dụng một tính năng nhỏ xác định liệu một tệp cụ thể (thông qua đường truyền tệp) đã tồn tại trong máy tính hay chưa. Điều này rất quan trọng để xác định số phiên bản phù hợp để sử dụng. Tôi tìm thấy một bài viết hay trên trang web Ron de Bruin viết một cách chi tiết về các cách khác nhau để kiểm tra xem liệu một thứ gì đó đã tồn tại bằng mã VBA. Hãy chắc rằng bạn sẽ xem qua bài viết đầy đủ của anh ấy, Test if Folder, File or Sheet Exists or File is Open (Kiểm tra xem danh mục, tệp hay trang tính có tồn tại chưa hay tệp có đang mở hay không) vì nó là một bài viết đáng đọc. Mã tính năng dưới đây là những gì tôi có thể chắt lọc từ bài viết của Ron.

Hãy chắc rằng bạn thêm tính năng này vào cùng với bất kỳ phiên bản mã macro ứng dụng nào – phiên bản được hiển thị bên dưới. Bạn có thể chỉ dán mã dưới đây vào dưới thủ tục con hoặc Excel, PowerPoint, hay Word.

Function FileExist(FilePath As String) As Boolean
‘PURPOSE: Test to see if a file exists or not
‘SOURCE: www.TheSpreadsheetGuru.com/The-Code-Vault
‘RESOURCE: http://www.rondebruin.nl/win/s9/win003.htmDim TestStr As String’Test File Path (ie “C:\Users\Chris\Desktop\Test\book1.xlsm”)
On Error Resume Next
TestStr = Dir(FilePath)
On Error GoTo 0

‘Determine if File exists
If TestStr = “” Then
FileExist = False
Else
FileExist = True
End If

End Function

 

MÃ VBA VỀ VIỆC KIỂM SOÁT PHIÊN BẢN DÀNH CHO EXCEL

Hãy bắt đầu với phiên bản Excel của mã VBA, vì tôi đặt giả thiết rằng hầu hết các bạn đọc đều hứng thú với việc sử dụng tính năng kiểm soát phiên bản bên trong Excel (vì bạn là một trong những độc giả của tôi). Mã chỉ có một nhập liệu và điều này có thể khiến bạn muốn thay đổi và nhập liệu này chính là biến mã VersionExt. Tôi thêm phần mở rộng mặc định “_v” (cụ thể là myReport_v2.xlsx) nhưng bạn có thể thay đổi nó một cách dễ dàng thành “_v” (cụ thể là myReport v2.xlsx) hay bất cứ phần mở rộng nào bạn muốn hay cần. Hãy chắc rằng bạn để lại bình luận bên dưới nếu bạn có bất cứ thắc mắc nào về việc thay đổi mã VBA.

Xin hãy lưu ý rằng bạn sẽ cần mã FileExist Function (nằm trên phần này) dán vào môđun mã. Nếu bạn cần một bài hướng dẫn về cách chèn một macro vào Microsoft Excel để sử dụng macro này trong bất cứ cửa sổ Excel nào của bạn, bạn có thể xem qua bài viết mà tôi viết trước đây có tên How to Create A Personal Macro File (Cách tạo một tệp macro cá nhân).

Sub SaveNewVersion_Excel()
‘PURPOSE: Save file, if already exists add a new version indicator to filename
‘SOURCE: www.TheSpreadsheetGuru.com/The-Code-VaultDim FolderPath As String
Dim myPath As String
Dim SaveName As String
Dim SaveExt As String
Dim VersionExt As String
Dim Saved As Boolean
Dim x As LongTestStr = “”
Saved = False
x = 2

‘Version Indicator (change to liking)
VersionExt = “_v”

‘Pull info about file
On Error GoTo NotSavedYet
myPath = ActiveWorkbook.FullName
myFileName = Mid(myPath, InStrRev(myPath, “\”) + 1, InStrRev(myPath, “.”) – InStrRev(myPath, “\”) – 1)
FolderPath = Left(myPath, InStrRev(myPath, “\”))
SaveExt = “.” & Right(myPath, Len(myPath) – InStrRev(myPath, “.”))
On Error GoTo 0

‘Determine Base File Name
If InStr(1, myFileName, VersionExt) > 1 Then
myArray = Split(myFileName, VersionExt)
SaveName = myArray(0)
Else
SaveName = myFileName
End If

‘Test to see if file name already exists
If FileExist(FolderPath & SaveName & SaveExt) = False Then
ActiveWorkbook.SaveAs FolderPath & SaveName & SaveExt
Exit Sub
End If

‘Need a new version made
Do While Saved = False
If FileExist(FolderPath & SaveName & VersionExt & x & SaveExt) = False Then
ActiveWorkbook.SaveAs FolderPath & SaveName & VersionExt & x & SaveExt
Saved = True
Else
x = x + 1
End If
Loop

‘New version saved
MsgBox “New file version saved (version ” & x & “)”

Exit Sub

‘Error Handler
NotSavedYet:
MsgBox “This file has not been initially saved. ” & _
“Cannot save a new version!”, vbCritical, “Not Saved To Computer”

End Sub

MÃ VBA VỀ VIỆC KIỂM SOÁT PHIÊN BẢN DÀNH CHO MICROSOFT WORD

Điều duy nhất bạn cần thay đổi từ mã VBA Excel đầu tiên chính là thay đổi ActiveWorkbook thành ActiveDocument. Những thứ còn lại đều giống hệt!

Xin hãy lưu ý rằng bạn sẽ cần mã FileExist Function (nằm gần phía trên cùng bài viết này) dán vào môđun mã. Nếu bạn cần một bài hướng dẫn về cách chèn một macro vào Microsoft Word để sử dụng macro này trong bất cứ Word Documents nào của bạn, bạn có thể xem qua bài viết mà tôi viết trước đây có tên How to Create A Personal Macro File (Cách tạo một tệp macro cá nhân).

Sub SaveNewVersion_Word()
‘PURPOSE: Save file, if already exists add a new version indicator to filename
‘SOURCE: www.TheSpreadsheetGuru.com/The-Code-VaultDim FolderPath As String
Dim myPath As String
Dim SaveName As String
Dim SaveExt As String
Dim VersionExt As String
Dim Saved As Boolean
Dim x As LongTestStr = “”
Saved = False
x = 2

‘Version Indicator (change to liking)
VersionExt = “_v”

‘Pull info about file
On Error GoTo NotSavedYet
myPath = ActiveDocument.FullName
myFileName = Mid(myPath, InStrRev(myPath, “\”) + 1, InStrRev(myPath, “.”) – InStrRev(myPath, “\”) – 1)
FolderPath = Left(myPath, InStrRev(myPath, “\”))
SaveExt = “.” & Right(myPath, Len(myPath) – InStrRev(myPath, “.”))
On Error GoTo 0

‘Determine Base File Name
If InStr(1, myFileName, VersionExt) > 1 Then
myArray = Split(myFileName, VersionExt)
SaveName = myArray(0)
Else
SaveName = myFileName
End If

‘Test to see if file name already exists
If FileExist(FolderPath & SaveName & SaveExt) = False Then
ActiveDocument.SaveAs FolderPath & SaveName & SaveExt
Exit Sub
End If

‘Need a new version made
Do While Saved = False
If FileExist(FolderPath & SaveName & VersionExt & x & SaveExt) = False Then
ActiveDocument.SaveAs FolderPath & SaveName & VersionExt & x & SaveExt
Saved = True
Else
x = x + 1
End If
Loop

‘New version saved
MsgBox “New file version saved (version ” & x & “)”

Exit Sub

‘Error Handler
NotSavedYet:
MsgBox “This file has not been initially saved. ” & _
“Cannot save a new version!”, vbCritical, “Not Saved To Computer”

End Sub

MÃ VBA VỀ VIỆC KIỂM SOÁT PHIÊN BẢN DÀNH CHO POWERPOINT

Cũng tương tự như phiên bản Microsoft Word, điều duy nhất bạn cần thay đổi từ mã VBA Excel đầu tiên chính là đổi ActiveWorkbook thành ActivePresentation. Những thứ còn lại đều giống hệt!

Xin hãy lưu ý rằng bạn sẽ cần mã FileExist Function (nằm gần phía trên cùng bài viết này) dán vào môđun mã. Nếu bạn cần một bài hướng dẫn về cách chèn một macro vào PowerPoint để sử dụng macro này trong bất cứ bài thuyết trình nào của bạn, bạn có thể xem qua bài viết mà tôi viết trước đây có tên How to Create A Personal Macro File (Cách tạo một tệp macro cá nhân).

Sub SaveNewVersion_PowerPoint()
‘PURPOSE: Save file, if already exists add a new version indicator to filename
‘SOURCE: www.TheSpreadsheetGuru.com/The-Code-VaultDim FolderPath As String
Dim myPath As String
Dim SaveName As String
Dim SaveExt As String
Dim VersionExt As String
Dim Saved As Boolean
Dim x As LongTestStr = “”
Saved = False
x = 2

‘Version Indicator (change to liking)
VersionExt = “_v”

‘Pull info about file
On Error GoTo NotSavedYet
myPath = ActivePresentation.FullName
myFileName = Mid(myPath, InStrRev(myPath, “\”) + 1, InStrRev(myPath, “.”) – InStrRev(myPath, “\”) – 1)
FolderPath = Left(myPath, InStrRev(myPath, “\”))
SaveExt = “.” & Right(myPath, Len(myPath) – InStrRev(myPath, “.”))
On Error GoTo 0

‘Determine if file has ever been saved
If FolderPath = “” Then
MsgBox “This file has not been initially saved. ” & _
“Cannot save a new version!”, vbCritical, “Not Saved To Computer”
Exit Sub
End If

‘Determine Base File Name
If InStr(1, myFileName, VersionExt) > 1 Then
myArray = Split(myFileName, VersionExt)
SaveName = myArray(0)
Else
SaveName = myFileName
End If

‘Test to see if file name already exists
If FileExist(FolderPath & SaveName & SaveExt) = False Then
ActivePresentation.SaveAs FolderPath & SaveName & SaveExt
Exit Sub
End If

‘Need a new version made
Do While Saved = False
If FileExist(FolderPath & SaveName & VersionExt & x & SaveExt) = False Then
ActivePresentation.SaveAs FolderPath & SaveName & VersionExt & x & SaveExt
Saved = True
Else
x = x + 1
End If
Loop

‘New version saved
MsgBox “New file version saved (version ” & x & “)”

Exit Sub

‘Error Handler
NotSavedYet:
MsgBox “This file has not been initially saved. ” & _
“Cannot save a new version!”, vbCritical, “Not Saved To Computer”

End Sub

 

HÃY CHUẨN BỊ VÀ HÃY CÓ TỔ CHỨC

Tôi không thể nói cho bạn biết rằng việc giữ các phiên bản của cùng một tệp quan trọng đến nhường nào. Điều này không chỉ giúp bạn tiết kiệm thời gian nếu tệp hiện thời của bạn có lỗi, mà còn cho phép bạn đi đến phiên bản trước nếu bạn quyết định (hay bị bắt buộc) thực hiện dự án theo một hướng hoàn toàn mới. Tôi đã đề cập hai lần việc có tổ chức trong bài viết này (SharePoint và việc tạo phần mở rộng phiên bản của riêng bạn); có các cách hay chương trình nào khác giúp bạn sắp xếp lịch sử tệp của bạn không? Hãy để lại bình luận bên dưới nếu bạn sẵn lòng chia sẻ! Tôi rất háo hức được đọc ý kiến của các bạn.

LÀM THẾ NÀO TÔI CÓ THỂ ĐIỀU CHỈNH CÁI NÀY CHO PHÙ HỢP VỚI NHU CẦU CỦA MÌNH?

Có nhiều khả năng là bài viết này không đưa ra câu trả lời mà bạn mong muốn. Tất cả chúng ta đều có các tình huống khác nhau và thật sự không thể để đáp ứng hết các nhu cầu mà mọi người có. Đó là lý do tôi muốn chia sẻ với bạn: My Guide to Getting the Solution to your Problems FAST! (Hướng dẫn của tôi nhằm giúp giải quyết vẫn đề của bạn một cách nhanh chóng!). Trong bài viết này, tôi đã giải thích các cách tốt nhất mà tôi đã nghĩ ra qua các năm nhằm giúp đưa ra câu trả lời đơn giản cho các vấn đề phức tạp trong Excel, PowerPoint, VBA, và còn nhiều nữa!

Tôi khuyên bạn nên xem qua bài hướng dẫn đó trước khi hỏi tôi hay bất kỳ ai trong phần bình luận bên dưới nhằm giải quyết vấn đề cụ thể của riêng bạn. Tôi có thể đảm bảo rằng hết 10 lần thì có 9 lần, một trong những phương pháp của tôi có thể giúp bạn tìm ra câu trả lời nhanh hơn so với khi bạn chờ tôi trả lời đấy. Tôi nỗ lực hết mình để giúp tất cả mọi người, nhưng đôi khi tôi không có đủ thời gian để trả lời tất cả câu hỏi (chẳng bao giờ có đủ thời gian trong một ngày cả!).

Chúc may mắn và tôi hy vọng bài hướng dẫn này sẽ giúp bạn đi đúng hướng!

 

 


Tác giả: dtnguyen (Nguyễn Đức Thanh)

@ Học Excel Online | DTNguyen.business
· · ·

Khóa học mới xuất bản