Làm thế nào để hiện hình ảnh Copy thư mục khi sử dụng lệnh VBA

Liên hệ QC

hung2412

Thành viên tích cực
Tham gia
5/8/08
Bài viết
929
Được thích
240
Giới tính
Nam
Xin chào các bạn GPE!
Tôi có 1 vấn đề nhờ các bạn giúp cho. Tôi sử dụng VBA để copy Thư mục, nhưng vấn đề ở chỗ là khi copy bằng VBA thì con chỏ chuột nó chỉ xoay xoay chứ không hiện ra hình ảnh copy, tôi muốn hiện hình ảnh Copy như thế này thì làm thế nào?:
Untitled.png
Mong các bạn chỉ giúp cho tôi. Cảm ơn.
 
Lần chỉnh sửa cuối:
Xin chào các bạn GPE!
Tôi có 1 vấn đề nhờ các bạn giúp cho. Tôi sử dụng VBA để copy Thư mục, nhưng vấn đề ở chỗ là khi copy bằng VBA thì con chỏ chuột nó chỉ xoay xoay chứ không hiện ra hình ảnh copy, tôi muốn hiện hình ảnh Copy như thế này thì làm thế nào?:
View attachment 274348
Mong các bạn chỉ giúp cho tôi. Cảm ơn.
Bấm vào link View attachment 274348 thì báo lỗi, không xem được hình.
 
Upvote 0
Xin lỗi bạn, mình đã chỉnh lại bài #1, đã cập nhật hình ảnh lại rồi. Cảm ơn bạn.
Tôi hiểu bạn hỏi gì rồi. Theo tôi biết thì VBA Excel chỉ thực hiện thao tác copy thôi chứ không thể trình bày được hoạt ảnh copy của Windows Explorer.
 
Upvote 0
đoán thôi ... ko chắc 100/100
dùng API của windows copy là nó show lên cái tiến trình đó ...

đoán thêm tẹo nữa hình như trên GPE này khoãng 6 năm trước ai đó có Úp code rồi

trên VB6 thì thấy ai đó ko dùng API mà qua *.TLB

1649753676114.png
 
Lần chỉnh sửa cuối:
Upvote 0
chờ đi lão ý vào làm cho ... hoặc tìm trên GPE này lão làm sẳn rùi ... còn ta chỉ có xơi
Tôi thì cứ Google dịch sang tiếng Anh rồi theo đó mà search. Kết quả tìm được thế này (đã test):
Rich (BB code):
Option Explicit

Private Type SHFILEOPSTRUCT
        hwnd As Long
        wFunc As Long
        pFrom As String
        pTo As String
        fFlags As Integer
        fAnyOperationsAborted As Long
        hNameMappings As Long
        lpszProgressTitle As String
End Type


Private Declare Function SHFileOperation Lib "shell32.dll" _
Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long


Private Const FOF_ALLOWUNDO = &H40
Private Const FOF_NOCONFIRMATION = &H10
Private Const FO_COPY = &H2


Public Function apiFileCopy(src As String, dest As String, _
    Optional NoConfirm As Boolean = False) As Boolean


'PARAMETERS: src: Source File (FullPath)
            'dest: Destination File (FullPath or directory)
            'NoConfirm (Optional): If set to
            'true, no confirmation box
            'is displayed when overwriting
            'existing files, and no
            'copy progress dialog box is
            'displayed
            
            'Returns (True if Successful, false otherwise)
            
   Dim WinType_SFO As SHFILEOPSTRUCT
   Dim lRet As Long
   Dim lflags As Long
  
   lflags = FOF_ALLOWUNDO
   If NoConfirm Then lflags = lflags & FOF_NOCONFIRMATION
  
   With WinType_SFO
       .wFunc = FO_COPY
       .pFrom = src
       .pTo = dest
       .fFlags = lflags
   End With
  
   lRet = SHFileOperation(WinType_SFO)
   apiFileCopy = (lRet = 0)


End Function

Thủ tục test:
Rich (BB code):
Sub TestcopyFolder()
apiFileCopy "D:\Video", "D:\Video2", True
End Sub
 
Upvote 0
Tôi thì cứ Google dịch sang tiếng Anh rồi theo đó mà search. Kết quả tìm được thế này (đã test):
Rich (BB code):
Option Explicit

