Những câu hỏi về code, xin giải thích các code, đề nghị các bạn gửi vào đây

Liên hệ QC
Status
Không mở trả lời sau này.

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Kể từ hôm nay, tất cả những câu hỏi nhờ giải thích dùm một đoạn code, hay là hỏi những vấn đề linh tinh gì liên quan đến cách viết code, đề nghị các bạn gửi chung vào đây.

Những đề tài mới với tiêu đề: "Nhờ giải thích dùm đoạn code", mà không nói rõ là code gì, code dùng để làm gì, sẽ bị xóa.

BQT

----------------------------------------------------------------------------------------------------------------


Em xin được hỏi 2 đoạn code sau có tương đương nhau ?

Cells(Cells.Rows.Count, 1).End(xlUp).Row có tương đương với [A65000].End(xlup).row

Cám ơn các anh chỉ giáo
 
Chỉnh sửa lần cuối bởi điều hành viên:
Chào các bạn ! Trong chủ đề Sort cột khi gộp nhiều Sheet bạn Ndu đã viết giúp tôi thủ tục này, tôi test thấy rất tốt (nhanh và chính xác) và đã áp dụng vào thực tế công việc của mình nhưng do tôi không hiểu nhiều về mảng nên không hiểu được thuật giải của đoạn code này. Vì vậy nhờ các bạn dịch nôm giúp tôi đoạn code sau để tôi có thêm tài liệu học về mảng. Xin chân thành cảm ơn !

