Nhờ viết Code biến tất cả các Cell trên toàn bộ các Sheet của file thành Value (1 người xem)

Liên hệ QC

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

nguyenmanhnam

Thành viên tiêu biểu
Tham gia
24/7/10
Bài viết
434
Được thích
266
Em tổng hợp số liệu trong các tuần (bọn em có nhiều xí nghiệp, mỗi xí nghiệp có khoảng 30sheet tương ứng với 30 tuần), em muốn tất cả các ô trong tất cả các Sheet của file đó chuyển thành Value hết (tương đương Copy-->Paste Value), nếu em làm thủ công tương đối lâu.

Nhờ các thày viết dùm em Code giúp em (nếu chuyển được cho nhiều file Excel trong 1 folder thì càng tốt, em đỡ phải mở từng file lên).
 
Bạn hãy phát triển luôn theo cái ý tưởng của bạn: Copy --> Paste Value
Mã:
    Range("A1:IV65536").Copy    
     Range("A1").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
Có thể nâng cấp thành cái Add-In, gán phím ...
 
Upvote 0
Em tổng hợp số liệu trong các tuần (bọn em có nhiều xí nghiệp, mỗi xí nghiệp có khoảng 30sheet tương ứng với 30 tuần), em muốn tất cả các ô trong tất cả các Sheet của file đó chuyển thành Value hết (tương đương Copy-->Paste Value), nếu em làm thủ công tương đối lâu.

Nhờ các thày viết dùm em Code giúp em (nếu chuyển được cho nhiều file Excel trong 1 folder thì càng tốt, em đỡ phải mở từng file lên).
Thí nghiệm vầy xem:
PHP:
Sub Test()
  Dim wks As Worksheet, aRes
  For Each wks In ThisWorkbook.Worksheets
    aRes = wks.UsedRange.Value
    wks.UsedRange.Value = aRes
  Next
End Sub
 
Upvote 0
Thí nghiệm vầy xem:
PHP:
Sub Test()
  Dim wks As Worksheet, aRes
  For Each wks In ThisWorkbook.Worksheets
    aRes = wks.UsedRange.Value
    wks.UsedRange.Value = aRes
  Next
End Sub

Code trên chạy cho 1 file rất ngon lành rồi thày ah, xin cho em mạo muội hỏi thử có cách nào mà nó chuyển hàng loạt cho tất cả các File trong 1 folder không (không cần phải mở các file này ra, chỉ cần chỉ đến thư mục chứa nó thôi)
 
Upvote 0
Thí nghiệm vầy xem:
PHP:
Sub Test()
  Dim wks As Worksheet, aRes
  For Each wks In ThisWorkbook.Worksheets
    aRes = wks.UsedRange.Value
    wks.UsedRange.Value = aRes
  Next
End Sub
Tại sao không phải là wks.UsedRange.Value = wks.UsedRange.Value mà phải dùng 2 câu lệnh cho mất công vậy anh? Em thử câu lệnh này thấy OK mà.
 
Upvote 0
Tại sao không phải là wks.UsedRange.Value = wks.UsedRange.Value mà phải dùng 2 câu lệnh cho mất công vậy anh? Em thử câu lệnh này thấy OK mà.

Đúng là không sai gì cả, nhưng có lẽ Thầy mình muốn tường minh một tí nên phân ra làm 2 lần đó mà!
 
Upvote 0
Tại sao không phải là wks.UsedRange.Value = wks.UsedRange.Value mà phải dùng 2 câu lệnh cho mất công vậy anh? Em thử câu lệnh này thấy OK mà.

Sao mà mất công được! Phải có nguyên nhân của nó chứ
Tôi vẫn tin rằng thông qua 1 biến mảng sẽ cho tốc độ nhanh hơn là gán trực tiếp (vụ này chúng ta đã từng trải nghiệm nhiều lần rồi)
------------------------
Code trên chạy cho 1 file rất ngon lành rồi thày ah, xin cho em mạo muội hỏi thử có cách nào mà nó chuyển hàng loạt cho tất cả các File trong 1 folder không (không cần phải mở các file này ra, chỉ cần chỉ đến thư mục chứa nó thôi)
Cách củi bắp nhất là dùng vòng lập duyệt qua tất cả các file trong folder, xong Workbooks.Open(file) ---> Mở lên rồi duyệt từng sheet và gán value như code đã cho ở trên
Tuy nhiên tôi nghĩ cách này chẳng hay ho gỉ (rất nhiều nguyên nhân khiến cho code bị lỗi). Vậy nên có thể dùng ADO chăng?
 