Private Type SHFILEOPSTRUCT
        hwnd As Long
        wFunc As Long
        pFrom As String
        pTo As String
        fFlags As Integer
        fAnyOperationsAborted As Long
        hNameMappings As Long
        lpszProgressTitle As String
End Type


Private Declare Function SHFileOperation Lib "shell32.dll" _
Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long


Private Const FOF_ALLOWUNDO = &H40
Private Const FOF_NOCONFIRMATION = &H10
Private Const FO_COPY = &H2


Public Function apiFileCopy(src As String, dest As String, _
    Optional NoConfirm As Boolean = False) As Boolean


'PARAMETERS: src: Source File (FullPath)
            'dest: Destination File (FullPath or directory)
            'NoConfirm (Optional): If set to
            'true, no confirmation box
            'is displayed when overwriting
            'existing files, and no
            'copy progress dialog box is
            'displayed
         
            'Returns (True if Successful, false otherwise)
         
   Dim WinType_SFO As SHFILEOPSTRUCT
   Dim lRet As Long
   Dim lflags As Long
 
   lflags = FOF_ALLOWUNDO
   If NoConfirm Then lflags = lflags & FOF_NOCONFIRMATION
 
   With WinType_SFO
       .wFunc = FO_COPY
       .pFrom = src
       .pTo = dest
       .fFlags = lflags
   End With
 
   lRet = SHFileOperation(WinType_SFO)
   apiFileCopy = (lRet = 0)


End Function

Thủ tục test:
Rich (BB code):
Sub TestcopyFolder()
apiFileCopy "D:\Video", "D:\Video2", True
End Sub
thực ra Google nó có gần như mọi thứ ... quan trong là có biết Copy và sử dụng + tùy chỉnh code hay ko thôi
nhiều code trên này những năm xa xưa ai đó keo mình viết ... tôi hay lang thang trên Google vô tình lại thấy xong lục xem lại các bài mới bất chợt nhận ra Google nó có trước đó rất nhiều năm còn ta thì có sau nó nhiều năm

Còn ai copy của ai thì tôi lại ko có biết -0-0-0-===\. ... âu đó cũng là lẻ thường trong cái thế giới ảo này thui
 
Upvote 0
Xin chào các bạn GPE!
Tôi có 1 vấn đề nhờ các bạn giúp cho. Tôi sử dụng VBA để copy Thư mục, nhưng vấn đề ở chỗ là khi copy bằng VBA thì con chỏ chuột nó chỉ xoay xoay chứ không hiện ra hình ảnh copy, tôi muốn hiện hình ảnh Copy như thế này thì làm thế nào?:
View attachment 274353
Mong các bạn chỉ giúp cho tôi. Cảm ơn.
Tôi viết hơn 8 năm về trước.

Bạn tải tập tin ở bài #9


Mở tập tin và đọc nội dung ở B15 để biết cách dùng. Sau đó nhấn nút CopyFolderAPI. Code sẽ copy. Còn nếu muốn theo dõi như bạn muốn thì sửa lại như hướng dẫn ở bài #13 (không có những đoạn tôi khoanh đỏ do GPE thêm vào).

copyapi.jpg

Nếu không muốn COPY mà muốn MOVE thì đọc thêm bài #17.
 
Upvote 0
Tôi thì cứ Google dịch sang tiếng Anh rồi theo đó mà search. Kết quả tìm được thế này (đã test):
Rich (BB code):
Option Explicit

Private Type SHFILEOPSTRUCT
        hwnd As Long
        wFunc As Long
        pFrom As String
        pTo As String
        fFlags As Integer
        fAnyOperationsAborted As Long
        hNameMappings As Long
        lpszProgressTitle As String
End Type


Private Declare Function SHFileOperation Lib "shell32.dll" _
Alias "SHFileOperationA" (lpFileOp As SHFILEOPSTRUCT) As Long


Private Const FOF_ALLOWUNDO = &H40
Private Const FOF_NOCONFIRMATION = &H10
Private Const FO_COPY = &H2


Public Function apiFileCopy(src As String, dest As String, _
    Optional NoConfirm As Boolean = False) As Boolean