Mã:
[COLOR=#0000BB][FONT=monospace]Sub Main[/FONT][/COLOR][COLOR=#007700][FONT=monospace]()
  [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Dim tmpArr[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Arr[/FONT][/COLOR][COLOR=#007700][FONT=monospace]()
  [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Dim lR [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Long[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lC [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Long[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lCs [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Long[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]i [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Long[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]n [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Long[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lCPos [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Long
  Dim wks [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Worksheet[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]wksDes [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Worksheet[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Dic [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Object
  Dim sTitle [/FONT][/COLOR][COLOR=#007700][FONT=monospace]As [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]String
  On Error Resume Next
  Set Dic [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]CreateObject[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Scripting.Dictionary"[/FONT][/COLOR][COLOR=#007700][FONT=monospace])
  [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Set wksDes [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Worksheets[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Tong hop"[/FONT][/COLOR][COLOR=#007700][FONT=monospace])
  [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]wksDes[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]UsedRange[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]ClearContents
  ReDim Arr[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1 To 60000[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1 To 1[/FONT][/COLOR][COLOR=#007700][FONT=monospace])
  For [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Each wks In ThisWorkbook[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Worksheets
    [/FONT][/COLOR][COLOR=#007700][FONT=monospace]If [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]UCase[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]wks[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Name[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) <> [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]UCase[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]wksDes[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Name[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Then
      tmpArr [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]wks[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]UsedRange[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Value
      [/FONT][/COLOR][COLOR=#007700][FONT=monospace]If [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]TypeName[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]tmpArr[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) = [/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"Variant()" [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Then
        n [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]n [/FONT][/COLOR][COLOR=#007700][FONT=monospace]+ [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1
        [/FONT][/COLOR][COLOR=#007700][FONT=monospace]For [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lR [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]2 To UBound[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]tmpArr[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace])
          [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]n [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]n [/FONT][/COLOR][COLOR=#007700][FONT=monospace]+ [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1
          [/FONT][/COLOR][COLOR=#007700][FONT=monospace]For [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lC [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1 To UBound[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]tmpArr[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]2[/FONT][/COLOR][COLOR=#007700][FONT=monospace])
            [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]sTitle [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Trim[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]CStr[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]tmpArr[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lC[/FONT][/COLOR][COLOR=#007700][FONT=monospace])))
            If [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Len[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]sTitle[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Then
              [/FONT][/COLOR][COLOR=#007700][FONT=monospace]If [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Not Dic[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Exists[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]sTitle[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Then
                lCs [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lCs [/FONT][/COLOR][COLOR=#007700][FONT=monospace]+ [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1
                Dic[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Add sTitle[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lCs
                [/FONT][/COLOR][COLOR=#007700][FONT=monospace]If [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]UBound[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Arr[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]2[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) < [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lCs Then ReDim Preserve Arr[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1 To 60000[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1 To lCs[/FONT][/COLOR][COLOR=#007700][FONT=monospace])
                [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Arr[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lCs[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) = [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]sTitle
                Arr[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]n[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lCs[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) = [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]tmpArr[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lR[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lC[/FONT][/COLOR][COLOR=#007700][FONT=monospace])
              Else
                [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lCPos [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Dic[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Item[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]sTitle[/FONT][/COLOR][COLOR=#007700][FONT=monospace])
                [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Arr[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]n[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lCPos[/FONT][/COLOR][COLOR=#007700][FONT=monospace]) = [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]tmpArr[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lR[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lC[/FONT][/COLOR][COLOR=#007700][FONT=monospace])
              [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End [/FONT][/COLOR][COLOR=#007700][FONT=monospace]If
            [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End [/FONT][/COLOR][COLOR=#007700][FONT=monospace]If
          [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Next lC
        Next lR
      End [/FONT][/COLOR][COLOR=#007700][FONT=monospace]If
    [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End [/FONT][/COLOR][COLOR=#007700][FONT=monospace]If
  [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Next wks
  [/FONT][/COLOR][COLOR=#007700][FONT=monospace]If [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]n [/FONT][/COLOR][COLOR=#007700][FONT=monospace]* [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lCs Then
    With wksDes[/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Range[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#DD0000][FONT=monospace]"A3"[/FONT][/COLOR][COLOR=#007700][FONT=monospace]).[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Resize[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]n[/FONT][/COLOR][COLOR=#007700][FONT=monospace], [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]lCs[/FONT][/COLOR][COLOR=#007700][FONT=monospace])
      .[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Value [/FONT][/COLOR][COLOR=#007700][FONT=monospace]= [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Arr
      [/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Sort [/FONT][/COLOR][COLOR=#007700][FONT=monospace].[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]Rows[/FONT][/COLOR][COLOR=#007700][FONT=monospace]([/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace]), [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]1[/FONT][/COLOR][COLOR=#007700][FONT=monospace], , , , , , [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]xlYes[/FONT][/COLOR][COLOR=#007700][FONT=monospace], , , [/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]xlLeftToRight
    End With
  End [/FONT][/COLOR][COLOR=#007700][FONT=monospace]If
[/FONT][/COLOR][COLOR=#0000BB][FONT=monospace]End Sub [/FONT][/COLOR]
 
Upvote 0
Chào các bạn ! Trong chủ đề Sort cột khi gộp nhiều Sheet bạn Ndu đã viết giúp tôi thủ tục này, tôi test thấy rất tốt (nhanh và chính xác) và đã áp dụng vào thực tế công việc của mình nhưng do tôi không hiểu nhiều về mảng nên không hiểu được thuật giải của đoạn code này. Vì vậy nhờ các bạn dịch nôm giúp tôi đoạn code sau để tôi có thêm tài liệu học về mảng. Xin chân thành cảm ơn !

Phải thêm file đính kèm để minh họa nữa anh à!
Nói thiệt, dù là em viết code này, giờ xem lại em cũng quên tuốt, chẳng nhớ nó dùng vào việc gì nữa
Ẹc... Ẹc...
 
Upvote 0
Phải thêm file đính kèm để minh họa nữa anh à!
Nói thiệt, dù là em viết code này, giờ xem lại em cũng quên tuốt, chẳng nhớ nó dùng vào việc gì nữa
Ẹc... Ẹc...

File gồm 3 Sheet: 2 sheet dữ liệu nguồn và sheet Tong hop (kết quả trong Sheet Tong Hop tôi chạy từ code trên).
Yêu cầu là lấy dữ liệu của các hộ từ nhiều sheet về sheet Tong hop và phải đúng cột. Các vấn đề còn lại như Format bảng tính, Cộng tổng không cần quan tâm. Thực tế mỗi sheet là một file, khi post lên tôi gộp thành 1 file nên chưa có code.
Tuấn cố giúp mình nhé, đối với mình bài này rất quan trọng.
 

File đính kèm

  • Gop Sheet.rar
    340.1 KB · Đọc: 40
Upvote 0
Chào các bạn ! Trong chủ đề Sort cột khi gộp nhiều Sheet bạn Ndu đã viết giúp tôi thủ tục này, tôi test thấy rất tốt (nhanh và chính xác) và đã áp dụng vào thực tế công việc của mình nhưng do tôi không hiểu nhiều về mảng nên không hiểu được thuật giải của đoạn code này. Vì vậy nhờ các bạn dịch nôm giúp tôi đoạn code sau để tôi có thêm tài liệu học về mảng. Xin chân thành cảm ơn !]


Biết là tác giả lười mấy cái vụ này nên mình biết tới đâu nói tới đó, có gì tác giả chỉnh nha

Mã:
Sub Main()
    Dim tmpArr, Arr()
    Dim lR As Long, lC As Long, lCs As Long, i As Long, n As Long, lCPos As Long
    Dim wks As Worksheet, wksDes As Worksheet, Dic As Object
    Dim sTitle As String
    On Error Resume Next
    Set Dic = CreateObject("Scripting.Dictionary")
    Set wksDes = Worksheets("Tong hop")
    wksDes.UsedRange.ClearContents    ' Xóa hết dữ liệu trong sheet Tong hop
    ReDim Arr(1 To 60000, 1 To 1)    ' Khởi tạo mảng Arr có 60000 dòng và một cột
    For Each wks In ThisWorkbook.Worksheets    ' Duyệt qua tất cả các sheet
        If UCase(wks.Name) <> UCase(wksDes.Name) Then    ' nếu sheet nào có tên khác "tong hơp" (không phân biệt chữ thường hay hoa) thì
            tmpArr = wks.UsedRange.Value    ' chuyển sheet đó thành một mảng tmpArr rồi xét tiếp:
            If TypeName(tmpArr) = "Variant()" Then    ' nếu kiểu dữ liệu của tmpArr đúng là mảng hay nói cách khác nếu mảng tmpArr có nhiều hơn một phần tử thì:
                n = n + 1
                For lR = 2 To UBound(tmpArr, 1)    ' duyệt từ dòng thứ 2 đến dòng cuối cùng của mảng tmpArr; ( (UBound(tmpArr, 1) là kích thước chiều thứ nhất của mảng tmpArr)
                    n = n + 1
                    For lC = 1 To UBound(tmpArr, 2)    ' trong từng dòng lR, duyệt từ cột thứ nhất đến cột cuối cùng
                        sTitle = Trim(CStr(tmpArr(1, lC)))    ' gọi sTitle là phần tử thuộc hàng thứ nhất, cột đang xét của mảng tmpArr (hàm trim bạn thừa biết, tác giả còn thêm hàm CStr để biến dữ liệu thành chuỗi? - nhờ tác giả giải thích mục đích, nếu là mình sẽ không đặt câu này ở đây)
                        If Len(sTitle) Then    ' nếu sTitle có chứa ký tự (có thể viết If sTitle <> "")
                            If Not Dic.Exists(sTitle) Then    ' nếu sTitle chưa có trong danh sách của Dic thì
                                lCs = lCs + 1    ' thêm một phần tử vào danh sách của Dic
                                Dic.Add sTitle, lCs    ' phần tử đó chính là sTitle và có Item là lCs
                                If UBound(Arr, 2) < lCs Then ReDim Preserve Arr(1 To 60000, 1 To lCs)    ' nếu số cột (chiều thứ 2) của mảng Arr < lCs thì mở rộng chiều thứ hai của mảng bằng với lCs
                                Arr(1, lCs) = sTitle    ' Gán phần tử ở dòng thứ nhất, cột thứ lCs của mảng Arrthành sTitle (tiêu đề)
                                Arr(n, lCs) = tmpArr(lR, lC)    ' Gán phần tử ở dòng thứ n, cột thứ lCs của mảng Arr bằng phần tử đang xét của mảng tmpArr (chứa dữ liệu của sheet đang xét)
                            Else    ' nếu sTitle đã có trong danh sách của Dic thì
                                lCPos = Dic.Item(sTitle)    ' lấy Item của sTitle trong Dic (xem nó đã nằm ở cột nào trong mảng Arr)
                                Arr(n, lCPos) = tmpArr(lR, lC)    ' Gán phần tử ở dòng thứ n, cột thứ lCPos của mảng Arr bằng phần tử đang xét của mảng tmpArr
                            End If
                        End If
                    Next lC
                Next lR
            End If
        End If
    Next wks
    If n * lCs Then    ' nếu tổng số dòng (không tính tiêu đề) và tổng số cột của mảng Arr đều >=1
        With wksDes.Range("A3").Resize(n, lCs)
            .Value = Arr    ' gán mảng Arr xuống range
            .Sort .Rows(1), 1, , , , , , xlYes, , , xlLeftToRight    ' sắp xếp theo abc thứ tự cột
        End With
    End If
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Biết là tác giả lười mấy cái vụ này nên mình biết tới đâu nói tới đó, có gì tác giả chỉnh nha

Mã:
Sub Main()
  If Not Dic.Exists(sTitle) Then
    lCs = lCs + 1
    Dic.Add sTitle, lCs
    If UBound(Arr, 2) < lCs Then ReDim Preserve Arr(1 To 60000, 1 To lCs)
    Arr(1, lCs) = sTitle
    Arr(n, lCs) = tmpArr(lR, lC)
  Else
    lCPos = Dic.Item(sTitle)
    Arr(n, lCPos) = tmpArr(lR, lC)
  End If          
End Sub

Chổ này nói đơn giản là vầy:
- Nếu xét thấy sTitle chưa có trong Dic thì gán vào, đồng thời xác định luôn vị trí của sTitle (bằng lCs)
- Ngược lại, nếu thấy sTitle đã có trong Dic thì xem nó đang nằm ở vị trí thứ mấy (dựa vào Dic.Item(sTitle)..) để gán tmpArr(lR, lC) vào đúng vị trí
Vậy thôi
 
Upvote 0
Chổ này nói đơn giản là vầy:
- Nếu xét thấy sTitle chưa có trong Dic thì gán vào, đồng thời xác định luôn vị trí của sTitle (bằng lCs)
- Ngược lại, nếu thấy sTitle đã có trong Dic thì xem nó đang nằm ở vị trí thứ mấy (dựa vào Dic.Item(sTitle)..) để gán tmpArr(lR, lC) vào đúng vị trí
Vậy thôi

Ừ, mình giải thích không chỉ cho anh TrungChinhs mà cho cả những ai mới chập chững như ...mình.
Như trên mình có thắc mắc trong câu sTitle = Trim(CStr(tmpArr(1, lC)))
ndu dùng hàm CStr để làm gì?
 
Upvote 0
Ừ, mình giải thích không chỉ cho anh TrungChinhs mà cho cả những ai mới chập chững như ...mình.
Như trên mình có thắc mắc trong câu sTitle = Trim(CStr(tmpArr(1, lC)))
ndu dùng hàm CStr để làm gì?

Chuyển nó về dạng String thôi mà mà anh
Có nhiều nguyên nhân khiến ta phải làm việc này nhưng nói nôm na thế này:
- Anh có biến tmp khai báo dạng Variant và anh so sánh tmp > 0 thì đồng nghĩa anh xem tmp là Number (Excel sẽ tự chuyển tmp sang kiểu Long hoặc Double gì đó)
- Anh có biến tmp khai báo dạng Variant và anh so sánh tmp <> "" thì đồng nghĩa anh xem tmp là Text (Excel sẽ tự chuyển tmp sang kiểu String)
- Bây giờ anh so sánh thế này: CLng(tmp) > 0 hoặc CStr(tmp) <> "" hoặc Len(CStr(tmp)) > 0 là anh là chủ động làm công việc chuyển đổi thay cho Excel ---> Giúp cho Excel đở bị "tai biến mạch máu"
Ẹc... Ẹc...
 
Upvote 0
Xin cảm ơn ThanhLanhNdu ! đã giúp. Tôi sẽ nghiên cứu tiếp nếu có gì cần hỏi mong các bạn tiếp tục giúp đỡ.

 
Upvote 0
Xin cảm ơn ThanhLanhNdu ! đã giúp. Tôi sẽ nghiên cứu tiếp nếu có gì cần hỏi mong các bạn tiếp tục giúp đỡ.

Em nói thêm:
- Bài này mấu chốt nằm ở việc xác định chính xác vùng dữ liệu hoạt động.
- Trong code em dùng tmpArr = wks.UsedRange.Value rồi qua đó xác định sTitle là dòng đầu tiên của tmpArr
- Tuy nhiên điều này cũng khá nguy hiểm. Trong trường hợp dữ liệu của anh xuất phát không phải từ dòng 1 và cột A thì UsedRange có thể xác định sai
- Để kiểm tra, anh có thể đứng tại 1 sheet bất kỳ rồi chạy dòng lệnh ActiveSheet.UsedRange.Select xem nó "chọn" cái gì nhé
 
Upvote 0
Em nói thêm:
- Bài này mấu chốt nằm ở việc xác định chính xác vùng dữ liệu hoạt động.
- Trong code em dùng tmpArr = wks.UsedRange.Value rồi qua đó xác định sTitle là dòng đầu tiên của tmpArr
- Tuy nhiên điều này cũng khá nguy hiểm. Trong trường hợp dữ liệu của anh xuất phát không phải từ dòng 1 và cột A thì UsedRange có thể xác định sai
- Để kiểm tra, anh có thể đứng tại 1 sheet bất kỳ rồi chạy dòng lệnh ActiveSheet.UsedRange.Select xem nó "chọn" cái gì nhé

Nếu phía trên bảng có tiêu đề hoặc rác thì ... tèo.
Vậy thì thay tmpArr = wks.UsedRange.Valuethành tmpArr = wks.Range("c3").CurrentRegion.Value cho an toàn
Tất nhiên dữ liệu các Sheet cũng phải nằm trong khuôn khổ nhất định.
 
Upvote 0
Nếu phía trên bảng có tiêu đề hoặc rác thì ... tèo.
Vậy thì thay tmpArr = wks.UsedRange.Valuethành tmpArr = wks.Range("c3").CurrentRegion.Value cho an toàn
Tất nhiên dữ liệu các Sheet cũng phải nằm trong khuôn khổ nhất định.

Với điều kiện là hàng 2 (Row thứ 2) không có bất cứ dữ liệu nào liền kề với dữ liệu từ hàng thứ 3 thì mới thực hiện được nha anh!

Nói chung hàng cận trên và cận dưới không được liền kề. Với thủ tục này nó chỉ lấy những gì liên quan và liền kề từ ô C3 mà thôi. Chơi cái này nguy hiểm quá!

Tốt nhất mình xác định cột nào là cột chính trong một bảng dữ liệu rồi lấy ô đầu và ô cuối của cột đó resize số cột ra cho chắc ăn.
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu phía trên bảng có tiêu đề hoặc rác thì ... tèo.
Vậy thì thay tmpArr = wks.UsedRange.Valuethành tmpArr = wks.Range("c3").CurrentRegion.Value cho an toàn
Tất nhiên dữ liệu các Sheet cũng phải nằm trong khuôn khổ nhất định.

Lần trước anh TrungChinhs đã nói dữ liệu tại các sheet không biết bắt đầu từ đâu nên không thể dùng CurrentRegion được anh à (có biết cell nào là cell bắt đầu đâu).
Thêm nữa, anh có để ý thấy trong file có nguyên dòng 5 rổng đấy ----> Nếu CurrentRegion cùng lắm chỉ chọn được cái tiêu đề
 
Upvote 0
Lần trước anh TrungChinhs đã nói dữ liệu tại các sheet không biết bắt đầu từ đâu nên không thể dùng CurrentRegion được anh à (có biết cell nào là cell bắt đầu đâu).
Thêm nữa, anh có để ý thấy trong file có nguyên dòng 5 rổng đấy ----> Nếu CurrentRegion cùng lắm chỉ chọn được cái tiêu đề

... í í, bạn đừng nóng, mình muốn nhắn nhủ (bàn) với chủ xị là: "Tất nhiên dữ liệu các Sheet cũng phải nằm trong khuôn khổ nhất định" để có thêm một phương án thôi.
 
Upvote 0
Cảm ơn các bạn. Vấn đề xác định vùng dữ liệu thì đúng là nan giải, với hàng trăm giả thiết thì việc chọn một phương án tổng thể gần như là nhiệm vụ bất khả thi... Khi làm việc với các bảng tính tôi nhận thấy hầu hết (không phải tất cả) đầu bảng đều bắt đầu là cột số thứ tự với ký hiệu là "stt" vì vậy tôi thường dùng code sau để xác định vùng bảng (không bao gồm tên biểu).
Mã:
Sub Table()
    With ActiveSheet
        Set RngTL = .UsedRange.Find("Stt", , , 2, 1, 1)
        Set RngLR = .UsedRange.Find("*", , , 2, 2, 2)
        Set RngTR = .Cells(RngTL.Row, RngLR.Column)
        Set RngLL = RngTL(65000).End(3)(2)
        sR = RngLR.Row - RngTL.Row + 1
        sCl = RngLR.Column - RngTL.Column + 1
    End With
End Sub

Ví dụ: trong code các bạn viết là UsedRange.Value thì khi áp dụng tôi sửa thành RngTL.Resize(sR, sCl).Value
...

Đối với những người dùng code tôi viết đều phải tuân thủ nguyên tắc: Đầu biểu có thể nằm bất cứ đâu nhưng phải ký hiệu là "stt", cuối bảng (bên phải và dưới bảng) phải sạch.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn các bạn. Vấn đề xác định vùng dữ liệu thì đúng là nan giải, với hàng trăm giả thiết thì việc chọn một phương án tổng thể gần như là nhiệm vụ bất khả thi... Khi làm việc với các bảng tính tôi nhận thấy hầu hết (không phải tất cả) đầu bảng đều bắt đầu là cột số thứ tự với ký hiệu là "stt" vì vậy tôi thường dùng code sau để xác định vùng bảng (không bao gồm tên biểu).
Mã:
Sub Table()
    With ActiveSheet
        Set RngTL = .UsedRange.Find("Stt", , , 2, 1, 1)
        Set RngLR = .UsedRange.Find("*", , , 2, 2, 2)
        Set RngTR = .Cells(RngTL.Row, RngLR.Column)
        Set RngLL = RngTL(65000).End(3)(2)
        sR = RngLR.Row - RngTL.Row + 1
        sCl = RngLR.Column - RngTL.Column + 1
    End With
End Sub

Ví dụ: trong code các bạn viết là UsedRange.Value thì khi áp dụng tôi sửa thành RngTL.Resize(sR, sCl).Value
...

Đối với những người dùng code tôi viết đều phải tuân thủ nguyên tắc: Đầu biểu có thể nằm bất cứ đâu nhưng phải ký hiệu là "stt", cuối bảng (bên phải và dưới bảng) phải sạch.
Cho dù anh xác định được chính xác vùng dữ liệu thì vẫn còn có 1 trở ngại nữa: Em để ý thấy file của anh có Merge Cell tại tiêu đề ---> Vậy thì việc xác định sTitle cũng xem như.. THUA
Đã gọi là CSDL chuẩn thì việc Merge Cell coi như 1 cấm kỵ ---> Ngay cả các công cụ hàng đầu của MS như PivotTable, Advanced Filter và thậm chí là cả ADO cũng không xử lý nỗi dữ liệu loại này
 
Upvote 0
trích dữ liệu từ sheet tổng ra sheet chi tiết

Chào cả nhà,, chúc cả nhà đầy sức khỏe.

Em nhớ lúc trước có đọc được một file dùng macro để tạo ra các sheet chi tiết từ một sheet tổng, nhưng em kiếm mấy ngày nay không được, đành nhờ mọi người giúp đỡ .

Đại khái nó giống như file em đính kèm.
Chân thành cảm ơn mọi người.
 

File đính kèm

  • NL T11_2.rar
    58 KB · Đọc: 14
Upvote 0
Chào cả nhà,, chúc cả nhà đầy sức khỏe.

Em nhớ lúc trước có đọc được một file dùng macro để tạo ra các sheet chi tiết từ một sheet tổng, nhưng em kiếm mấy ngày nay không được, đành nhờ mọi người giúp đỡ .

Đại khái nó giống như file em đính kèm.
Chân thành cảm ơn mọi người.
Bạn tham khảo đề tài này thử xem, có nhiều cách
http://www.giaiphapexcel.com/forum/...-dữ-liệu-từ-01-sheet-tổng-sang-các-sheet-khác
 
Upvote 0

CẢM ƠN BẠN,, rất bổ ích,,, nhưng chưa phải cái mình cần tìm,, cái mình muốn tim,, khi click 1 cái vào nút LOC,, nó sẽ hiển thị tất cả các sheet chi tiết,, như file mình đính kèm [mình chỉ ví dụ 3 sheet tiêu biều, khi chạy nó sẽ ra tất cả các sheet]
 
Upvote 0
CẢM ƠN BẠN,, rất bổ ích,,, nhưng chưa phải cái mình cần tìm,, cái mình muốn tim,, khi click 1 cái vào nút LOC,, nó sẽ hiển thị tất cả các sheet chi tiết,, như file mình đính kèm [mình chỉ ví dụ 3 sheet tiêu biều, khi chạy nó sẽ ra tất cả các sheet]
Tặng bạn file này mình đang sử dụng. Tuỳ biến theo yêu câu của bạn. File của bạn trộn cell sẽ không chạy được phải sửa code lai. Cột 8 của bạn chứa các ký tự không thể đặt tên sheet
 

File đính kèm

  • Tach sheet va ghep sheet.rar
    23.8 KB · Đọc: 25
Upvote 0
Viết Code VBA cho cột, báo cáo sổ cái tài khoản

Chào các bạn, Mình có 1 file cần viết code VBA để làm báo cáo, nhưng minh chua biết nhiều về VBA. Nhờ mọi người giúp đỡ, Mình cảm ơn rất nhiều. Xin xem file đính kèm
 

File đính kèm

  • GPE.VD.xlsx
    53.8 KB · Đọc: 5
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom