Giúp tách 1 sheet thành nhiều file (1 người xem)

  • Thread starter Thread starter sonyp
  • Ngày gửi Ngày gửi
Liên hệ QC

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

sonyp

Thành viên mới
Tham gia
7/2/17
Bài viết
5
Được thích
2
Chào các anh chị.
Em có 1 sheet khoảng 50 nghìn dòng.
Bây giờ em cần tách thành nhiều file, mỗi file đúng 99 dòng và file mới dữ nguyên định dạng như sheet đang có.
Mong anh chị giúp đỡ.
EM gửi kèm file mẫu.

Cảm ơn anh chị.
 
Lần chỉnh sửa cuối:
Chào các anh chị.
Em có 1 sheet khoảng 50 nghìn dòng.
Bây giờ em cần tách thành nhiều file, mỗi file đúng 99 dòng và file mới dữ nguyên định dạng như sheet đang có.
Mong anh chị giúp đỡ.
EM gửi kèm file mẫu.

Cảm ơn anh chị.
Bạn chạy code này thử xem:
Mã:
Sub splfile()
Dim i As Long, j As Long, k As Long, n As Long, m As Long
Dim wb As Worksheet, rng As Range, darr, arr
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Set wb = ThisWorkbook.Worksheets("sheet1")
Set rng = wb.Range([a3], [G100000].End(xlUp)): arr = rng
ReDim darr(1 To 99, 1 To UBound(arr, 2))
On Error Resume Next
n = Int(UBound(arr) / 99) + 1
retu:
Set pfolder = CreateObject("shell.application").browseforfolder(0, "Chon folder", 0, 0)
If Not TypeName(pfolder) = "Nothing" Then
    Path = pfolder.self.Path
Else
    MsgBox " Chua chon folder luu file"
    GoTo retu
End If
For k = 1 To n
    ReDim darr(1 To 99, 1 To UBound(arr, 2)): m = 0
    For i = (k - 1) * 99 + 1 To k * 99
        m = m + 1
        For j = 1 To UBound(arr, 2)
            darr(m, j) = arr(i, j)
        Next j
    Next i
    With Workbooks.Add
        wb.[a1:g2].Copy .Worksheets("sheet1").[a1]
        .Worksheets("sheet1").[a3].Resize(UBound(darr), UBound(darr, 2)) = darr
        rng.Copy: .Worksheets("sheet1").[a3].PasteSpecial xlFormats
        .SaveAs Path & "\File_" & k
        .Close True
    End With
Next k
Set pfolder = Nothing
Application.ScreenUpdating = True
Application.DisplayAlerts = True
Application.CutCopyMode = False
Call Shell("explorer.exe " & Path, vbNormalFocus)
End Sub
 
Upvote 0
Mã:
retu:
Set pfolder = CreateObject("shell.application").browseforfolder(0, "Chon folder", 0, 0)
If Not TypeName(pfolder) = "Nothing" Then
    Path = pfolder.self.Path
Else
    MsgBox " Chua chon folder luu file"
    GoTo retu
End If

Khong ai dùng Goto trong trường hợp này cả. Ngừoi ta dùng vòng lặp bất tận

Do While 1=1
Set pfolder = CreateObject("shell.application").browseforfolder(0, "Chon folder", 0, 0)
If Not TypeName(pfolder) = "Nothing" Then
Path = pfolder.self.Path
Exit Do
Else
MsgBox " Chua chon folder luu file"
End If
Loop
 
Upvote 0
Khong ai dùng Goto trong trường hợp này cả. Ngừoi ta dùng vòng lặp bất tận

Do While 1=1
Set pfolder = CreateObject("shell.application").browseforfolder(0, "Chon folder", 0, 0)
If Not TypeName(pfolder) = "Nothing" Then
Path = pfolder.self.Path
Exit Do
Else
MsgBox " Chua chon folder luu file"
End If
Loop
Cám ơn bạn, bạn có thể cho tôi biết sự khác nhau giữa hai trường hợp này được không?
 
Upvote 0
Nó chỉ là cách quản trị code. Thường thì ngừoi ta tránh dùng Goto nếu có thể tránh.