'PARAMETERS: src: Source File (FullPath)
            'dest: Destination File (FullPath or directory)
            'NoConfirm (Optional): If set to
            'true, no confirmation box
            'is displayed when overwriting
            'existing files, and no
            'copy progress dialog box is
            'displayed
           
            'Returns (True if Successful, false otherwise)
           
   Dim WinType_SFO As SHFILEOPSTRUCT
   Dim lRet As Long
   Dim lflags As Long
 
   lflags = FOF_ALLOWUNDO
   If NoConfirm Then lflags = lflags & FOF_NOCONFIRMATION
 
   With WinType_SFO
       .wFunc = FO_COPY
       .pFrom = src
       .pTo = dest
       .fFlags = lflags
   End With
 
   lRet = SHFileOperation(WinType_SFO)
   apiFileCopy = (lRet = 0)


End Function

Thủ tục test:
Rich (BB code):
Sub TestcopyFolder()
apiFileCopy "D:\Video", "D:\Video2", True
End Sub
Cảm ơn bạn, code chạy được.
Ngoài lề tí. Mã QR Momo của bạn hình như bị lỗi hay sao ý, tôi thử quét mà chả được.
Bài đã được tự động gộp:

Tôi viết hơn 8 năm về trước.

Bạn tải tập tin ở bài #9


Mở tập tin và đọc nội dung ở B15 để biết cách dùng. Sau đó nhấn nút CopyFolderAPI. Code sẽ copy. Còn nếu muốn theo dõi như bạn muốn thì sửa lại như hướng dẫn ở bài #13 (không có những đoạn tôi khoanh đỏ do GPE thêm vào).

View attachment 274364

Nếu không muốn COPY mà muốn MOVE thì đọc thêm bài #17.
Cảm ơn bạn, tôi Download tập tin ở #9 về và thử chạy luôn. Tôi chưa chỉnh sửa Code (Chỗ đỏ đỏ như bạn hướng dẫn) mà nó vẫn hiện ra hình ảnh Copy như vầy:Untitled.png
Thế thì chả cần phải sửa đâu nhỉ?
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn, code chạy được.
Ngoài lề tí. Mã QR Momo của bạn hình như bị lỗi hay sao ý, tôi thử quét mà chả được.
Chức năng quét mã của Momo hình như có vấn đề. Tôi vừa thử cách đây mấy hôm mà không quét được.
 
Upvote 0
Cảm ơn bạn, tôi Download tập tin ở #9 về và thử chạy luôn. Tôi chưa chỉnh sửa Code (Chỗ đỏ đỏ như bạn hướng dẫn) mà nó vẫn hiện ra hình ảnh Copy như vầy:View attachment 274389
Thế thì chả cần phải sửa đâu nhỉ?
Trong những phiên bản cũ có một số cái khác. Cái khác lớn nhất trong Windows XP là:

1. khi không có flag FOF_SIMPLEPROGRESS
Trong cửa sổ copy có hiện Progressbar. Và hiện toàn bộ đường dẫn của từng tập tin đang được copy. Vd. bạn copy d:\MyFiles - chứa tập tin d:\MyFiles\hichic.txt và d:\MyFiles\blala.txt sang thư mục c:\temp. Như thế khi đang copy d:\MyFiles\hichic.txt thì bạn nhìn thấy hiện tên d:\MyFiles\hichic.txt, khi đang copy d:\MyFiles\blala.txt thì bạn nhìn thấy tên d:\MyFiles\blala.txt. Kết cục là bạn nhìn thấy ở "dòng" tên các tập tin đang copy các tên thay đổi liên tục, nếu các tập tin nhỏ thì chúng thay đổi đến chóng mặt (vùng khoanh đỏ).

copyxp.JPG

2. khi có flag FOF_SIMPLEPROGRESS
Trong cửa sổ copy có hiện Progressbar. Không hiển thị tên các tập tin trong quá trình copy.

Tôi nói luôn về 2 flag (FOF_NOCONFIRMATION Or FOF_NOCONFIRMMKDIR) trong bài mà bạn tải về.

Thực ra 2 flag đó tôi nhập cứng nhắc là không đúng.

Tôi giải thích để bạn tự quyết. Nếu không có các flag này mà tập tin cần copy đã tồn tại ở đích thì Windows sẽ hiện lên cửa sổ cảnh báo là tập tin đã tồn tại, có ghi đề không, có bỏ qua không ... Lúc đó bạn có cơ hội chọn ghi đè tất cả, ghi đè từng tập tin cụ thể. Bạn cứ thử bỏ 2 flag này đi rồi copy một thư mục 2 lần thì lần 2 sẽ được cảnh báo.

Còn nếu có 2 flag trên thì không có cửa sổ cảnh báo. Nếu có tập tin nào tồn tại thì Windows "âm thầm" ghi đè.

Bây giờ khi đã hiểu ý nghĩa các flag FOF_NOCONFIRMATION, FOF_NOCONFIRMMKDIR và FOF_SIMPLEPROGRESS thì bạn tự quyết định có thêm chúng hay không.
 
Lần chỉnh sửa cuối:
Upvote 0
chủ thớt thử vọc kiểu Windows xem ... nếu File tồn tại thì thêm cái chữ Copy vào tên File nữa
Thử copy File bất kỳ xong Paste cùng Folder là ra thôi

Xem hình he
1649848236709.png
 
Upvote 0
chủ thớt thử vọc kiểu Windows xem ... nếu File tồn tại thì thêm cái chữ Copy vào tên File nữa
Thử copy File bất kỳ xong Paste cùng Folder là ra thôi

Xem hình he
View attachment 274434
Cái bài #13 đã nói rõ rồi bạn. Bỏ 2 cái FOF_NOCONFIRMATION Or FOF_NOCONFIRMMKDIR thì nó sẽ hiện ra hộp thoại như vầy:
Untitled.png

Replace, skip hoặc Let me decide
Muốn có từ Copy ở đằng sau khi mà có File tồn tại thì chọn Let me decide
 
Upvote 0
Cái bài #13 đã nói rõ rồi bạn. Bỏ 2 cái FOF_NOCONFIRMATION Or FOF_NOCONFIRMMKDIR thì nó sẽ hiện ra hộp thoại như vầy:
View attachment 274437

Replace, skip hoặc Let me decide
Muốn có từ Copy ở đằng sau khi mà có File tồn tại thì chọn Let me decide
đọc thật kỹ lại đi....

1/ Muốn ko có cái thông báo đó thì viết lại code đó ... VD có 100000 File khi copy nó báo 100000 thì sao
2/ Lưu đè file nhiều khi lợi bất cập hại đấy ... VD 2 file tên trùng nhau mà cái ruột nó khác nhau thì sao ???!!!
...
Tôi chỉ nêu vấn đề còn ko tham gia
 
Upvote 0
đọc thật kỹ lại đi....

1/ Muốn ko có cái thông báo đó thì viết lại code đó ... VD có 100000 File khi copy nó báo 100000 thì sao
2/ Lưu đè file nhiều khi lợi bất cập hại đấy ... VD 2 file tên trùng nhau mà cái ruột nó khác nhau thì sao ???!!!
...
Tôi chỉ nêu vấn đề còn ko tham gia
OK bạn
1/ Muốn ko có cái thông báo đó thì viết lại code đó ... VD có 100000 File khi copy nó báo 100000 thì sao
=> Thực ra tôi không có nhu cầu về trường hợp này nên chưa muốn vọc, chắc là có cách thôi
2/ Lưu đè file nhiều khi lợi bất cập hại đấy ... VD 2 file tên trùng nhau mà cái ruột nó khác nhau thì sao ???!!!
=> Cái này thì tôi đã tính hết phương án rồi
Thanks!
 
Upvote 0
OK bạn

=> Thực ra tôi không có nhu cầu về trường hợp này nên chưa muốn vọc, chắc là có cách thôi

=> Cái này thì tôi đã tính hết phương án rồi
Thanks!
Bạn muốn làm thì phải phải đọc help. Đọc vài câu vô thưởng vô phạt của người ta bạn không làm được đâu, vì người ta đâu có hướng dẫn bạn.


Về flag thì có rất nhiều, bạn có thể đọc trong help.

Code mà bạn có là code để copy thư mục. Rõ ràng tên là CopyFolder mà.

Việc xét ở đích đã tồn tại dữ liệu cần copy hay không là xét THƯ MỤC. Tức trong trường hợp của bạn bạn copy thư mục Music sang F:, thì Windows sẽ xét xem đã có thư mục Music trên F: hay chưa, chứ nó không xét là liệu các tập tin TRONG thư mục MUSIC đã có trong F:\Music hay chưa. Bởi code đang copy THƯ MỤC.

Khi nào bạn copy các TẬP TIN thì lúc đó Windows mới xét liệu các TẬP TIN đã tồn tại ở đích hay chưa.

Nhu cầu copy rất nhiều tập tin có khi nào? Vd. bạn viết code tìm tất cả các tập tin "em yêu*.jpg" trên đĩa D: rồi copy các tập tin đó sang F:

Tức copy vd. "em yêu - hôn môi bên Hồ Tây.jpg", "em yêu - xem ngực.jpg", "em yêu hè 2018.jpg", "em yêu đi chơi Đà Lạt.jpg".

Trong trường hợp tổng quát thì lpFileOp.pFrom có dạng:

lpFileOp.pFrom = <đường dẫn 1> & vbNullChar & <đường dẫn 2> & vbNullChar & ... & <đường dẫn n> & vbNullChar & vbNullChar

Trong đó <đường dẫn 1>, <đường dẫn 2>, ..., <đường dẫn n> là tên đầy đủ của các thư mục hoặc các TẬP TIN. Các tập tin hoặc thư mục được ngăn cách bởi 1 ký tự vbNullChar, và ở cuối được thêm 2 ký tự vbNullChar.

Khi copy các tập tin thì Windows sẽ xét xem liệu các TẬP TIN cần copy đã tồn tại ở đích chưa.

1. Nếu là copy THƯ MỤC thì chỉ cần

lpFileOp.fFlags = FOF_NOCONFIRMMKDIR

2. Nếu copy TẬP TIN thì chỉ cần

lpFileOp.fFlags = FOF_NOCONFIRMATION

Trong cả 2 trường hợp nếu THƯ MỤC hoặc tập tin đã tồn tại ở đích thì sẽ bị ghi đè. Nhưng nếu bỏ flag đi thì Windows lại hiển thị thông báo và hỏi. Nếu bạn muốn copy với chủ định là khi THƯ MỤC hay TẬP TIN đã tồn tại ở đích thì tạo ở đích BẢN SAO thì làm như sau:

lpFileOp.fFlags = FOF_RENAMEONCOLLISION ' Đổi tên khi có xung đột

--------------
Bạn hãy dán code sau vào tập tin bạn đã tải về để copy các TẬP TIN. Hãy chạy sub test 2 lần với cùng các tập tin. Sau đó cũng chạy 2 lần nhưng với lpFileOp.fFlags = FOF_RENAMEONCOLLISION thì bạn sẽ thấy khác nhau

Mã:
Private Const FOF_RENAMEONCOLLISION = &H8





...........

Sub CopyFiles(files(), ByVal destFolder As String)
'   copy cac tap tin co ten (duong dan day du) trong mang files sang thu muc co ten la (duong dan day du) destFolder

Dim k As Long, filenames As String, lpFileOp As SHFILEOPSTRUCT
    On Error GoTo end_
    filenames = files(1)
    For k = 2 To UBound(files)
        filenames = filenames & vbNullChar & files(k)
    Next k
    filenames = filenames & vbNullChar & vbNullChar
    On Error GoTo 0
 
    lpFileOp.fFlags = FOF_NOCONFIRMATION    ' không hỏi mà âm thầm ghi đè.
    lpFileOp.pFrom = filenames
    lpFileOp.wFunc = FO_COPY
    lpFileOp.pTo = destFolder & vbNullChar & vbNullChar
 
    SHFileOperation lpFileOp
end_:
End Sub

Sub test()
'    vd.  copy "d:\chi giao.jpg" va "d:\konto.docx" sang thu muc "c:\Thong bao"
Dim files()
    ReDim files(1 To 2)
    files(1) = "d:\chi giao.jpg"
    files(2) = "d:\konto.docx"
    CopyFiles files, "c:\Thong bao"
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
chủ thớt thử vọc kiểu Windows xem ... nếu File tồn tại thì thêm cái chữ Copy vào tên File nữa
Thử copy File bất kỳ xong Paste cùng Folder là ra thôi

Xem hình he
View attachment 274434

Cóp pi đè thì xơi được luôn anh ơi.
Còn cóp pi không đè là mệt đấy. Ví dụ có file A copy, file A copy(1) tới ba ngàn rồi, giờ thêm phát ba ngàn lẻ một hơi chóng mặt.
 
Upvote 0
Cóp pi đè thì xơi được luôn anh ơi.
Còn cóp pi không đè là mệt đấy. Ví dụ có file A copy, file A copy(1) tới ba ngàn rồi, giờ thêm phát ba ngàn lẻ một hơi chóng mặt.
Có đáp án rồi bạn ơi, ở bài #18 của bạn batman1, nó tự động thêm chữ Copy khi Thư mục đã tồn tại
 
Upvote 0
Web KT

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

Back
Top Bottom