Tự động lưu file PDF (Cần khắc phục tình trạng trùng tên bị xóa file cũ)

Blue Softs epl Liên hệ QC

duchoa89

Thành viên mới
Tham gia
11/10/16
Bài viết
47
Được thích
1
Anh nào giúp em với được không ạ! trả là em đã xuất tự động lưu được PDF nhưng có lúc em in 1 phiếu 2 lần cùng tên thì toàn phiếu sau đè mất phiếu trước ! vậy có cách nào để phiếu sau có (1) hoặc (2) được không ạ. hay 1,2,3,4,5,6... cũng đc chỉ cần giữ được tên là đc ạ! Dưới là code của em để xuất File PDF ! mong anh chị giúp đỡ
filepdf = ThisWorkbook.Path & "\" & Range("G10") & ".pdf"
ActiveSheet.ExportAsFixedFormat xlTypePDF, filepdf
 

phuyen89

Thành viên tích cực
Tham gia
20/11/08
Bài viết
868
Được thích
332
Nghề nghiệp
Student
Anh nào giúp em với được không ạ! trả là em đã xuất tự động lưu được PDF nhưng có lúc em in 1 phiếu 2 lần cùng tên thì toàn phiếu sau đè mất phiếu trước ! vậy có cách nào để phiếu sau có (1) hoặc (2) được không ạ. hay 1,2,3,4,5,6... cũng đc chỉ cần giữ được tên là đc ạ! Dưới là code của em để xuất File PDF ! mong anh chị giúp đỡ
filepdf = ThisWorkbook.Path & "\" & Range("G10") & ".pdf"
ActiveSheet.ExportAsFixedFormat xlTypePDF, filepdf
- Hay là bạn thêm cái h:m:s vào Tên file. Cho lưu khỏi bị trùng.
 
Upvote 0

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,720
Được thích
53,722
Anh nào giúp em với được không ạ! trả là em đã xuất tự động lưu được PDF nhưng có lúc em in 1 phiếu 2 lần cùng tên thì toàn phiếu sau đè mất phiếu trước ! vậy có cách nào để phiếu sau có (1) hoặc (2) được không ạ. hay 1,2,3,4,5,6... cũng đc chỉ cần giữ được tên là đc ạ! Dưới là code của em để xuất File PDF ! mong anh chị giúp đỡ
filepdf = ThisWorkbook.Path & "\" & Range("G10") & ".pdf"
ActiveSheet.ExportAsFixedFormat xlTypePDF, filepdf
Bạn viết 1 hàm tự tạo để làm việc này là được rồi. Ví dụ:
- Bạn có đường dẫn file ThisWorkbook.Path & "\" & Range("G10") & ".pdf"
- Bạn không biết đường dẫn này có tồn tại hay không
- Vậy bạn viết 1 hàm tự tạo, chẳng hạn tên là CreateSaveFileName có tác dụng kiểm tra đường dẫn trên, nếu chưa tồn tại thì để nguyên, tồn tại rồi thì bằng cách gì đó thêm các hậu tố (1)... (2)... (3) vào đến khi nào tạo ra được đường dẫn khả dụng thì thôi
Mã:
Private Function CreateSaveFileName(ByVal FileName As String) As String
  Dim n As Long
  Dim sFolder As String, sFile As String, sExt As String, sTmpFile As String
  sTmpFile = FileName
  With CreateObject("Scripting.FileSystemObject")
    sExt = .GetExtensionName(FileName)
    sFolder = .GetParentFolderName(FileName)
    sFile = .GetBaseName(FileName)
    Do While .FileExists(sTmpFile) = True
      n = n + 1
      sTmpFile = .BuildPath(sFolder, sFile & "(" & n & ")." & sExt)
    Loop
    CreateSaveFileName = sTmpFile
  End With
End Function
Giờ áp dụng bạn chỉ cần thế này:
Mã:
Dim filepdf  as string
filepdf = CreateSaveFileName(ThisWorkbook.Path & "\" & Range("G10") & ".pdf")
ActiveSheet.ExportAsFixedFormat xlTypePDF, filepdf
Vậy là xong thôi!
----------------------
(code viết sơ qua, không biết có xuất hiện lỗi tào lao nào không? Mời kiểm tra thử nhé)
 
Upvote 0

duchoa89

Thành viên mới
Tham gia
11/10/16
Bài viết
47
Được thích
1
Bạn viết 1 hàm tự tạo để làm việc này là được rồi. Ví dụ:
- Bạn có đường dẫn file ThisWorkbook.Path & "\" & Range("G10") & ".pdf"
- Bạn không biết đường dẫn này có tồn tại hay không
- Vậy bạn viết 1 hàm tự tạo, chẳng hạn tên là CreateSaveFileName có tác dụng kiểm tra đường dẫn trên, nếu chưa tồn tại thì để nguyên, tồn tại rồi thì bằng cách gì đó thêm các hậu tố (1)... (2)... (3) vào đến khi nào tạo ra được đường dẫn khả dụng thì thôi
Mã:
Private Function CreateSaveFileName(ByVal FileName As String) As String
  Dim n As Long
  Dim sFolder As String, sFile As String, sExt As String, sTmpFile As String
  sTmpFile = FileName
  With CreateObject("Scripting.FileSystemObject")
    sExt = .GetExtensionName(FileName)
    sFolder = .GetParentFolderName(FileName)
    sFile = .GetBaseName(FileName)
    Do While .FileExists(sTmpFile) = True
      n = n + 1
      sTmpFile = .BuildPath(sFolder, sFile & "(" & n & ")." & sExt)
    Loop
    CreateSaveFileName = sTmpFile
  End With
End Function
Giờ áp dụng bạn chỉ cần thế này:
Mã:
Dim filepdf  as string
filepdf = CreateSaveFileName(ThisWorkbook.Path & "\" & Range("G10") & ".pdf")
ActiveSheet.ExportAsFixedFormat xlTypePDF, filepdf
Vậy là xong thôi!
----------------------
(code viết sơ qua, không biết có xuất hiện lỗi tào lao nào không? Mời kiểm tra thử nhé)
Không ổn rùi anh ơi!
 
Upvote 0

duchoa89

Thành viên mới
Tham gia
11/10/16
Bài viết
47
Được thích
1
Giờ còn đúng 1 việc cần nhờ ! là thêm giờ và phút thực tế vào tên file để không bị trùng nhau!
filepdf = ThisWorkbook.Path & "\" & Range("G10") & ".pdf"
ActiveSheet.ExportAsFixedFormat xlTypePDF, filepdf
 
Upvote 0

befaint

|||||||||||||
Tham gia
6/1/11
Bài viết
12,608
Được thích
15,789
Giờ còn đúng 1 việc cần nhờ ! là thêm giờ và phút thực tế vào tên file để không bị trùng nhau!
filepdf = ThisWorkbook.Path & "\" & Range("G10") & ".pdf"
ActiveSheet.ExportAsFixedFormat xlTypePDF, filepdf
PHP:
Dim sTime As String
sTime = "#" & Format(Now(), "dd/mm/yyyy#hh:mm:ss")
filepdf = ThisWorkbook.Path & "\" & Range("G10") & sTime & ".pdf"
 
Upvote 0

duchoa89

Thành viên mới
Tham gia
11/10/16
Bài viết
47
Được thích
1
Ưu điểm của mình là rất nhiệt tình trợ giúp trong khả năng có thể nhưng với những phản hồi kiểu như trên thì thật là.. mất hứng quá
hihi. XL anh nhé. Thật ra em mới mày mò về VBA vì thấy quá hữu dụng trong công việc thực tế. lúc chiều vì quá vội nên e trả lời hơi nhanh. :D
 
Upvote 0

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,720
Được thích
53,722
hihi. XL anh nhé. Thật ra em mới mày mò về VBA vì thấy quá hữu dụng trong công việc thực tế. lúc chiều vì quá vội nên e trả lời hơi nhanh. :D
- Tôi không quan trọng bạn trả lời nhanh chậm
- Tôi không quan trọng việc xưng hô hay văn chương cầu kỳ
...... vân.. vân...

Tôi chỉ quan tâm đến kỹ thuật nên cái tôi cần là mọi thứ phải RÕ RÀNG. Một câu "không ổn" thì giúp gì được cho bạn? Nếu code bị lỗi hoặc ra kết quả sai thì bạn phải cho tôi biết nó lỗi chỗ nào? Sai chỗ nào? Kết quả nếu đúng thì phải ra làm sao?...
Phản hồi ý kiến rất quan trọng! Bạn cần chú ý điểm này.
 
Upvote 0

duchoa89

Thành viên mới
Tham gia
11/10/16
Bài viết
47
Được thích
1
Em xin phép nhờ thêm 1 ý ngoài lề. Xin nhờ các anh chị trong diễn dàn chỉ dùm!
Em muốn khóa toàn bộ các kiểu in của excel sẵn có như (ctrl+p) bấm trên bouuton....
mà chỉ sử dụng nút lệnh VBA mới in được thì phải làm cách nào.
Mong các anh giúp đỡ.
 
Upvote 0

duchoa89

Thành viên mới
Tham gia
11/10/16
Bài viết
47
Được thích
1
- Tôi không quan trọng bạn trả lời nhanh chậm
- Tôi không quan trọng việc xưng hô hay văn chương cầu kỳ
...... vân.. vân...

Tôi chỉ quan tâm đến kỹ thuật nên cái tôi cần là mọi thứ phải RÕ RÀNG. Một câu "không ổn" thì giúp gì được cho bạn? Nếu code bị lỗi hoặc ra kết quả sai thì bạn phải cho tôi biết nó lỗi chỗ nào? Sai chỗ nào? Kết quả nếu đúng thì phải ra làm sao?...
Phản hồi ý kiến rất quan trọng! Bạn cần chú ý điểm này.
:D em đã tìm hiểu điều chỉnh cóp nhặt từ nhiều anh chị trong diễn dàn
filepdf = "C:\Users" & "\" & Range("i4") & "-" & Minute(Now()) & Second(Now())
ActiveSheet.ExportAsFixedFormat xlTypePDF, filepdf
Đây là đoạn mã em sử dụng và thấy chạy ổn định! Chỉ có điều việc copy file pdf đó sang chỗ chỗ khác là không làm đc! (Vì e chưa cần phải di chuyển file nên cũng ko gây khó khăn cho em)
hi cảm ơn anh đã nhiệt tình giúp đỡ. và em còn muốn khóa các kiểu in mặc định của excel để chỉ cho phép in bằng nút lệnh VBA !
Anh có cách gì không mách nước hộ e với ạ! :D
 
Upvote 0

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,720
Được thích
53,722
:D em đã tìm hiểu điều chỉnh cóp nhặt từ nhiều anh chị trong diễn dàn
filepdf = "C:\Users" & "\" & Range("i4") & "-" & Minute(Now()) & Second(Now())
ActiveSheet.ExportAsFixedFormat xlTypePDF, filepdf
Đây là đoạn mã em sử dụng và thấy chạy ổn định!
Bạn dùng số giây gán vào tên file để tạo sự phân biệt, vậy trong trường hợp bạn bấm lưu 2 phát liên tiếp trong cùng 1 thời điểm (tức bấm khi số giây chưa kịp nhảy sang số mới) thì tên file vẫn... trùng. Đương nhiên xác xuất xảy ra tình huống này rất thấp nhưng không phải là không thể
Anh có cách gì không mách nước hộ e với ạ! :D

Tôi chỉ có cách như ở bài 3 và tôi cho là ổn nhất. Tuy nhiên nếu bạn thấy cách của bạn ổn hơn thì cứ dùng, không có vấn đề gì cả
 
Upvote 0

duchoa89

Thành viên mới
Tham gia
11/10/16
Bài viết
47
Được thích
1
Bạn dùng số giây gán vào tên file để tạo sự phân biệt, vậy trong trường hợp bạn bấm lưu 2 phát liên tiếp trong cùng 1 thời điểm (tức bấm khi số giây chưa kịp nhảy sang số mới) thì tên file vẫn... trùng. Đương nhiên xác xuất xảy ra tình huống này rất thấp nhưng không phải là không thể


Tôi chỉ có cách như ở bài 3 và tôi cho là ổn nhất. Tuy nhiên nếu bạn thấy cách của bạn ổn hơn thì cứ dùng, không có vấn đề gì cả
Vì do mục đích sử dụng của em chỉ cần xem được in lần 2 và lần 1 nội dung có khác nhau không nên đành dùng thời gian để đánh dấu! hi không bị chèn mất file cũ là ok rùi :D
Mà đoạn code của 1 nút của em quá dài rùi:D
A có cách nòa chỉ cho phép file excel đó được in bằng nút Pint tự tạo không? Đại ý là chỉ ấn nút đó mới in được! do e còn đặt 1 số code nhập liệu nên muốn khóa in của excel. tránh trường hợp tự do in phiếu mà không có dữ liệu nhập:D
 
Upvote 0

duchoa89

Thành viên mới
Tham gia
11/10/16
Bài viết
47
Được thích
1
dùng sự kiện Before Print sợ không đc vì em vẫn cần in!
code:
Private Sub workbook_BeforePrint(Cancel As Boolean)
Cancel = True
MsgBox "Sorry, you cannot Print from this workbook", vbInformation
End Sub
 
Upvote 0

phuyen89

Thành viên tích cực
Tham gia
20/11/08
Bài viết
868
Được thích
332
Nghề nghiệp
Student
Bạn dùng số giây gán vào tên file để tạo sự phân biệt, vậy trong trường hợp bạn bấm lưu 2 phát liên tiếp trong cùng 1 thời điểm (tức bấm khi số giây chưa kịp nhảy sang số mới) thì tên file vẫn... trùng. Đương nhiên xác xuất xảy ra tình huống này rất thấp nhưng không phải là không thể


Tôi chỉ có cách như ở bài 3 và tôi cho là ổn nhất. Tuy nhiên nếu bạn thấy cách của bạn ổn hơn thì cứ dùng, không có vấn đề gì cả

Anh ndu, Em đã thử tạo 1 vòng lặp với 10 lần lặp, nhưng nó vẫn không trùng tên File. 10 lần lặp, nhưng File nó tạo được có 3,4 File à.Vẫn đúng số giây, nó mới tạo File.
 
Upvote 0

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,720
Được thích
53,722
Anh ndu, Em đã thử tạo 1 vòng lặp với 10 lần lặp, nhưng nó vẫn không trùng tên File. 10 lần lặp, nhưng File nó tạo được có 3,4 File à.Vẫn đúng số giây, nó mới tạo File.
Như tôi đã nói ở trên:
Đương nhiên xác xuất xảy ra tình huống này rất thấp nhưng không phải là không thể
Vậy trong trường hợp máy bạn cực mạnh, save file trong nháy mắt thì xác xuất này sẽ cao ngay!
Lập trình phải nói đến tính chính xác, không thể trong chờ chuyện hên xui!
 
Upvote 0

Huynh linh 0209

Thành viên mới
Tham gia
25/2/19
Bài viết
13
Được thích
0
PHP:
Dim sTime As String
sTime = "#" & Format(Now(), "dd/mm/yyyy#hh:mm:ss")
filepdf = ThisWorkbook.Path & "\" & Range("G10") & sTime & ".pdf"
Mọi người ơi giúp em với sao em làm theo câu lệnh này không ra vậy. nó chạy không được không à
Em muốn thêm ngày tháng vào câu lệnh này nè:
filepdf = ThisWorkbook.Path & "\" & Range("G10") & ".pdf"
ActiveSheet.ExportAsFixedFormat xlTypePDF, filepdf
 
Upvote 0

Quang_Hải

Thành viên gạo cội
Tham gia
21/2/09
Bài viết
5,869
Được thích
7,626
Nghề nghiệp
Làm đủ thứ
Mọi người ơi giúp em với sao em làm theo câu lệnh này không ra vậy. nó chạy không được không à
Em muốn thêm ngày tháng vào câu lệnh này nè:
filepdf = ThisWorkbook.Path & "\" & Range("G10") & ".pdf"
ActiveSheet.ExportAsFixedFormat xlTypePDF, filepdf

filepdf = ThisWorkbook.Path & "\" & Range("G10") & "_" & date
ActiveSheet.ExportAsFixedFormat xlTypePDF, filepdf
 
Upvote 0
Web KT
Top Bottom