Rút gọn code lại (1 người xem)

Liên hệ QC

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

thangteotdtt

Thành viên hoạt động
Tham gia
12/12/13
Bài viết
152
Được thích
42
Mã:
Sub SAP1()
[COLOR=#ff0000]If [A1] = 10 Then[/COLOR]
 Range("A6:M770").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlUp
    Sheets("SODO").Select
    Range("A3:K12").Select
    Selection.Copy
  Sheets("SODO.").Select
    Range("A6").Select
    ActiveSheet.Paste
 [COLOR=#ff0000]  ElseIf [A1] = 11 Then[/COLOR]
 Range("A6:M770").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlUp
    Sheets("SODO").Select
    Range("A14:K27").Select
    Selection.Copy
  Sheets("SODO.").Select
    Range("A6").Select
    ActiveSheet.Paste
   [COLOR=#ff0000] ElseIf [A1] = 12 Then[/COLOR]
 Range("A6:M770").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlUp
    Sheets("SODO").Select
    Range("A29:K42").Select
    Selection.Copy
  Sheets("SODO.").Select
    Range("A6").Select
    ActiveSheet.Paste
 [COLOR=#ff0000] ElseIf [A1] = 13 Then[/COLOR]
 Range("A6:M770").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlUp
    Sheets("SODO").Select
    Range("A44:K58").Select
    Selection.Copy
  Sheets("SODO.").Select
    Range("A6").Select
    ActiveSheet.Paste
     End If
End Sub
Mình record maro lại được các code trên, cho hỏi có rút gọn lại được không và còn nhiều cái thứ này nữa ElseIf [A1] = ........Then
Cảm ơn các bác rất nhiều.
 
PHP:
Sub SAP2()
Sheets("SODO.").Range("A6:M770").Delete Shift:=xlUp
    If Sheets("SODO.").[A1] = 10 Then
        Sheets("SODO").Range("A3:K12").Copy Sheets("SODO.").Range("A6")
    ElseIf Sheets("SODO.").[A1] = 11 Then
        Sheets("SODO").Range("A14:K27").Copy Sheets("SODO.").Range("A6")
    ElseIf Sheets("SODO.").[A1] = 12 Then
        Sheets("SODO").Range("A29:K42").Copy Sheets("SODO.").Range("A6")
    ElseIf Sheets("SODO.").[A1] = 13 Then
        Sheets("SODO").Range("A44:K58").Copy Sheets("SODO.").Range("A6")
    End If
Application.CutCopyMode = False
End Sub

PHP:
Sub SAP3()
Dim vA1 As Long
vA1 = Sheets("SODO.").[A1].Value
Sheets("SODO.").Range("A6:M770").Delete Shift:=xlUp
Select Case vA1
    Case 10
        Sheets("SODO").Range("A3:K12").Copy Sheets("SODO.").Range("A6")
    Case 11
        Sheets("SODO").Range("A14:K27").Copy Sheets("SODO.").Range("A6")
    Case 12
        Sheets("SODO").Range("A29:K42").Copy Sheets("SODO.").Range("A6")
    Case 13
        Sheets("SODO").Range("A44:K58").Copy Sheets("SODO.").Range("A6")
    End Select
Application.CutCopyMode = False
End Sub

PHP:
Sub SAP4()
Dim vA1 As Long
vA1 = Sheets("SODO.").[A1].Value
Sheets("SODO.").Range("A6:M770").Delete Shift:=xlUp
With Sheets("SODO")
    If vA1 = 10 Then
        .Range("A3:K12").Copy
    ElseIf vA1 = 11 Then
        .Range("A14:K27").Copy
    ElseIf vA1 = 12 Then
        .Range("A29:K42").Copy
    ElseIf vA1 = 13 Then
        .Range("A44:K58").Copy
    End If
End With
Sheets("SODO.").Range("A6").PasteSpecial
Application.CutCopyMode = False
End Sub
 
Upvote 0
Mã:
Sub SAP1()
[COLOR=#ff0000]If [A1] = 10 Then[/COLOR]
 Range("A6:M770").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlUp
    Sheets("SODO").Select
    Range("A3:K12").Select
    Selection.Copy
  Sheets("SODO.").Select
    Range("A6").Select
    ActiveSheet.Paste
 [COLOR=#ff0000]  ElseIf [A1] = 11 Then[/COLOR]
 Range("A6:M770").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlUp
    Sheets("SODO").Select
    Range("A14:K27").Select
    Selection.Copy
  Sheets("SODO.").Select
    Range("A6").Select
    ActiveSheet.Paste
   [COLOR=#ff0000] ElseIf [A1] = 12 Then[/COLOR]
 Range("A6:M770").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlUp
    Sheets("SODO").Select
    Range("A29:K42").Select
    Selection.Copy
  Sheets("SODO.").Select
    Range("A6").Select
    ActiveSheet.Paste
 [COLOR=#ff0000] ElseIf [A1] = 13 Then[/COLOR]
 Range("A6:M770").Select
    Application.CutCopyMode = False
    Selection.Delete Shift:=xlUp
    Sheets("SODO").Select
    Range("A44:K58").Select
    Selection.Copy
  Sheets("SODO.").Select
    Range("A6").Select
    ActiveSheet.Paste
     End If
End Sub
Mình record maro lại được các code trên, cho hỏi có rút gọn lại được không và còn nhiều cái thứ này nữa ElseIf [A1] = ........Then
Cảm ơn các bác rất nhiều.

Rút gọn cho bạn thì OK, nhưng lưu ý với bạn là nơi đến của việc Paste mà cụ thể là sheet SODO. phải chọn vùng dữ liệu nào đó để xóa trước khi paste, không thôi nó sẽ trộn với dữ liệu cũ (nếu dữ liệu cũ nhiều hơn) thì không biết phân biệt được cái nào ra cái nào đấy nhé!

Mã:
Sub SAP1()
    If Range("A1") < 10 And Range("A1") > 13 Then Exit Sub
    Range("A6:M770").Delete Shift:=xlUp
    
    [COLOR=#008000]''Neu co muon xoa truoc thi them doan code nay vao
    ''va nho sua lai vung du lieu ("A6:K100") de xoa cho hop ly[/COLOR]
    [COLOR=#ff0000]''Sheets("SODO.").Range("A6:K100").ClearContents[/COLOR]
    
    Select Case Range("A1")
    Case 10
        Range("A3:K12").Copy Sheets("SODO.").Range("A6")
    Case 11
        Range("A14:K27").Copy Sheets("SODO.").Range("A6")
    Case 12
        Range("A29:K42").Copy Sheets("SODO.").Range("A6")
    Case 13
        Range("A44:K58").Copy Sheets("SODO.").Range("A6")
    End Select
End Sub
 
Upvote 0
PHP:
Sub SAP2()
Sheets("SODO.").Range("A6:M770").Delete Shift:=xlUp
    If Sheets("SODO.").[A1] = 10 Then
        Sheets("SODO").Range("A3:K12").Copy Sheets("SODO.").Range("A6")
    ElseIf Sheets("SODO.").[A1] = 11 Then
        Sheets("SODO").Range("A14:K27").Copy Sheets("SODO.").Range("A6")
    ElseIf Sheets("SODO.").[A1] = 12 Then
        Sheets("SODO").Range("A29:K42").Copy Sheets("SODO.").Range("A6")
    ElseIf Sheets("SODO.").[A1] = 13 Then
        Sheets("SODO").Range("A44:K58").Copy Sheets("SODO.").Range("A6")
    End If
Application.CutCopyMode = False
End Sub

PHP:
Sub SAP3()
Dim vA1 As Long
vA1 = Sheets("SODO.").[A1].Value
Sheets("SODO.").Range("A6:M770").Delete Shift:=xlUp
Select Case vA1
    Case 10
        Sheets("SODO").Range("A3:K12").Copy Sheets("SODO.").Range("A6")
    Case 11
        Sheets("SODO").Range("A14:K27").Copy Sheets("SODO.").Range("A6")
    Case 12
        Sheets("SODO").Range("A29:K42").Copy Sheets("SODO.").Range("A6")
    Case 13
        Sheets("SODO").Range("A44:K58").Copy Sheets("SODO.").Range("A6")
    End Select
Application.CutCopyMode = False
End Sub

PHP:
Sub SAP4()
Dim vA1 As Long
vA1 = Sheets("SODO.").[A1].Value
Sheets("SODO.").Range("A6:M770").Delete Shift:=xlUp
With Sheets("SODO")
    If vA1 = 10 Then
        .Range("A3:K12").Copy
    ElseIf vA1 = 11 Then
        .Range("A14:K27").Copy
    ElseIf vA1 = 12 Then
        .Range("A29:K42").Copy
    ElseIf vA1 = 13 Then
        .Range("A44:K58").Copy
    End If
End With
Sheets("SODO.").Range("A6").PasteSpecial
Application.CutCopyMode = False
End Sub

Em cưng! Chưa đúng điều kiện mà đã Delete tùm lum rồi sao? Lỡ không đúng đk mà delete dữ liệu thì lấy gì mà phục hồi lại nè???
 
Upvote 0
Em cưng! Chưa đúng điều kiện mà đã Delete tùm lum rồi sao? Lỡ không đúng đk mà delete dữ liệu thì lấy gì mà phục hồi lại nè???
Em hỏng biết, thấy code sao rút gọn vậy thôi,hehe

Rút gọn cho bạn thì OK, nhưng lưu ý với bạn là nơi đến của việc Paste mà cụ thể là sheet SODO. phải chọn vùng dữ liệu nào đó để xóa trước khi paste, không thôi nó sẽ trộn với dữ liệu cũ (nếu dữ liệu cũ nhiều hơn) thì không biết phân biệt được cái nào ra cái nào đấy nhé!

Mã:
Sub SAP1()
    If Range("A1") < 10 And Range("A1") > 13 Then Exit Sub
    Range("A6:M770").Delete Shift:=xlUp
    
    [COLOR=#008000]''Neu co muon xoa truoc thi them doan code nay vao
    ''va nho sua lai vung du lieu ("A6:K100") de xoa cho hop ly[/COLOR]
    [COLOR=#ff0000]''Sheets("SODO.").Range("A6:K100").ClearContents[/COLOR]
    
    Select Case Range("A1")
    Case 10
        Range("A3:K12").Copy Sheets("SODO.").Range("A6")
    Case 11
        Range("A14:K27").Copy Sheets("SODO.").Range("A6")
    Case 12
        Range("A29:K42").Copy Sheets("SODO.").Range("A6")
    Case 13
        Range("A44:K58").Copy Sheets("SODO.").Range("A6")
    End Select
End Sub
"Anh iu" code của anh thì tác giả phải đứng ở Sheet SODO chạy code thì mới cho kết quả đúng hen, hiện tai như code tác giả ghi được thì tác giả đang đứng ở Sheet SODO. để ghi macro đó "anh iu iu" ạ. hihihi :D:D:D
 
Upvote 0
Em hỏng biết, thấy code sao rút gọn vậy thôi,hehe


"Anh iu" code của anh thì tác giả phải đứng ở Sheet SODO chạy code thì mới cho kết quả đúng hen, hiện tai như code tác giả ghi được thì tác giả đang đứng ở Sheet SODO. để ghi macro đó "anh iu iu" ạ. hihihi :D:D:D

Code chỉ đúng khi ActiveSheet là sheet có chứa điều kiện và dữ liệu, không phải là SODO. còn nếu ở trên sheet đó, sai ráng chịu à!

Nói chung là vì nữa macro, nữa chấp vá nên địa chỉ ô không rõ ràng, nếu vậy thì chỉ cần vầy thôi mà không cần phải ClearContents chi cho mệt:

Mã:
Sub SAP1()
    If Range("A1") < 10 And Range("A1") > 13 Then Exit Sub
    [COLOR=#ff0000]Sheets("SODO.").[/COLOR][COLOR=#0000ff]Range("A6:M770").Delete Shift:=xlUp[/COLOR]
    Select Case Range("A1")
    Case 10
        Range("A3:K12").Copy Sheets("SODO.").Range("A6")
    Case 11
        Range("A14:K27").Copy Sheets("SODO.").Range("A6")
    Case 12
        Range("A29:K42").Copy Sheets("SODO.").Range("A6")
    Case 13
        Range("A44:K58").Copy Sheets("SODO.").Range("A6")
    End Select
End Sub

À, với dạng Copy kiểu này thì không cần thêm thủ tục này nữa đâu nha cưng:

Application.CutCopyMode = False
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn 2 bạn rất nhiều. Mình còn 1 dạng này xin được giúp tiếp, ý đồ là copy ra thành nhiều file.
Mã:
Sub copy_nhieufile()
If [I3] = 4 Then
 Range("A6:D13").Select
    Selection.Copy
    Workbooks.Add
    Range("A6").Select
    ActiveSheet.Paste
   ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & NameSh & " 4 Doi" & " (" & Format(Now, "hh-MM-ss") & ")"
ElseIf [I3] = 5 Then
Range("A6:E14").Select
    Selection.Copy
    Workbooks.Add
    Range("A6").Select
    ActiveSheet.Paste
   ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & NameSh & " 5 Doi" & " (" & Format(Now, "hh-MM-ss") & ")"
ElseIf [I3] = 6 Then
Range("A6:E15").Select
    Selection.Copy
    Workbooks.Add
    Range("A6").Select
    ActiveSheet.Paste
    ActiveWorkbook.SaveAs Filename:=ThisWorkbook.Path & "\" & NameSh & " 6 Doi" & " (" & Format(Now, "hh-MM-ss") & ")"
 ..............................
..................................
End If
End Sub
 
Upvote 0
Code chỉ đúng khi ActiveSheet là sheet có chứa điều kiện và dữ liệu, không phải là SODO. còn nếu ở trên sheet đó, sai ráng chịu à!

Nói chung là vì nữa macro, nữa chấp vá nên địa chỉ ô không rõ ràng, nếu vậy thì chỉ cần vầy thôi mà không cần phải ClearContents chi cho mệt:

Mã:
Sub SAP1()
    If Range("A1") < 10 And Range("A1") > 13 Then Exit Sub
    [COLOR=#ff0000]Sheets("SODO.").[/COLOR][COLOR=#0000ff]Range("A6:M770").Delete Shift:=xlUp[/COLOR]
    Select Case Range("A1")
    Case 10
        Range("A3:K12").Copy Sheets("SODO.").Range("A6")
    Case 11
        Range("A14:K27").Copy Sheets("SODO.").Range("A6")
    Case 12
        Range("A29:K42").Copy Sheets("SODO.").Range("A6")
    Case 13
        Range("A44:K58").Copy Sheets("SODO.").Range("A6")
    End Select
End Sub

À, với dạng Copy kiểu này thì không cần thêm thủ tục này nữa đâu nha cưng:

Application.CutCopyMode = False
Mình đang đứng ở sheet "SODO." bạn Hoàng Trọng Nghĩa, bạn giúp mình bài 7 nha bạn, cảm ơn bạn nhiều lắm.
 
Lần chỉnh sửa cuối:
Upvote 0
Mình đang đứng ở sheet "SODO." bạn Hoàng Trọng Nghĩa, cảm ơn bạn nhiều lắm.

Với các thủ tục từ sheet này qua sheet khác thì bạn phải nói rõ là thực hiện từ sheet nào đến sheet nào để người hướng dẫn dễ dàng nắm bắt. Các macro độc lập thường phải có địa chỉ rõ ràng, nếu không thì râu ông nọ cắm cằm bà kia thì dỡ khóc dỡ cười với code luôn đó!

Trường hợp này tôi chỉ biết có 1 sheet SODO. là nơi đến, còn nơi chứa dữ liệu thì tôi không biết nó là sheet nào! Nếu biết trước tên sheet nguồn và sheet đích thì dù bạn đứng ở chân trời góc bể nào đi nữa code vẫn chạy đúng!
 
Upvote 0
Với các thủ tục từ sheet này qua sheet khác thì bạn phải nói rõ là thực hiện từ sheet nào đến sheet nào để người hướng dẫn dễ dàng nắm bắt. Các macro độc lập thường phải có địa chỉ rõ ràng, nếu không thì râu ông nọ cắm cằm bà kia thì dỡ khóc dỡ cười với code luôn đó!

Trường hợp này tôi chỉ biết có 1 sheet SODO. là nơi đến, còn nơi chứa dữ liệu thì tôi không biết nó là sheet nào! Nếu biết trước tên sheet nguồn và sheet đích thì dù bạn đứng ở chân trời góc bể nào đi nữa code vẫn chạy đúng!
Bạn thông cảm cho mình nha, bạn giúp mình # 7 nha bạn
 
Upvote 0
Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

Upvote 0
Mình gữi file lên, bạn xem giúp mình luôn thể cho dễ nhé bạn.

Bạn chờ nhé, tôi sẽ hoàn thiện code cho bạn một cách tổng quát nhất ngắn gọn nhất và nhanh nhất có thể. Giờ đi đám cưới đây! File bạn tôi đang thấy thú vị đây!
 
Upvote 0
Nếu đươc vậy cảm ơn bạn rất nhiều.

Sau khi xem cấu trúc file xong, tôi viết lại thủ tục Copy nhiều Đội như sau:

Tôi chọn từng vùng của mỗi bảng (tôi chọn từ 10 đội đến 20 đội), lấy số hàng đầu tiên làm phần tử của mảng 1 và số hàng cuối cùng làm phần tử của mảng 2, lần lượt từ 10 đội đến 20 đội (nếu bạn muốn thêm thì tiếp tục thực hiện như tôi, chỉ sửa chỗ này trong VBE và sửa lại Validation tại ô A1 nếu số đội tăng thêm).

Như thế, Sub tổng quát sẽ như sau (tôi đã đổi tên 2 sheet cho có sự khác biệt, tên trước chỉ khác có mỗi dấu chấm rất dễ gây nhầm lẫn):

Mã:
Private Sub TeamSetting(Optional ByRef IsOK As Boolean, Optional ByRef TeamNumber As Long)
    Dim SoDoi As Long
    With Sheets("SUB_PLAN")
        SoDoi = Val(.Range("A1"))
        
        .Range("A6:M1000").Clear
        
        ''Ngan cac so lon hon va nho hon tu 10 den 20 doi:
        If SoDoi < 10 Or SoDoi > 20 Then Exit Sub
        
        ''2 bien nay dung de kiem tra o thu tuc XuatFile
        IsOK = True: TeamNumber = SoDoi
        
        ''2 mang duoi day chi tinh tu 10 doi den 20 doi,
        ''neu muon nhieu hon thi cu viec them
        ''vao array so hang dau cua doi và so hang cuoi cua doi
        
        Dim RowDauBang(), RowCuoiBang()
        Dim FirstRow As Long, LastRow As Long
        
        ''Mang lay so hang dau cua bang:
        [COLOR=#0000ff]RowDauBang = Array(3, 14, 29, 44, 61, 78, 95, 110, 126, 142, 163)[/COLOR]
        ''Mang lay so hang cuoi cua bang:
        ''(mang dau va mang cuoi phai doi xung gia tri nhau theo dung vi tri)
        [COLOR=#0000ff]RowCuoiBang = Array(12, 27, 42, 59, 76, 94, 108, 124, 140, 161, 182)[/COLOR]
        
        SoDoi = SoDoi - 10
        
        FirstRow = RowDauBang(SoDoi)
        LastRow = RowCuoiBang(SoDoi)
        
        [COLOR=#ff0000]Sheets("MAIN_PLAN").Range("A" & FirstRow & ":K" & LastRow).Copy .Range("A6")[/COLOR]
    End With
End Sub

Câu lệnh chính chỉ là dòng màu đỏ!

Từ thủ tục này, ta mới thực hiện thủ tục để gán cho nút [Lap So Do] như sau:

Mã:
Sub TeamSet()
    On Error Resume Next
    Dim IsOK As Boolean
    
    [COLOR=#0000ff]Call HighSpeed[/COLOR]
    
    [COLOR=#ff0000]Call TeamSetting(IsOK)[/COLOR]
    
    If Not IsOK Then
        MsgBox "Tai sheet 'SUB_PLAN', cell 'A1', ban chua chon gia tri nao!"
    End If
    
    [COLOR=#0000ff]Call NormalSpeed[/COLOR]
End Sub

Bạn để ý sẽ thấy có 2 thủ tục màu xanh, với thủ tục đầu tôi cho rằng nó sẽ tăng tốc và bớt giật màn hình hơn, sau khi chạy thủ tục màu đỏ xong thì thủ tục xanh còn lại sẽ trả lại tốc độ ban đầu.

Và cũng với TeamSetting, ta sẽ tạo thủ tục để gán cho nút [Copy Nhieu File] như sau:

Mã:
Sub XuatFile()

    On Error Resume Next
    Dim IsOK As Boolean, TeamNumber As Long
    
    Call HighSpeed
    
    ''Thuc hien Copy cac bang:
    [COLOR=#ff0000]TeamSetting IsOK, TeamNumber[/COLOR]
    
    If IsOK Then
        Dim SheetName As String
        SheetName = TeamNumber & "_Teams" & "_(" & Format(Now, "hh_MM_ss") & ")"
        
        [COLOR=#800080]Sheets("SUB_PLAN").Copy[/COLOR]
        
        ActiveSheet.DrawingObjects.Delete
        Range("A1").Clear
        
        ActiveWorkbook.SaveAs _
            Filename:=ThisWorkbook.Path & "\" & SheetName, _
            [COLOR=#40e0d0]FileFormat:=xlExcel8[/COLOR]
        ActiveWorkbook.Close
        
        MsgBox "File da duoc xuat co ten: " & SheetName
    Else
        MsgBox "Tai sheet 'SUB_PLAN', cell 'A1', ban chua chon gia tri nao!"
    End If

    Call NormalSpeed
End Sub

Như vậy, với thủ tục trên dòng màu đỏ chạy độc lập, không lệ thuộc vào việc có tồn tại sơ đồ trước đó hay không, dù có dù không nó cũng kiểm tra lại cho đầy đủ.

Ở dòng màu tím, thay vì bạn dùng thủ tục Add workbook mới, thì tôi chọn phương pháp Copy cả sheet rồi xóa 2 shapes và clear validation ở ô A1, có như thế nó mới giữ được định dạng (độ rộng) của hàng và cột.

Và dòng này: FileFormat:=xlExcel8, tôi đang xài Excel 2010 nên bạn kiểm tra xem có lỗi khi chạy trên Excel 2003 không nhé!

Tôi luôn luôn đặt tên file có dấu "_" để xem nó là khoảng trắng, nhiều file với cách đặt tên không theo quy tắc đôi khi không mở được trên các máy đời cũ.

Bạn xem file và cho ý kiến đúng/ sai theo ý của bạn nhé!
 

File đính kèm

Upvote 0
Trước hết cảm ơn rất nhiều, mình đã thử nút lập sơ đồ thì ok, nút xuất file thì lỗi.
Bạn xem lại 2 lỗi dưới giúp mình nhé.
Lỗi 1: Dòng này: FileFormat:=xlExcel8, tôi đang xài Excel 2010 nên bạn kiểm tra xem có lỗi khi chạy trên Excel 2003 không nhé!

Lỗi 2: Khi mình chọn từ 10 đến 32 thì cập nhật danh sách tên VĐV qua bên sheet sơ đồ (từ cột A --> K) cái này cập nhật tên VĐV Đúng.
từ 33 --> 40 thì cập nhật danh sách tên VĐV qua bên sheet sơ đồ (từ cột A --> cột M cái này cập nhật tên VĐV Sai.

Bạn xem giúp mình nhé, cảm ơn bạn nhiều.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Trước hết cảm ơn rất nhiều, mình đã thử nút lập sơ đồ thì ok, nút xuất file thì lỗi

Bạn xem giúp mình nhé.
Bạn thay xlExcel8 thành xlNormal là được.

Tôi hỏi bạn vài điều nhé!

1) Với các sơ đồ thì chỉ sử dụng 1 trong những sơ đồ đó tùy thuộc vào số đội trong danh sách phải không?

2) Nếu thế thì những sơ đồ đó chỉ là các template, vậy thì tại sao ta không căn cứ theo số đội mà copy ra một sheet khác 1 trong những sơ đồ đó rồi tính toán, chia bảng, phân nhánh theo rút thăm mà làm trực tiếp trên sheet đó làm gì?
 
Lần chỉnh sửa cuối:
Upvote 0
Ý mình đúng ý bạn đó nhưng do mình không biết VBA nên làm vậy để copy qua sheet "SODO." tức là sheet--> SUB PLAN, cũng có lý do là vì sheet MAIN_PLAN mình ẩn và giấu nó đi rồi, nên làm vậy mà.
 
Upvote 0
Ý mình đúng ý bạn đó nhưng do mình không biết VBA nên làm vậy để copy qua sheet "SODO." tức là sheet--> SUB PLAN, cũng có lý do là vì sheet MAIN_PLAN mình ẩn và giấu nó đi rồi, nên làm vậy mà.
OK, nói như thế để mình biết và viết lại cho bạn! Không phải rườm rà nhiều nữa đâu, viết lại việc lọc tất cả, nhưng bây giờ, nhiệm vụ của bạn chỉ cần làm 1 cái sheet SƠ ĐỒ CHUẨN từ số đội nhỏ nhất (chắc là 4 đội nhỉ?) đến số đội lớn nhất và không chỉnh sửa gì nữa nhé, rồi gửi lên đây, tôi sẽ căn cứ vào đó chia bảng cho bạn.
 
Upvote 0
Xong rồi nè bạn, mình vẽ sơ đồ từ 8 đến 41 đội, vẽ thêm không được vì In trang giấy A4 nên không in đủ. Vậy bạn giúp mình theo file đi nhé.
Àh bạn chú ý dùm các số thứ tự từ 8 đội đến 32 đội từ cột A:K
33 đến 41 đội từ cột A:M.
Bạn cho sheet MAIN_PLAN ẩn giấu đi nhé (để cho nó có tính nghệ thuật 1 chút ấy mà)
Cảm ơn bạn trước nhé.
 

File đính kèm

Upvote 0
Xong rồi nè bạn, mình vẽ sơ đồ từ 8 đến 41 đội, vẽ thêm không được vì In trang giấy A4 nên không in đủ. Vậy bạn giúp mình theo file đi nhé.
Àh bạn chú ý dùm các số thứ tự từ 8 đội đến 32 đội từ cột A:K
33 đến 41 đội từ cột A:M.

Cảm ơn bạn trước nhé.
Tối thiểu là 8 đội hả bạn? Sao bạn không lường trước có chừng 4 đội tối thiểu luôn đi để làm 1 lần, sau này khỏi chỉnh sửa nữa?

Nói vậy thôi, tôi đã làm luôn cho bạn từ 4 đội rồi, bạn chờ tôi thiết kế cho bạn xong thì tôi gửi lên cho nhé!
 
Lần chỉnh sửa cuối:
Upvote 0
Đây là code chính để thực hiện ứng dụng này cho bạn!

[GPECODE=vb]
Private Sub TeamSetting(Optional ByRef IsOK As Boolean, Optional ByRef TeamNumber As Long)
Dim SoDoi As Long, IsCheck As Boolean, EndRow As Long

SoDoi = Val(TeamPlan.Range("A1"))
EndRow = DSDK.Range("B10000").End(xlUp).Row

TeamPlan.Range("A6:M1000").Clear

''Ngan cac so lon hon va nho hon tu 10 den 20 doi:
If SoDoi < 3 Or SoDoi > 41 Then
MsgBox "Tai sheet 'TEAM_PLAN', cell 'A1', ban chua chon gia tri nao!"
Exit Sub
End If

If SoDoi <> EndRow - 5 Then
Dim MyMsg As Long
MyMsg = MsgBox("Tai cell A1 ban nhap khac voi Tong So Doi trong sheet 'DSDK'," & vbLf & vbLf & _
"Ban se lam gi voi cac muc duoi day?" & vbLf & vbLf & _
"- Bam Yes neu ban muon o A1 duoc nhap Tong So Doi hien co." & vbLf & vbLf & _
"- Bam No neu ban muon co cai So Do cho so doi ma ban nhap tai o A1." & vbLf & vbLf & _
"- Bam Cancel neu ban huy thuc hien thao tac nay.", _
vbQuestion + vbYesNoCancel, "THÔNG BÁO")
If MyMsg = vbYes Then
SoDoi = EndRow - 5
TeamPlan.Range("A1") = SoDoi
ElseIf MyMsg = vbNo Then
IsCheck = True
Else
Exit Sub
End If
End If

''2 bien nay dung de kiem tra o thu tuc XuatFile
IsOK = True: TeamNumber = SoDoi

Dim RowDauBang(), RowCuoiBang()
Dim FirstRow As Long, LastRow As Long
''Mang lay so hang dau cua bang:
RowDauBang = Array(1, 10, 19, 28, 38, 48, 59, 70, 85, 100, 117, 134, 152, 167, _
183, 199, 220, 241, 263, 285, 305, 325, 348, 371, 399, 427, _
459, 484, 518, 552, 580, 608, 644, 680, 716, 752, 788, 824)
''Mang lay so hang cuoi (bao gom hang trong) cua bang:
''(mang dau va mang cuoi phai doi xung gia tri nhau theo dung vi tri)
RowCuoiBang = Array(9, 18, 27, 37, 47, 58, 69, 84, 99, 116, 133, 151, 166, 182, _
198, 219, 240, 262, 284, 304, 324, 347, 370, 398, 426, 458, _
483, 517, 551, 579, 607, 643, 679, 715, 751, 787, 823, 861)
Select Case SoDoi
Case 3, 4
SoDoi = 0
Case Else
SoDoi = SoDoi - 4
End Select

FirstRow = RowDauBang(SoDoi)
LastRow = RowCuoiBang(SoDoi)

PlanTemplate.Range("A" & FirstRow & ":M" & LastRow).Copy TeamPlan.Range("A6")

If IsCheck Then Exit Sub

Dim LastRange As Range
Dim ArrTenDoi(), ArrBocTham(), ArrBangA(), ArrBangB()
Dim r1 As Long, r2 As Long, ubd As Long, LastNumber As Long

With DSDK.Range("A6:E" & EndRow)
''Sap xep theo cot Boc Tham So:
.Sort DSDK.Range("E6")
ArrTenDoi = DSDK.Range("B6:B" & EndRow)
ArrBocTham = DSDK.Range("E6:E" & EndRow)
''Tra lai sap xep theo STT:
.Sort DSDK.Range("A6")
End With

Set LastRange = TeamPlan.Range("A1000").End(xlUp)
EndRow = LastRange.Row
LastNumber = LastRange.Value

ArrBangA = TeamPlan.Range("A8:B" & EndRow)

If TeamNumber > 32 Then
ArrBangB = TeamPlan.Range("L8:M" & EndRow)
Else
ArrBangB = TeamPlan.Range("J8:K" & EndRow)
End If

r2 = 1
ubd = UBound(ArrBangA)

For r1 = 1 To LastNumber
For r2 = r2 To ubd
If ArrBangA(r2, 1) = ArrBocTham(r1, 1) Then
ArrBangA(r2, 2) = ArrTenDoi(r1, 1)
r2 = r2 + 1
Exit For
End If
Next
Next

r2 = 1

For r1 = LastNumber + 1 To UBound(ArrTenDoi)
For r2 = r2 To ubd
If ArrBangB(r2, 2) = ArrBocTham(r1, 1) Then
ArrBangB(r2, 1) = ArrTenDoi(r1, 1)
r2 = r2 + 1
Exit For
End If
Next
Next

TeamPlan.Range("A8:B" & EndRow) = ArrBangA

If TeamNumber > 32 Then
TeamPlan.Range("L8:M" & EndRow) = ArrBangB
Else
TeamPlan.Range("J8:K" & EndRow) = ArrBangB
End If

End Sub
[/GPECODE]

Tải file về và kiểm nghiệm xem đã như ý bạn chưa nhé!
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Tôi mới chỉnh lại code không cần dùng Name ở sheet DSDK nhé bạn, tải lại file mới đi nhé!
 
Upvote 0
Mới thử qua thấy được được rồi nhưng sao nó in trên tờ A4 thì bị hụt rồi. Khi xuất file cho gọn trong tờ giấy A4 đó bạn
 
Lần chỉnh sửa cuối:
Upvote 0
Mới thử qua thấy được được rồi nhưng sao nó in trên tờ A4 thì bị hụt rồi. Xem và giúp cho in trên tờ A4 đó bạn

Canh bị hụt thì bạn chỉnh phần trăm lại cho fit với giấy in của bạn! Đơn giản vậy cũng không biết nữa sao ta?

Nhớ là tôi mới up file mới đấy nhé!

 

File đính kèm

  • Preview.jpg
    Preview.jpg
    53.4 KB · Đọc: 15
Upvote 0
Thật tình mình không biết thật, mặt dù đã chỉnh như bạn rồi nhưng không in ra được bạn à, bạn giúp mình tiếp nhé, cảm ơn bạn
Y.JPG
 
Upvote 0
Thật tình mình không biết thật, mặt dù đã chỉnh như bạn rồi nhưng không in ra được bạn à, bạn giúp mình tiếp nhé, cảm ơn bạn

Bạn thay thủ tục cũ bằng thủ tục này nhé:

Mã:
Sub XuatFile()

    On Error Resume Next
    Dim IsOK As Boolean, TeamNumber As Long
    
    Call HighSpeed
    
    ''Thuc hien Copy cac bang:
    TeamSetting IsOK, TeamNumber
    
    If IsOK Then
        Dim SheetName As String
        SheetName = TeamNumber & "_Teams" & "_(" & Format(Now, "hh_MM_ss") & ")"
        
        TeamPlan.Copy
        
        ActiveSheet.DrawingObjects.Delete
[COLOR=#ff0000]        ActiveSheet.Rows("1:5").Delete 2[/COLOR]
        
        ActiveWorkbook.SaveAs _
            Filename:=ThisWorkbook.Path & "\" & SheetName, _
            FileFormat:=xlNormal
        ActiveWorkbook.Close
        
        MsgBox "File da duoc xuat co ten: " & SheetName
    End If

    Call NormalSpeed
End Sub

Chỗ màu đỏ là tôi mới sửa lại để xóa những dòng không cần thiết khi xuất ra file mới đấy.

Bạn chỉnh trong Page Setup tại mục Zoom chừng 77 đến 80% cho những sơ đồ lớn là được rồi.
 
Upvote 0
Sao in không được bạn thấy hình của bạn là được rồi mà, muốn 1 trang thì chỉ Fit to: 1 pages wide by 1 tall là luôn gói gọn trong 1 trang in khỏi lo
 
Upvote 0
Sao in không được bạn thấy hình của bạn là được rồi mà, muốn 1 trang thì chỉ Fit to: 1 pages wide by 1 tall là luôn gói gọn trong 1 trang in khỏi lo
Hẳn nhiên là nằm gọn tờ A4 rồi bạn nhưng các đường kẻ của sơ đồ bị đứt không liền nhau bạn à.
ActiveSheet.DrawingObjects.Delete
ActiveSheet.Rows("1:5").Delete 2
Cảm ơn bạn nhiều lắm bạn Hoàng Trọng Nghĩa, chúc bạn vui và hạnh phúc. Cảm ơn bạn
 
Lần chỉnh sửa cuối:
Upvote 0
Hẳn nhiên là nằm gọn tờ A4 rồi bạn nhưng các đường kẻ của sơ đồ bị đứt không liền nhau bạn à.

Mặt dù đã chỉnh như bạn nói vẫn chưa được bạn à. Lại khổ nữa rồi

Thì nhìn vậy thôi chứ in ra không có bị gì hết sao ko in thử mà cứ la lên hoài là sao --=0
 
Upvote 0
Thì nhìn vậy thôi chứ in ra không có bị gì hết sao ko in thử mà cứ la lên hoài là sao --=0
Hà hà. Mình đã in ra thử rồi, quá tuyệt bạn ơi. Hà hà. Cảm ơn bạn nhiều.
Cho hỏi bạn nmhung49; Hoàng Trọng Nghĩa; Concogia cả 3 bạn ở đâu vậy bạn, mình có thể đền đáp được gì không? cảm ơn rất nhiều.
 
Upvote 0
Hà hà. Mình đã in ra thử rồi, quá tuyệt bạn ơi. Hà hà. Cảm ơn bạn nhiều. Cho hỏi bạn nmhung49; Hoàng Trọng Nghĩa; Concogia cả 3 bạn ở đâu vậy bạn, mình có thể đền đáp được gì không? cảm ơn rất nhiều.
Hoàng Trọng Nghĩa; Concogia ở Sì-gòn, còn bạn nmhung49 ở miền Tây á! Bạn ở đâu?
 
Upvote 0
Hoàng Trọng Nghĩa; Concogia ở Sì-gòn, còn bạn nmhung49 ở miền Tây á! Bạn ở đâu?
Mình ở tận cuối cùng bản đồ việt nam bạn à, xa quá vậy ta, À bạn Nghĩa cho mình hỏi chút nữa nhé, mình muốn nhập họ và tên VĐV tại cột B nhưng khi cập nhật tên VĐV qua sheet sơ đồ là cột C vì mình còn gắn theo đơn vị tham dự nữa bạn à. VD như tên VĐV là: Nguyễn Anh Tèo cột (B) và đơn vị là Cà Mau (cột C) --> Cập nhật qua sheet Sơ Đồ là: Nguyễn Anh Tèo Cà Màu. Cảm ơn bạn nhiều lắm. À bạn cho mình SĐT được không khi nào có lên Sg mình cafe,thuốc lá,rượu bia 4 cái vào 1 chổ nhé.
 
Upvote 0
Mình ở tận cuối cùng bản đồ việt nam bạn à, xa quá vậy ta, À bạn Nghĩa cho mình hỏi chút nữa nhé, mình muốn nhập họ và tên VĐV tại cột B nhưng khi cập nhật tên VĐV qua sheet sơ đồ là cột C vì mình còn gắn theo đơn vị tham dự nữa bạn à. VD như tên VĐV là: Nguyễn Anh Tèo cột (B) và đơn vị là Cà Mau (cột C) --> Cập nhật qua sheet Sơ Đồ là: Nguyễn Anh Tèo Cà Màu. Cảm ơn bạn nhiều lắm. À bạn cho mình SĐT được không khi nào có lên Sg mình cafe,thuốc lá,rượu bia 4 cái vào 1 chổ nhé.
Bạn nmhung49 ở An Giang đấy bạn!

Code thêm cột Đơn vị cũng đâu có khó gì đâu, chỉnh sửa chút xíu tại đây:

Mã:
    With DSDK.Range("A6:E" & EndRow)
        ''Sap xep theo cot Boc Tham So:
        .Sort DSDK.Range("E6")
[COLOR=#ff0000]            ArrTenDoi = DSDK.Range("B6:[/COLOR][COLOR=#0000cd]C[/COLOR][COLOR=#ff0000]" & EndRow)[/COLOR]
            ArrBocTham = DSDK.Range("E6:E" & EndRow)
        ''Tra lai sap xep theo STT:
        .Sort DSDK.Range("A6")
    End With
    
    Set LastRange = TeamPlan.Range("A1000").End(xlUp)
    EndRow = LastRange.Row
    LastNumber = LastRange.Value
    
    ArrBangA = TeamPlan.Range("A8:B" & EndRow)
    
    If TeamNumber > 32 Then
        ArrBangB = TeamPlan.Range("L8:M" & EndRow)
    Else
        ArrBangB = TeamPlan.Range("J8:K" & EndRow)
    End If
    
    r2 = 1
    ubd = UBound(ArrBangA)
    
    For r1 = 1 To LastNumber
        For r2 = r2 To ubd
            If ArrBangA(r2, 1) = ArrBocTham(r1, 1) Then
                ArrBangA(r2, 2) = ArrTenDoi(r1, 1)[COLOR=#ff0000] & " - " & ArrTenDoi(r1, 2)[/COLOR]
                r2 = r2 + 1
                Exit For
            End If
        Next
    Next
    
    r2 = 1
    
    For r1 = LastNumber + 1 To UBound(ArrTenDoi)
        For r2 = r2 To ubd
            If ArrBangB(r2, 2) = ArrBocTham(r1, 1) Then
                ArrBangB(r2, 1) = ArrTenDoi(r1, 1)[COLOR=#ff0000] & " - " & ArrTenDoi(r1, 2)[/COLOR]
                r2 = r2 + 1
                Exit For
            End If
        Next
    Next

Sửa mấy chổ tô màu.

Bạn tải file về kiểm tra nhé!
 

File đính kèm

Upvote 0

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

Back
Top Bottom