Copy dữ liệu vào file đang đóng có điều kiện (1 người xem)

Liên hệ QC

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

hungdiep85

Thành viên thường trực
Tham gia
1/6/09
Bài viết
218
Được thích
23
Giới tính
Nam
Em xin chào các Anh Chị trên Diễn Đàn GPE và Anh hpkhuong


Vì Dữ liệu cần copy quá nhiều, nên khi chạy code thì bị lổi (out of memory).


Giờ mổi ngày em phải tự copy dữ liệu để chạy code, thì code không báo lổi nữa, vì mổi lần báo lổi thì em lại copy ít một chút cho đến khi nào chạy được thì thôi.


Nếu có thể copy 1 lần 1000 dòng paste vào file đang đóng, sau đó lại tiếp lục copy thêm 1000 dòng paste nói tiếp vào file đó thì sẽ không bị lổi nữa."Em nghỉ vậy, vì giờ mổi ngày em điều làm như vậy, mà cực quá, làm 1 thồi bị quán quán luôn".


Em Hy Vọng các Anh Chị trên Diễn Đàn GPE và Anh hpkhuong. có thể sửa lại code giúp em với.


Cho Em gửi lời Cảm Ơn trước à




Tác giả code trong file: hpkhuong
 

File đính kèm

Lần chỉnh sửa cuối:
1. Tôi nghĩ bạn đừng nêu tên tôi lên đây thì sẽ có nhiều phương án tốt cho bạn. Không nhất thiết phải nghe theo 1 người... Với tôi thì tôi làm như vậy, và còn nhiều thành viên trên GPE này sẽ có rất nhiều giải pháp hay cho bạn... Cho nên đừng nếu đích danh là code của ai, không quan trọng chuyện đó. (Code là học hỏi lẫn nhau mà ra, có ai tự ngồi sáng tạo ra cái thứ ngôn ngữ ấy đâu.)

2. Bạn nói rằng bạn chạy code nhiều dữ liệu bị lỗi, Mà trong khi post lên đây lèo tèo có vài dòng...Tôi hay ai đó có test cho bạn, cũng làm sao mà phát sinh lỗi được. Cho nên khó mà hiểu file thật của bạn, bạn áp dụng như nào mà lỗi... Với file đinh dạng 2007 trở lên thì có cả hơn 1 triệu dòng, hơn cả 1000 cột lận mà. Sao lại lỗi tràn được ta

Với lai: File thật của bạn, file A chạy code của bạn có tất cả bao nhiều dòng dữ liệu? Rồi mõi mã hàng tương ứng với file A thì sẽ có khoản bao nhiêu dòng khi chạy code nó update vào file đích???





30 File Không báo lổi vi dữ liệu còn ít, Anh cứ chạy thử trước.
---

Lổi (out of memory)
Bước 1, Chạy code Giả lập dữ liệu thật, sau đó đợi code chạy xong.(Phải chạy code này vì dữ liệu thật nhiều y như vậy, hàng và cột y như vậy không khác 1 chút nào)

Bước 2, Chạy code chia dữ liệu vào file đang đóng. Sẽ báo lổi(out of memory)

Dữ liệu có 30 Mã Hàng và 30 file con


Nếu có thể copy 1 lần 1000 dòng paste vào file đang đóng, sau đó lại tiếp lục copy thêm 1000 dòng paste nói tiếp vào file đó thì có thể được không Anh
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
1. Dữ liệu của bạn nhiều vậy chạy VBA thì nó out of memory là đúng rồi.
Nói túm lại, bạn tìm giải pháp khác như tôi nói ở mục 1. còn VBA thì thua rồi...-\\/.

cứ khi có ai la làng OUT OF MEMORY là tôi lại nhớ câu chuyện này

http://ttvnol.com/threads/mot-so-mau-chuyen-ve-trang-nguyen-luong-the-vinh.150942/#post-2838804

làm y như phim Tàu , thi triển võ công cũng phải gắn với các điển cố điển tích trong lịch sử . ha ha ha ha
 