Lúc đọc thấy cái label retu:, tôi biết là 'có lẽ' sẽ có một cái Goto nào đó đi về nó.
Thứ nhất: rất có thể có tới vài cái Goto's, tôi phải đọc hết code mới biết được, rất khó kiểm soát.
Thứ hai: Goto có thể nhảy loạn cào cào, tạo nên tình trạng rời rạc (segmented) của block code (trong lập trình có từ block, khối, toi không biết dịch ra tiếng Việt như thế nào mới đúng). Tức là block này lồng móc vào block kia. Tình trạng gần giống như hai hàm đệ quy gọi lẫn nhau (A gọi B, nhưng bên trong code của B cũng có chỗ gọi A)
Thứ ba: lý do chính mà ngừoi ta tránh Goto là lúc debug, rất khó xét trị của biến. Điều này nếu bạn gú gô trên net sẽ thấy ngừoi ta giải thích rất rõ.
Lý do thứ tư mà thì có lẽ ít gặp ở GPE này, là lúc bạn copy-paste một đoạn code sẽ trở nên rắc rối. Phạm vi lặp/nhảy của label hơi khó xác định.

Trường hợp code trên là trường hợp hoàn toàn có thể dùng vòng lặp vô tận.
Thứ nhất: đúng theo lý giải thì trường hợp này vòng lặp vô tận đi sát với thuật toán hơn goto.
Thứ hai: vòng lặp xác định rõ rệt 1 block code, tránh được tình trạng các blocks móc vào nhau - trừ phi thuật toán của bạn cần phải móc. Bởi vì vòng lặp bắt buộc bạn phải hoặc lồng cái này trong cái kia, hoặc rời hẳn ra.
Thứ ba: với vòng lặp vô tận, ngừoi đọc code quen nhận ra nó ngay (điều kiện 1=1, hoặc while True; True nhanh hơn nhưng bên trên tôi dùng 1=1 vì cách này đọc rõ hơn). Khi đọc code, ngừoi ta biết ngay là bên trong vòng lặp sẽ có ít nhất một điều kiện nào đó để Exit.
Thứ tư: với vòng lặp vô tận, tôi biết chính xác phạm vi của block khi cần copy-paste.
 
Upvote 0
Nó chỉ là cách quản trị code. Thường thì ngừoi ta tránh dùng Goto nếu có thể tránh.

Lúc đọc thấy cái label retu:, tôi biết là 'có lẽ' sẽ có một cái Goto nào đó đi về nó.
Thứ nhất: rất có thể có tới vài cái Goto's, tôi phải đọc hết code mới biết được, rất khó kiểm soát.
Thứ hai: Goto có thể nhảy loạn cào cào, tạo nên tình trạng rời rạc (segmented) của block code (trong lập trình có từ block, khối, toi không biết dịch ra tiếng Việt như thế nào mới đúng). Tức là block này lồng móc vào block kia. Tình trạng gần giống như hai hàm đệ quy gọi lẫn nhau (A gọi B, nhưng bên trong code của B cũng có chỗ gọi A)
Thứ ba: lý do chính mà ngừoi ta tránh Goto là lúc debug, rất khó xét trị của biến. Điều này nếu bạn gú gô trên net sẽ thấy ngừoi ta giải thích rất rõ.
Lý do thứ tư mà thì có lẽ ít gặp ở GPE này, là lúc bạn copy-paste một đoạn code sẽ trở nên rắc rối. Phạm vi lặp/nhảy của label hơi khó xác định.

Trường hợp code trên là trường hợp hoàn toàn có thể dùng vòng lặp vô tận.
Thứ nhất: đúng theo lý giải thì trường hợp này vòng lặp vô tận đi sát với thuật toán hơn goto.
Thứ hai: vòng lặp xác định rõ rệt 1 block code, tránh được tình trạng các blocks móc vào nhau - trừ phi thuật toán của bạn cần phải móc. Bởi vì vòng lặp bắt buộc bạn phải hoặc lồng cái này trong cái kia, hoặc rời hẳn ra.
Thứ ba: với vòng lặp vô tận, ngừoi đọc code quen nhận ra nó ngay (điều kiện 1=1, hoặc while True; True nhanh hơn nhưng bên trên tôi dùng 1=1 vì cách này đọc rõ hơn). Khi đọc code, ngừoi ta biết ngay là bên trong vòng lặp sẽ có ít nhất một điều kiện nào đó để Exit.
Thứ tư: với vòng lặp vô tận, tôi biết chính xác phạm vi của block khi cần copy-paste.
Tôi đã hiểu, cám ơn bạn!!
 
Upvote 0
Web KT

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

Back
Top Bottom