Lần chỉnh sửa cuối:
Upvote 0
Sao mà mất công được! Phải có nguyên nhân của nó chứ
Tôi vẫn tin rằng thông qua 1 biến mảng sẽ cho tốc độ nhanh hơn là gán trực tiếp (vụ này chúng ta đã từng trải nghiệm nhiều lần rồi)
------------------------

Cách củi bắp nhất là dùng vòng lập duyệt qua tất cả các file trong folder, xong Workbooks.Open(file) ---> Mở lên rồi duyệt từng sheet và gán value như code đã cho ở trên
Tuy nhiên tôi nghĩ cách này chẳng hay ho gỉ (rất nhiều nguyên nhân khiến cho code bị lỗi). Vậy nên có thể dùng ADO chăng?

Đúng là nhiều nguyên nhân phát sinh ra lỗi, kể cả việc khóa sheet, định dạng Mergecell, Autofilter ...

Thế nếu ADO thì Thầy viết như thế nào ạ?
 
Upvote 0
Sao mà mất công được! Phải có nguyên nhân của nó chứ
Tôi vẫn tin rằng thông qua 1 biến mảng sẽ cho tốc độ nhanh hơn là gán trực tiếp (vụ này chúng ta đã từng trải nghiệm nhiều lần rồi)
------------------------

Cách củi bắp nhất là dùng vòng lập duyệt qua tất cả các file trong folder, xong Workbooks.Open(file) ---> Mở lên rồi duyệt từng sheet và gán value như code đã cho ở trên
Tuy nhiên tôi nghĩ cách này chẳng hay ho gỉ (rất nhiều nguyên nhân khiến cho code bị lỗi). Vậy nên có thể dùng ADO chăng?

Thưa thày, cách gì cũng được ah, mong thày giúp cho.
 
Upvote 0
Thưa thày, cách gì cũng được ah, mong thày giúp cho.

Nếu là cách Open từng workbook thì đâu có gì khó ---> Để mọi người làm giúp bạn
Tuy nhiên tôi nghĩ cách này sẽ hàm chứa rất nhiều rủi ro, chẳng hạn file cần mở bị name rác, style rác vân vân... đến mức không thể mở được thì code có khác năng bị lỗi
--------------
- Nếu dùng cách mở file thông thường, các cao thủ khác sẽ giúp
- Nếu dùng ADO, tôi nghĩ rằng Hai Lúa có thể giúp
Chờ nhé
 
Upvote 0
Nói về ADO, Nghĩa còn rành hơn tôi... Vậy Nghĩa thử nghiệm xem

Thật tình là gần như toàn bộ kiến thức về Excel cũng như VBA mà em có được là nhờ diễn đàn này, nhờ vào sự chỉ dạy, hướng dẫn, giúp đỡ của các cao thủ như Thầy, chứ như Thầy nói thì em không dám đâu. Nhưng vấn đề này em sẽ cố gắng thử.
(em không thích dạng bài này nên làm biếng nghiên cứu quá!)
 
Lần chỉnh sửa cuối:
Upvote 0
Viết thử thế này xem có giúp gì được cho chủ topic hay không. Lưu ý là excel 2003 nhé.
Copy code này vào 1 file tạm nào đó (file trống không chứa dữ liệu cần copy giá trị nha) trong folder của các file cần copy giá trị
Nếu có gì không ổn thì các anh góp ý giúp nhé

PHP:
Sub Lay_Giatri()
Application.ScreenUpdating = False
 Dim strFile As String, strPath As String
 Dim r As Integer, sh As Worksheet, dulieu
 strPath = ThisWorkbook.Path & "\"
 strFile = Dir(strPath & "*.xls")
    Do While Len(strFile) > 0
      If strFile <> ThisWorkbook.Name Then
        Workbooks.Open (strPath & strFile)
            For Each sh In ActiveWorkbook.Worksheets
               dulieu = sh.UsedRange.Value
               sh.UsedRange.Value = dulieu
            Next
         Workbooks(strFile).Close True
      End If
      strFile = Dir()
    Loop
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Viết thử thế này xem có giúp gì được cho chủ topic hay không. Lưu ý là excel 2003 nhé.
Copy code này vào 1 file tạm nào đó (file trống không chứa dữ liệu cần copy giá trị nha) trong folder của các file cần copy giá trị
Nếu có gì không ổn thì các anh góp ý giúp nhé

PHP:
Sub Lay_Giatri()
Application.ScreenUpdating = False
 Dim strFile As String, strPath As String
 Dim r As Integer, sh As Worksheet, dulieu
 strPath = ThisWorkbook.Path & "\"
 strFile = Dir(strPath & "*.xls")
    Do While Len(strFile) > 0
      If strFile <> ThisWorkbook.Name Then
        Workbooks.Open (strPath & strFile)
            For Each sh In ActiveWorkbook.Worksheets
               dulieu = sh.UsedRange.Value
               sh.UsedRange.Value = sh.UsedRange.Value
            Next
         Workbooks(strFile).Close True
      End If
      strFile = Dir()
    Loop
Application.ScreenUpdating = True
End Sub

Đã dulieu = sh.UsedRange.Value thì đáng ra sh.UsedRange.Value = dulieu chứ. Nếu không thì việc tạo mảng bằng thừa ?. Việc tạo biến mảng ndu vừa nói tại #7.
 
Lần chỉnh sửa cuối:
Upvote 0
Đã dulieu = sh.UsedRange.Value thì đáng ra sh.UsedRange.Value = dulieu chứ. Nếu không thì việc tạo mảng bằng thừa ?. Việc tạo biến mảng ndu vừa nói tại #7.
Chính xác là bị thừa chỗ đó rồi anh ơi. Thực ra trong đầu nghĩ là sẽ viết Sh.UsedRange= dulieu nhưng không hiểu sao lại viết như thế, khi khai báo dulieu= Sh.UsedRange là đã có ý định rồi đó chứ. Vì nếu không tạo mảng thì có khả năng sẽ tràn bộ nhớ nếu vùng dữ liệu quá lớn.
 
Lần chỉnh sửa cuối:
Upvote 0
Đã dulieu = sh.UsedRange.Value thì đáng ra sh.UsedRange.Value = dulieu chứ. Nếu không thì việc tạo mảng bằng thừa ?. Việc tạo biến mảng ndu vừa nói tại #7.

Ngoài ra cũng không nên dùng DIR mà nên là Scripting.FileSystemObject mới chuẩn (nguyên nhân thì đã nói nhiều lần rồi)
 
Upvote 0
Nhờ bổ sung thêm Code xóa toàn bộ các cột ẩn đi

Thí nghiệm vầy xem:
PHP:
Sub Test()
  Dim wks As Worksheet, aRes
  For Each wks In ThisWorkbook.Worksheets
    aRes = wks.UsedRange.Value
    wks.UsedRange.Value = aRes
  Next
End Sub

Dữ liệu của em thừa kế từ người khác bố trí lung tung quá, nhờ thày giúp cho sau khi biến tất cả các ô trong các Sheet của file thành Value bằng Code trên thì đồng thời nó thực hiện thêm một động tác nữa là xóa toàn bộ các cột bị ẩn (Hide) đi.

Em xin cảm ơn rất nhiều
 
Upvote 0
Bạn hãy phát triển luôn theo cái ý tưởng của bạn: Copy --> Paste Value
Mã:
    Range("A1:IV65536").Copy    
     Range("A1").PasteSpecial Paste:=xlPasteValues
    Application.CutCopyMode = False
Có thể nâng cấp thành cái Add-In, gán phím ...
Bạn ơi chỉ giúp mình cách nâng cấp thành addin và gán phím như thế nào với!
 
Upvote 0
Có bạn nào giúp mình viết tiếp bài trong Topic này được không ???
+ Mở từng file *.xls trong 1 folder (gồm cả sub folder) = cách thông thường dùng vòng lặp ? hay = ADO gì đó? Ai viết giúp cả 2 cách càng tốt để cho những người mới như mình học hỏi dần
+ đưa tất cả các sheet trong từng file thành value. close file

Hỏi thì sợ mọi người bảo dốt nhưng ko hỏi thì ko biết làm mà có tìm dạng tương tự trong diễn đàn cũng chưa áp dụng được trong trường hợp này. Cũng đang rất là cần. Mọi người HELP me!
 
Upvote 0

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

Back
Top Bottom