Upvote 0
Dạ. giờ em chia dữ liệu ra thành 30 sheet (mổi mã hàng 1 sheet, em để 3 sheet trước). như vậy là dữ liệu chạy nhẹ liền.


Nhưng giờ có chút vấn dề là em cho chạy code ở

Sheet DULIEU1(Code: xoa_het_du_lieu_cu) sau đó tiếp DULIEU2
Sheet DULIEU2(Code: Noi_tiep_du_lieu_DULIEU1) sau đó tiếp DULIEU3
Sheet DULIEU3(Code: Noi_tiep_du_lieu_DULIEU2)


như vậy là em phải từng sheet bấm chạy code và chọn lại folder, có cách nào nối các code lại với nhau và không cần chọn lại folder(chỉ chọn folder lần đầu chạy code ở DULIEU1)

Em cảm ơn
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình dùng bản excel 2007 portable nên thử với dữ liệu ít ở bài 3 đã bị lỗi nên không rõ có phải bạn muốn copy tất cả các dòng mã hàng 1,2,3,A,B,C... vào file 1,2,3,A,B,C... không? Nếu đúng vậy để tránh tràn bộ nhớ thì bạn làm như sau:
- Save file dữ liệu nếu cần, mục đích sau này sửa đổi file và thoát ra không lưu thay đổi nữa (có thể copy 1 file dự phòng cho chắc ăn).
- Sort sheet dữ liệu theo cột mã hàng, mình sort thử với dữ liệu lớn mất có 1 phút.
- Copy, paste special value cột B sang sheet trống (ví dụ cột A sheet2). Dùng chức năng remove duplicates để lấy danh sách mã hàng không trùng (cách 1). Nếu danh sách mã hàng là cố định thì bạn có thể lưu luôn vào code rồi ghi vào sheet2 từ A1 đến A30 cho nhanh (cách 2).
- Ô sheet2!B1 bạn nhập công thức =IFERROR(MATCH(A1,DULIEUTONG!B:B,0),0) rồi kéo xuống đủ 30 mã hàng. Như dữ liệu của bạn thì B1=11, B2=24587, B3=49163. Dữ liệu mã hàng 1 sẽ từ dòng 11 đến 24586, mã hàng 2 sẽ từ dòng 24587 đến 49162 trong sheet DULIEUTONG. Nếu cột B có giá trị =0 (điều này có thể xảy ra khi bạn dùng cách 2 ở trên), ví dụ B2=0 thì mã hàng 1 sẽ bắt đầu từ dòng 11 đến dòng 49162 và mã hàng 2 không có dữ liệu.
- Copy các khối dữ liệu này vào file mã hàng tương ứng rồi đóng file mã hàng lại.
- Sau khi copy tất cả mã hàng thì đóng file dữ liệu tổng lại và không lưu thay đổi.
 
Upvote 0
30 File Không báo lổi vi dữ liệu còn ít, Anh cứ chạy thử trước.
---

Lổi (out of memory)
Bước 1, Chạy code Giả lập dữ liệu thật, sau đó đợi code chạy xong.(Phải chạy code này vì dữ liệu thật nhiều y như vậy, hàng và cột y như vậy không khác 1 chút nào)

Bước 2, Chạy code chia dữ liệu vào file đang đóng. Sẽ báo lổi(out of memory)

Dữ liệu có 30 Mã Hàng và 30 file con


Nếu có thể copy 1 lần 1000 dòng paste vào file đang đóng, sau đó lại tiếp lục copy thêm 1000 dòng paste nói tiếp vào file đó thì có thể được không Anh

Đêm khuya khó ngũ đi cân voi chơi
trước hết ta cần chuẩn bị 1 số đạo cụ
1/file DULIEUTONG . file này bạn cần phải SAVE AS đuôi xlsb nhé .
2/giả lập dữ liệu , mượn sub tạo dữ liệu ảo của anh hpkhuong

