Tạo giúp em Code copy cột dọc thành hàng ngang! (1 người xem)

Liên hệ QC

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

Anh HieuCD ơi, code anh gửi cho em thì nếu chạy cái file e tải lên thì chạy được còn nếu chạy file khác hoặc thêm dòng ngang ở phía dưới ( nghĩa là ở cột BBS không phải là tới 4 mà có thể là vài trăm chẳng hạn) thì nó báo lỗi Run-time error '9'. Sau đó em kích vào chứ debug thì nó hiện code lên và bôi vàng dòng "arr(n, k3) = Darr(m, j) ". E chẳng hiểu mô tê gì. Anh có thể giúp em với được không ạ. E cảm ơn nhiều ạ. (E có file đính kèm phía dưới đấy ạ).
bạn thêm đoạn code màu đỏ vào
Mã:
thoat:
For n = 2 To k
    k2 = 5 * max1 + 16: k3 = 5 * max1 + 16 + max2
    Dic2.RemoveAll: Dic3.RemoveAll
    For j = 22 To 27
        For m = 2 To UBound(Darr)
            If arr(n, 1) = Darr(m, 1) [COLOR=#ff0000]And Darr(m, j) <>[/COLOR] [COLOR=#ff0000]""[/COLOR] Then
                If j <= 24 Then
                    If Not Dic2.Exists(Darr(m, j)) Then
                        Dic2.Add Darr(m, j), ""
                        k2 = k2 + 1
                        arr(n, k2) = Darr(m, j)
                    End If
                Else
                    If Not Dic3.Exists(Darr(m, j)) Then
                        Dic3.Add Darr(m, j), ""
                        k3 = k3 + 1
                        arr(n, k3) = Darr(m, j)
                    End If
                End If
            End If
        Next m
    Next j
Next n
Set Dic2 = Nothing: Set Dic3 = Nothing
Range("af1:dsC" & Range("af65000").End(xlUp).Row).ClearContents
Range("af1").Resize(k, 16 + max1 * 5 + max2 + max3) = arr
Application.ScreenUpdating = True
End Sub
 
Anh HieuCD ơi, code anh gửi cho em thì nếu chạy cái file e tải lên thì chạy được còn nếu chạy file khác hoặc thêm dòng ngang ở phía dưới ( nghĩa là ở cột BBS không phải là tới 4 mà có thể là vài trăm chẳng hạn) thì nó báo lỗi Run-time error '9'. Sau đó em kích vào chứ debug thì nó hiện code lên và bôi vàng dòng "arr(n, k3) = Darr(m, j) ". E chẳng hiểu mô tê gì. Anh có thể giúp em với được không ạ. E cảm ơn nhiều ạ. (E có file đính kèm phía dưới đấy ạ).

Chào diepminhhong,

Góp ý với bạn, lần sau trích dẫn bài của ai đó để trả lời thì bạn chỉ cần trích dẫn phần cần thiết, phần cần lưu tâm tới, không nên trích dẫn nguyên cả bài (nhất là bài chứa code dài như trên) dẫn đến kéo dài trang, khó xem.
Nếu không cần trích dẫn thì bạn có thể bắt đầu bài viết của mình muốn nói với một hoặc nhiều người thì viết vầy:
"Chào một ai đó" hoặc "Gửi một ai đó"
"Chào người một, người thứ hai..."
Thân,
 
Chào diepminhhong,

Góp ý với bạn, lần sau trích dẫn bài của ai đó để trả lời thì bạn chỉ cần trích dẫn phần cần thiết, phần cần lưu tâm tới, không nên trích dẫn nguyên cả bài (nhất là bài chứa code dài như trên) dẫn đến kéo dài trang, khó xem.
Nếu không cần trích dẫn thì bạn có thể bắt đầu bài viết của mình muốn nói với một hoặc nhiều người thì viết vầy:
"Chào một ai đó" hoặc "Gửi một ai đó"
"Chào người một, người thứ hai..."
Thân,
Vâng ạ, e cảm ơn anh befaint đã góp ý cho e ạ. E cũng là thành viên mới có gì chưa đúng với nội quy của diễn đàn các anh chỉ bảo giúp e ạ.
 
bạn thêm đoạn code màu đỏ vào
Mã:
thoat:
For n = 2 To k
    k2 = 5 * max1 + 16: k3 = 5 * max1 + 16 + max2
    Dic2.RemoveAll: Dic3.RemoveAll
    For j = 22 To 27
        For m = 2 To UBound(Darr)
            If arr(n, 1) = Darr(m, 1) [COLOR=#ff0000]And Darr(m, j) <>[/COLOR] [COLOR=#ff0000]""[/COLOR] Then
                If j <= 24 Then
                    If Not Dic2.Exists(Darr(m, j)) Then
                        Dic2.Add Darr(m, j), ""
                        k2 = k2 + 1
                        arr(n, k2) = Darr(m, j)
                    End If
                Else
                    If Not Dic3.Exists(Darr(m, j)) Then
                        Dic3.Add Darr(m, j), ""
                        k3 = k3 + 1
                        arr(n, k3) = Darr(m, j)
                    End If
                End If
            End If
        Next m
    Next j
Next n
Set Dic2 = Nothing: Set Dic3 = Nothing
Range("af1:dsC" & Range("af65000").End(xlUp).Row).ClearContents
Range("af1").Resize(k, 16 + max1 * 5 + max2 + max3) = arr
Application.ScreenUpdating = True
End Sub

Anh ơi không hiểu sao e chạy code đó vào file của em thì vẫn báo lỗi. File của em có tất cả số BBS là 81 nhưng e chạy code chỉ được tới BBS 62 thôi. Còn chạy tới BBS 63 trở đi thì lại bị lỗi. Từ BBS 63 trở đi thì cái được cái thì bị lỗi (vì em ngồi dò thủ công từng BBS một nên e thấy như vậy). E có gửi file đính kèm, anh có thể kiểm tra giúp e với được không ạ. E biết e hỏi hơi nhiều, nhưng thực sự e không biết gì về phần code này cả. Mong anh thông cảm ạ.
 

File đính kèm

Anh ơi không hiểu sao e chạy code đó vào file của em thì vẫn báo lỗi. File của em có tất cả số BBS là 81 nhưng e chạy code chỉ được tới BBS 62 thôi. Còn chạy tới BBS 63 trở đi thì lại bị lỗi. Từ BBS 63 trở đi thì cái được cái thì bị lỗi (vì em ngồi dò thủ công từng BBS một nên e thấy như vậy). E có gửi file đính kèm, anh có thể kiểm tra giúp e với được không ạ. E biết e hỏi hơi nhiều, nhưng thực sự e không biết gì về phần code này cả. Mong anh thông cảm ạ.
bạn kiểm tra lại code
Mã:
Sub CopyDoc_Ngang1()
Dim Dic2 As Object, Dic3 As Object, Darr, arr()
Dim i As Long, j As Integer, n As Integer, m As Integer, k As Integer
Dim max1 As Integer, max2 As Integer, max3 As Integer, k2 As Integer, k3 As Integer
Set Dic2 = CreateObject("Scripting.Dictionary")
Set Dic3 = CreateObject("Scripting.Dictionary")
Darr = Range("a1:aa" & Range("a2").End(xlDown).Row)
Application.ScreenUpdating = False
Tmp = Darr(2, 1):   max1 = 0
max2 = 0:           max3 = 0
For i = 2 To UBound(Darr)
    If Darr(i, 1) = Tmp Then
        k1 = k1 + 1
        For j = 22 To 24
            If Not Dic2.Exists(Darr(i, j)) And Darr(i, j) <> "" Then
                k2 = k2 + 1: Dic2.Add Darr(i, j), ""
                If k2 > max2 Then max2 = k2
            End If
        Next j
        For n = 25 To 27
            If Not Dic3.Exists(Darr(i, n)) And Darr(i, n) <> "" Then
                k3 = k3 + 1: Dic3.Add Darr(i, n), ""
                If k3 > max3 Then max3 = k3
            End If
        Next n
    Else
        k1 = 1:      Tmp = Darr(i, 1)
        k2 = 0:     k3 = 0
        Dic2.RemoveAll: Dic3.RemoveAll
        For j = 22 To 24
            If Not Dic2.Exists(Darr(i, j)) And Darr(i, j) <> "" Then
                k2 = k2 + 1: Dic2.Add Darr(i, j), ""
                If k2 > max2 Then max2 = k2
            End If
        Next j
        For n = 25 To 27
            If Not Dic3.Exists(Darr(i, n)) And Darr(i, n) <> "" Then
                k3 = k3 + 1: Dic3.Add Darr(i, n), ""
                If k3 > max3 Then max3 = k3
            End If
        Next n
    End If
    If k1 > max1 Then max1 = k1
Next i
ReDim arr(1 To UBound(Darr), 1 To 16 + max1 * 5 + max2 + max3)
For j = 1 To 16 + max1 * 5
    If j <= 2 Then
        arr(1, j) = Darr(1, j)
    ElseIf j >= 5 * max1 + 3 Then
        arr(1, j) = Darr(1, j - 5 * max1 + 5)
    ElseIf j Mod max1 = 3 Then
        arr(1, j) = Darr(1, Int(j / max1) + 3)
    Else
        arr(1, j) = Darr(1, Int((j - 3) / max1) + 3) & ((j - 3) Mod max1)
    End If
Next j
For j = 1 To max2
    arr(1, j + 16 + max1 * 5) = "TC" & j
Next j
For j = 1 To max3
    arr(1, j + 16 + max1 * 5 + max2) = "NDTC" & j
Next j
k = 1
For i = 2 To UBound(Darr)
    k = k + 1
    arr(k, 1) = Darr(i, 1): arr(k, 2) = Darr(i, 2)
    For j = 5 * max1 + 3 To 5 * max1 + 16
        arr(k, j) = Darr(i, j - 5 * max1 + 5)
    Next j
    cot = 1
    For n = i To UBound(Darr)
        If Darr(n, 1) = Darr(i, 1) Then
            cot = cot + 1
            arr(k, cot + 1) = Darr(n, 3)
            arr(k, cot + 1 + max1) = Darr(n, 4)
            arr(k, cot + 1 + 2 * max1) = Darr(n, 5)
            arr(k, cot + 1 + 3 * max1) = Darr(n, 6)
            arr(k, cot + 1 + 4 * max1) = Darr(n, 7)
            If n = UBound(Darr) Then GoTo thoat
        Else
            i = n - 1
            GoTo tiep
        End If
    Next n
tiep:
Next i
thoat:
For n = 2 To k
    k2 = 5 * max1 + 16: k3 = 5 * max1 + 16 + max2
    Dic2.RemoveAll: Dic3.RemoveAll
    For j = 22 To 27
        For m = 2 To UBound(Darr)
            If arr(n, 1) = Darr(m, 1) And Darr(m, j) <> "" Then
                If j <= 24 Then
                    If Not Dic2.Exists(Darr(m, j)) And Darr(m, j) <> "" Then
                        Dic2.Add Darr(m, j), ""
                        k2 = k2 + 1
                        arr(n, k2) = Darr(m, j)
                    End If
                Else
                    If Not Dic3.Exists(Darr(m, j)) And Darr(m, j) <> "" Then
                        Dic3.Add Darr(m, j), ""
                        k3 = k3 + 1
                        arr(n, k3) = Darr(m, j)
                    End If
                End If
            End If
        Next m
    Next j
Next n
Set Dic2 = Nothing: Set Dic3 = Nothing
Range("ac1:hh" & Range("ac65000").End(xlUp).Row).ClearContents
Range("ac1").Resize(k, 16 + max1 * 5 + max2 + max3) = arr
Application.ScreenUpdating = True
End Sub
 
bạn kiểm tra lại code
Anh HieuCD ơi, Anh có thể xem lại giúp em file này với được k ạ? (file đính kèm). E cảm ơn anh ạ
như vậy là lúc nào cũng có 16 cột CV? code sẽ đơn giản hơn nhiều
các cột cuối TC và NDTC có qui định số cột không? hay lấy vừa đủ?
bạn cho biết và sáng mai mình sẽ viết code lại, đơn giản hơn nhiều
 
như vậy là lúc nào cũng có 16 cột CV? code sẽ đơn giản hơn nhiều
các cột cuối TC và NDTC có qui định số cột không? hay lấy vừa đủ?
bạn cho biết và sáng mai mình sẽ viết code lại, đơn giản hơn nhiều
Vâng ạ. Khi chuyển sang hàng ngang thì dù số BBS có nhiều hay ít thì khi chuyển sang hàng ngang thì lúc nào cũng phải có từ CV, CV1 tới CV15 tương ứng là ĐV, KLTK, KLTC, KLNT(Code đầu tiên anh gửi cho e là anh viết như thế). Còn cột TC và NDTC thì chỉ cần tới 10 thôi ạ. Tức là TC1....TC10 và NDTC1.... tới NDTC10. Cột TC và NDTC thì TC1 tương ứng với NDTC1, TC2 tương ứng với NDTC2...... và loại bỏ trùng nhau. E làm tới 10 để phòng thôi chứ thực ra chỉ tới 6 là nhiều rồi anh ạ. Tóm lại cái cột TC với NDTC đấy anh viết sao cũng được chỉ cần TC1 tương ứng với NDTC1........ và loại bỏ trùng nhau thôi ạ.
 
Vâng ạ. Khi chuyển sang hàng ngang thì dù số BBS có nhiều hay ít thì khi chuyển sang hàng ngang thì lúc nào cũng phải có từ CV, CV1 tới CV15 tương ứng là ĐV, KLTK, KLTC, KLNT(Code đầu tiên anh gửi cho e là anh viết như thế). Còn cột TC và NDTC thì chỉ cần tới 10 thôi ạ. Tức là TC1....TC10 và NDTC1.... tới NDTC10. Cột TC và NDTC thì TC1 tương ứng với NDTC1, TC2 tương ứng với NDTC2...... và loại bỏ trùng nhau. E làm tới 10 để phòng thôi chứ thực ra chỉ tới 6 là nhiều rồi anh ạ. Tóm lại cái cột TC với NDTC đấy anh viết sao cũng được chỉ cần TC1 tương ứng với NDTC1........ và loại bỏ trùng nhau thôi ạ.

Vậy thì bạn còn chưa nắm được quy luật tạo ra số lượng CV.
Số lượng CV = max (count BBS(i) trong BBS)
Còn số lượng nhóm TC và NDTC như tôi đã diễn đạt lại theo hướng dẫn của HieuCD ở bài #18.
 
Vậy thì bạn còn chưa nắm được quy luật tạo ra số lượng CV.
Số lượng CV = max (count BBS(i) trong BBS)
Còn số lượng nhóm TC và NDTC như tôi đã diễn đạt lại theo hướng dẫn của HieuCD ở bài #18.

Cái đó thì e biết rồi anh befaint ạ. Sở dĩ e muốn cái nào cũng là 16 là vì nó liên quan tới 1 file sau này của e. E để mặc định nó là 16 rồi. file đó = max số BBS anh ạ. Vì phần code em k biết gì nên khó chỉnh sửa nên e phải để vậy. Mong các anh giúp đỡ.
 
Vâng ạ. Khi chuyển sang hàng ngang thì dù số BBS có nhiều hay ít thì khi chuyển sang hàng ngang thì lúc nào cũng phải có từ CV, CV1 tới CV15 tương ứng là ĐV, KLTK, KLTC, KLNT(Code đầu tiên anh gửi cho e là anh viết như thế). Còn cột TC và NDTC thì chỉ cần tới 10 thôi ạ. Tức là TC1....TC10 và NDTC1.... tới NDTC10. Cột TC và NDTC thì TC1 tương ứng với NDTC1, TC2 tương ứng với NDTC2...... và loại bỏ trùng nhau. E làm tới 10 để phòng thôi chứ thực ra chỉ tới 6 là nhiều rồi anh ạ. Tóm lại cái cột TC với NDTC đấy anh viết sao cũng được chỉ cần TC1 tương ứng với NDTC1........ và loại bỏ trùng nhau thôi ạ.
code chạy với số cột cố định, khi cần thay đổi thì bạn khai báo lại số cột trong code
Mã:
Sub CopyDoc_Ngang()
Dim Dic As Object, Darr, arr()
Dim i As Long, n As Long, m As Long, j As Integer, k As Integer, k2 As Integer, Scot1 As Integer, Scot2 As Integer
Set Dic = CreateObject("Scripting.Dictionary")
Darr = Range("a1:aa" & Range("a1").End(xlDown).Row)
Application.ScreenUpdating = False
Scot1 = 16  'so cot NV
Scot2 = 6   'so cot TC. Khi can thay doi thi dieu chinh cac so cot lai
ReDim arr(1 To UBound(Darr), 1 To 16 + 5 * Scot1 + 2 * Scot2)   'tong cot la 108=16+5*16+2*6
'tao tieu de cot
For j = 1 To 16 + 5 * Scot1
    If j <= 2 Then
        arr(1, j) = Darr(1, j)
    ElseIf j >= 5 * Scot1 + 3 Then
        arr(1, j) = Darr(1, j - 5 * Scot1 + 5)
    ElseIf j Mod Scot1 = 3 Then
        arr(1, j) = Darr(1, Int(j / Scot1) + 3)
    Else
        arr(1, j) = Darr(1, Int((j - 3) / Scot1) + 3) & ((j - 3) Mod Scot1)
    End If
Next j
For j = 1 To Scot2
    arr(1, j + 16 + Scot1 * 5) = "TC" & j
    arr(1, j + 16 + Scot1 * 5 + Scot2) = "NDTC" & j
Next j
'Lay du lieu toi cot Nam1
k = 1
For i = 2 To UBound(Darr)
    k = k + 1
    arr(k, 1) = Darr(i, 1): arr(k, 2) = Darr(i, 2)
    For j = 5 * Scot1 + 3 To 5 * Scot1 + 16
        arr(k, j) = Darr(i, j - 5 * Scot1 + 5)
    Next j
    cot = 1
    For n = i To UBound(Darr)
        If Darr(n, 1) = Darr(i, 1) Then
            cot = cot + 1
            arr(k, cot + 1) = Darr(n, 3)
            arr(k, cot + 1 + Scot1) = Darr(n, 4)
            arr(k, cot + 1 + 2 * Scot1) = Darr(n, 5)
            arr(k, cot + 1 + 3 * Scot1) = Darr(n, 6)
            arr(k, cot + 1 + 4 * Scot1) = Darr(n, 7)
            If n = UBound(Darr) Then GoTo thoat
        Else
            i = n - 1
            GoTo tiep
        End If
    Next n
tiep:
Next i
thoat:
'Lay du lieu  cot TC va NDTC
For n = 2 To k
    k2 = 5 * Scot1 + 16
    Dic.RemoveAll
    For j = 22 To 24
        For m = 2 To UBound(Darr)
            If arr(n, 1) = Darr(m, 1) And Darr(m, j) <> "" Then
                If Not Dic.Exists(Darr(m, j)) And Darr(m, j) <> "" Then
                    Dic.Add Darr(m, j), ""
                    k2 = k2 + 1
                    arr(n, k2) = Darr(m, j)
                    arr(n, k2 + Scot2) = Darr(m, j + 3)
                End If
            End If
        Next m
    Next j
Next n
Set Dic = Nothing
Range("ac1:en" & Range("ac65000").End(xlUp).Row).Clear
Range("ac1").Resize(k, 16 + Scot1 * 5 + 2 * Scot2) = arr
Range("ac1").Resize(k, 16 + Scot1 * 5 + 2 * Scot2).Borders.LineStyle = 1
Application.ScreenUpdating = True
End Sub
 
Lần chỉnh sửa cuối:
Cái đó thì e biết rồi anh befaint ạ. Sở dĩ e muốn cái nào cũng là 16 là vì nó liên quan tới 1 file sau này của e. E để mặc định nó là 16 rồi. file đó = max số BBS anh ạ. Vì phần code em k biết gì nên khó chỉnh sửa nên e phải để vậy. Mong các anh giúp đỡ.
Chào diepminhhong,

Tôi viết code cho trường hợp số BBS, số TC/ NDTC là tuỳ dữ liệu nhập vào (theo cấu trúc File của bạn).
Số dòng trong Sub chính cũng gần bằng bài #33 nhưng lại dùng thêm 4 Function --=0--=0
Mời bạn xem file.
 

File đính kèm

Chào diepminhhong,

Tôi viết code cho trường hợp số BBS, số TC/ NDTC là tuỳ dữ liệu nhập vào (theo cấu trúc File của bạn).
Số dòng trong Sub chính cũng gần bằng bài #33 nhưng lại dùng thêm 4 Function --=0--=0
Mời bạn xem file.
E cảm ơn anh befaint. Hôm nay đi làm e mới vào diễn đàn và đọc được bài của anh. E đang down về thử xem sao. Cảm ơn anh nhiều nhé.
 
Web KT

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

Back
Top Bottom