Mã:
Sub CopyGiaLap()
Application.ScreenUpdating = False
Sheet2.Range("B1:BK30").Copy Sheet1.Range("B11:B600010")
Application.ScreenUpdating = True
End Sub

3/cái cân để cân con voi . cho em mượn lại code của anh nha anh hpkhuong . hi hi

Mã:
Public Sub hello()
Dim arr, lr As Long, arrInfo(1 To 10000, 1 To 3), tmp, r As Long, k As Long, mytime As Double
Dim Path, ChonO As Object, ChonF As Object, fil As Object, DateF As Date
Dim ShName As String, TyName As String, sh As Worksheet, OldName As String, NewName As String


mytime = timer
Application.ScreenUpdating = False
DateF = Sheet1.[Q9].Value
With Application.FileDialog(msoFileDialogFolderPicker)
    .Title = ""
    .Show
    If .SelectedItems.Count = 0 Then Exit Sub
    Path = .SelectedItems(1) & "\"
End With
Set ChonO = CreateObject("Scripting.FilesystemObject")
Set ChonF = ChonO.GetFolder(Path)
With Sheet1
    lr = .[B1000000].End(xlUp).Row
    .Range("B11:B" & lr).Resize(, 62).Sort .[B11], xlAscending
    arr = .Range("B11:B" & lr + 1).Value
    For r = 1 To UBound(arr) Step 1
        If arr(r, 1) <> tmp Then
            k = k + 1
            arrInfo(k, 1) = arr(r, 1)
            arrInfo(k, 2) = r + 10
            If k > 1 Then arrInfo(k - 1, 3) = r + 9
            tmp = arr(r, 1)
        End If
    Next
    
    For Each fil In ChonF.Files
        ShName = ChonO.GetBaseName(fil)
        TyName = ChonO.GetExtensionName(fil)
        For r = 1 To k - 1 Step 1
            If Left(ShName, Len(arrInfo(r, 1))) = arrInfo(r, 1) Then
                Set sh = Workbooks.Open(fil.Path, , , , "AAA").Worksheets("DULIEU")
                sh.Range(sh.[A2], sh.UsedRange.SpecialCells(xlCellTypeLastCell).Offset(20)).ClearContents
                .Range("B" & arrInfo(r, 2) & ":B" & arrInfo(r, 3)).Resize(, 62).Copy
                sh.Range("B2").PasteSpecial xlPasteValues
                Workbooks(fil.Name).Close True
                OldName = ChonO.GetAbsolutePathName(fil)
                NewName = Path & arrInfo(r, 1) & " (" & " " & Format(DateF, "dd-MMM") & ")." & TyName
                ChonO.MoveFile OldName, NewName
                Exit For
            End If
        Next
    Next
    Application.CutCopyMode = False
End With
Application.ScreenUpdating = True
MsgBox timer - mytime
ThisWorkbook.Close False
End Sub

nếu hên sẽ không bị lỗi , xui thì ... từ từ bàn lại . hi hi
 
Lần chỉnh sửa cuối:
Upvote 0
Mình dùng bản excel 2007 portable nên thử với dữ liệu ít ở bài 3 đã bị lỗi nên không rõ có phải bạn muốn copy tất cả các dòng mã hàng 1,2,3,A,B,C... vào file 1,2,3,A,B,C... không? Nếu đúng vậy để tránh tràn bộ nhớ thì bạn làm như sau:
- Save file dữ liệu nếu cần, mục đích sau này sửa đổi file và thoát ra không lưu thay đổi nữa (có thể copy 1 file dự phòng cho chắc ăn).
- Sort sheet dữ liệu theo cột mã hàng, mình sort thử với dữ liệu lớn mất có 1 phút.
- Copy, paste special value cột B sang sheet trống (ví dụ cột A sheet2). Dùng chức năng remove duplicates để lấy danh sách mã hàng không trùng (cách 1). Nếu danh sách mã hàng là cố định thì bạn có thể lưu luôn vào code rồi ghi vào sheet2 từ A1 đến A30 cho nhanh (cách 2).
- Ô sheet2!B1 bạn nhập công thức =IFERROR(MATCH(A1,DULIEUTONG!B:B,0),0) rồi kéo xuống đủ 30 mã hàng. Như dữ liệu của bạn thì B1=11, B2=24587, B3=49163. Dữ liệu mã hàng 1 sẽ từ dòng 11 đến 24586, mã hàng 2 sẽ từ dòng 24587 đến 49162 trong sheet DULIEUTONG. Nếu cột B có giá trị =0 (điều này có thể xảy ra khi bạn dùng cách 2 ở trên), ví dụ B2=0 thì mã hàng 1 sẽ bắt đầu từ dòng 11 đến dòng 49162 và mã hàng 2 không có dữ liệu.
- Copy các khối dữ liệu này vào file mã hàng tương ứng rồi đóng file mã hàng lại.
- Sau khi copy tất cả mã hàng thì đóng file dữ liệu tổng lại và không lưu thay đổi.



không biết sao em zip file ở bài #6 bị lổi , file gốc em để ở công ty , em có làm theo cách anh, nhưng chưa hiểu lắm , để mai em vô công ty lấy file gốc làm thử.


em cảm ơn anh trước
 
Upvote 0
Đêm khuya khó ngũ đi cân voi chơi
trước hết ta cần chuẩn bị 1 số đạo cụ
1/file DULIEUTONG . file này bạn cần phải SAVE AS đuôi xlsb nhé .
2/giả lập dữ liệu , mượn sub tạo dữ liệu ảo của anh hpkhuong



3/cái cân để cân con voi . cho em mượn lại code của anh nha anh hpkhuong . hi hi

Mã:
Public Sub hello()
Dim arr, lr As Long, arrInfo(1 To 10000, 1 To 3), tmp, r As Long, k As Long, mytime As Double
Dim Path, ChonO As Object, ChonF As Object, fil As Object, DateF As Date
Dim ShName As String, TyName As String, sh As Worksheet, OldName As String, NewName As String


mytime = timer
Application.ScreenUpdating = False
DateF = Sheet1.[Q9].Value
With Application.FileDialog(msoFileDialogFolderPicker)
    .Title = ""
    .Show
    If .SelectedItems.Count = 0 Then Exit Sub
    Path = .SelectedItems(1) & "\"
End With
Set ChonO = CreateObject("Scripting.FilesystemObject")
Set ChonF = ChonO.GetFolder(Path)
With Sheet1
    lr = .[B1000000].End(xlUp).Row
    .Range("B11:B" & lr).Resize(, 62).Sort .[B11], xlAscending
    arr = .Range("B11:B" & lr + 1).Value
    For r = 1 To UBound(arr) Step 1
        If arr(r, 1) <> tmp Then
            k = k + 1
            arrInfo(k, 1) = arr(r, 1)
            arrInfo(k, 2) = r + 10
            If k > 1 Then arrInfo(k - 1, 3) = r + 9
            tmp = arr(r, 1)
        End If
    Next
    
    For Each fil In ChonF.Files
        ShName = ChonO.GetBaseName(fil)
        TyName = ChonO.GetExtensionName(fil)
        For r = 1 To k - 1 Step 1
            If Left(ShName, Len(arrInfo(r, 1))) = arrInfo(r, 1) Then
                Set sh = Workbooks.Open(fil.Path, , , , "AAA").Worksheets("DULIEU")
                sh.Range(sh.[A2], sh.UsedRange.SpecialCells(xlCellTypeLastCell).Offset(20)).ClearContents
                .Range("B" & arrInfo(r, 2) & ":B" & arrInfo(r, 3)).Resize(, 62).Copy
                sh.Range("B2").PasteSpecial xlPasteValues
                Workbooks(fil.Name).Close True
                OldName = ChonO.GetAbsolutePathName(fil)
                NewName = Path & arrInfo(r, 1) & " (" & " " & Format(DateF, "dd-MMM") & ")." & TyName
                ChonO.MoveFile OldName, NewName
                Exit For
            End If
        Next
    Next
    Application.CutCopyMode = False
End With
Application.ScreenUpdating = True
MsgBox timer - mytime
ThisWorkbook.Close False
End Sub

nếu hên sẽ không bị lỗi , xui thì ... từ từ bàn lại . hi hi




HÊN rồi Anh ơi , sáng mai em vô công ty cho chạy thử hàng liền.


Em Cảm Ơn Anh
 
Upvote 0
Đêm khuya khó ngũ đi cân voi chơi
trước hết ta cần chuẩn bị 1 số đạo cụ
1/file DULIEUTONG . file này bạn cần phải SAVE AS đuôi xlsb nhé .
2/giả lập dữ liệu , mượn sub tạo dữ liệu ảo của anh hpkhuong



3/cái cân để cân con voi . cho em mượn lại code của anh nha anh hpkhuong . hi hi

Mã:
Public Sub hello()
Dim arr, lr As Long, arrInfo(1 To 10000, 1 To 3), tmp, r As Long, k As Long, mytime As Double
Dim Path, ChonO As Object, ChonF As Object, fil As Object, DateF As Date
Dim ShName As String, TyName As String, sh As Worksheet, OldName As String, NewName As String


mytime = timer
Application.ScreenUpdating = False
DateF = Sheet1.[Q9].Value
With Application.FileDialog(msoFileDialogFolderPicker)
    .Title = ""
    .Show
    If .SelectedItems.Count = 0 Then Exit Sub
    Path = .SelectedItems(1) & "\"
End With
Set ChonO = CreateObject("Scripting.FilesystemObject")
Set ChonF = ChonO.GetFolder(Path)
With Sheet1
    lr = .[B1000000].End(xlUp).Row
    .Range("B11:B" & lr).Resize(, 62).Sort .[B11], xlAscending
    arr = .Range("B11:B" & lr + 1).Value
    For r = 1 To UBound(arr) Step 1
        If arr(r, 1) <> tmp Then
            k = k + 1
            arrInfo(k, 1) = arr(r, 1)
            arrInfo(k, 2) = r + 10
            If k > 1 Then arrInfo(k - 1, 3) = r + 9
            tmp = arr(r, 1)
        End If
    Next
    
    For Each fil In ChonF.Files
        ShName = ChonO.GetBaseName(fil)
        TyName = ChonO.GetExtensionName(fil)
        For r = 1 To k - 1 Step 1
            If Left(ShName, Len(arrInfo(r, 1))) = arrInfo(r, 1) Then
                Set sh = Workbooks.Open(fil.Path, , , , "AAA").Worksheets("DULIEU")
                sh.Range(sh.[A2], sh.UsedRange.SpecialCells(xlCellTypeLastCell).Offset(20)).ClearContents
                .Range("B" & arrInfo(r, 2) & ":B" & arrInfo(r, 3)).Resize(, 62).Copy
                sh.Range("B2").PasteSpecial xlPasteValues
                Workbooks(fil.Name).Close True
                OldName = ChonO.GetAbsolutePathName(fil)
                NewName = Path & arrInfo(r, 1) & " (" & " " & Format(DateF, "dd-MMM") & ")." & TyName
                ChonO.MoveFile OldName, NewName
                Exit For
            End If
        Next
    Next
    Application.CutCopyMode = False
End With
Application.ScreenUpdating = True
MsgBox timer - mytime
ThisWorkbook.Close False
End Sub

nếu hên sẽ không bị lỗi , xui thì ... từ từ bàn lại . hi hi





Dạ , Em đả cho chạy thử từ thứ 2 đến giờ và code không còn báo lổi nào nữa, Em cảm ơn Anh và các Anh Chị trên GPE rất nhiều à.
 
Upvote 1
Web KT

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

Back
Top Bottom