Giúp code tổng hàng dọc sang hàng ngang

Liên hệ QC

phuoclocvl

Thành viên thường trực
Tham gia
28/3/12
Bài viết
220
Được thích
32
Chào các Anh Chị Em GPE,

Em có vấn đề cần giúp đỡ, nhưng không biết ghi tiêu đề sao cho đúng nữa. Ý em là như vầy: Anh chị xem hình bên dưới, có cách nào code VBA chuyển từ bảng gốc sang giống như bảng kết quả không, xin giúp em. em có đính kèm file trong attach . Anh / Chị xem giúp em . Xin cảm ơn.


TEST.PNG
 

File đính kèm

  • FILE_MAU.xlsx
    9.7 KB · Đọc: 20
Chào các Anh Chị Em GPE,
Em có vấn đề cần giúp đỡ, nhưng không biết ghi tiêu đề sao cho đúng nữa. Ý em là như vầy: Anh chị xem hình bên dưới, có cách nào code VBA chuyển từ bảng gốc sang giống như bảng kết quả không, xin giúp em. em có đính kèm file trong attach . Anh / Chị xem giúp em . Xin cảm ơn.
Vào sheet Test thêm dữ liệu bao nhiêu là tùy ý.
Để tổng hợp vào sheet Tong_Hop nhấn nút để xem kết quả.
 

File đính kèm

  • PivotTable.xlsm
    24.3 KB · Đọc: 14
Upvote 0
Xin Cảm ơn , Các Anh. Thật ra em cũng đã có nghĩ ra cách này nhưng mà nó dài dòng quá .

code mình như bên dưới

Sub Get_Du_Lieu()
Dim WK As Worksheet
Dim I As Integer, eR As Integer, K As Integer, J As Integer
Dim sArr(), rArr(), Tmp As String, tArr()
Dim Dic As Object, Rng(), Y As String, Y1 As String
Dim R As Integer, N As Integer, Col As Integer
Set WK = Worksheets("Test")
Set Dic = CreateObject("Scripting.Dictionary")
'------------------------------------------------------------
eR = WK.Range("A10000").End(xlUp).Row
sArr = WK.Range("A2:C" & eR).Value
ReDim rArr(1 To UBound(sArr, 1), 1 To UBound(sArr, 1))
'------------------------------------------------------------

'---------- Lấy Tên ------------
WK.Range("F2:M10000").ClearContents
For I = 1 To UBound(sArr, 1)
If Not IsEmpty(sArr(I, 1)) Then
Tmp = sArr(I, 1)
If Not Dic.exists(Tmp) Then
K = K + 1
Dic.Add Tmp, K
rArr(K, 1) = sArr(I, 1)
End If
End If
Next I

Range("F2").Resize(K, 1) = rArr

'---------- Lấy Loại ----------------
K = 0
For I = 2 To UBound(sArr, 1)
If Not IsEmpty(sArr(I, 2)) Then
Tmp = sArr(I, 2)
If Not Dic.exists(Tmp) Then
K = K + 1
Dic.Add Tmp, K
rArr(K, 1) = sArr(I, 2)
End If
End If
Next I
Range("g2").Resize(1, K) = WorksheetFunction.Transpose(rArr)

'-------------------------------------------------------------------
'------------ Lấy Số Lượng -----------------
Rng = WK.Range("A3:C" & eR).Value
For R = 1 To UBound(Rng)
Y = Rng(R, 1) & Rng(R, 2)
Dic(Y) = Dic(Y) + Rng(R, 3)
Next R
N = WK.Range("F1000").End(xlUp).Row
Col = Cells(2, WK.Columns.Count).End(xlToLeft).Column 'CurrentRegion.Columns.Count '
tArr = Range(Cells(1, 6), Cells(N, Col))
For I = 3 To N
For J = 2 To Col - 5
Y1 = tArr(I, 1) & tArr(2, J)
tArr(I, J) = Dic(Y1)
Next J
Next I
Range(Cells(1, 6), Cells(N, Col)) = tArr
Set Dic = Nothing

End Sub
 

File đính kèm

  • FILE_MAU.xlsm
    22.6 KB · Đọc: 12
Upvote 0
Xin Cảm ơn , Các Anh. Thật ra em cũng đã có nghĩ ra cách này nhưng mà nó dài dòng quá .

code mình như bên dưới

Sub Get_Du_Lieu()
Dim WK As Worksheet
Dim I As Integer, eR As Integer, K As Integer, J As Integer
Dim sArr(), rArr(), Tmp As String, tArr()
Dim Dic As Object, Rng(), Y As String, Y1 As String
Dim R As Integer, N As Integer, Col As Integer
Set WK = Worksheets("Test")
Set Dic = CreateObject("Scripting.Dictionary")
'------------------------------------------------------------
eR = WK.Range("A10000").End(xlUp).Row
sArr = WK.Range("A2:C" & eR).Value
ReDim rArr(1 To UBound(sArr, 1), 1 To UBound(sArr, 1))
'------------------------------------------------------------

'---------- Lấy Tên ------------
WK.Range("F2:M10000").ClearContents
For I = 1 To UBound(sArr, 1)
If Not IsEmpty(sArr(I, 1)) Then
Tmp = sArr(I, 1)
If Not Dic.exists(Tmp) Then
K = K + 1
Dic.Add Tmp, K
rArr(K, 1) = sArr(I, 1)
End If
End If
Next I

Range("F2").Resize(K, 1) = rArr

'---------- Lấy Loại ----------------
K = 0
For I = 2 To UBound(sArr, 1)
If Not IsEmpty(sArr(I, 2)) Then
Tmp = sArr(I, 2)
If Not Dic.exists(Tmp) Then
K = K + 1
Dic.Add Tmp, K
rArr(K, 1) = sArr(I, 2)
End If
End If
Next I
Range("g2").Resize(1, K) = WorksheetFunction.Transpose(rArr)

'-------------------------------------------------------------------
'------------ Lấy Số Lượng -----------------
Rng = WK.Range("A3:C" & eR).Value
For R = 1 To UBound(Rng)
Y = Rng(R, 1) & Rng(R, 2)
Dic(Y) = Dic(Y) + Rng(R, 3)
Next R
N = WK.Range("F1000").End(xlUp).Row
Col = Cells(2, WK.Columns.Count).End(xlToLeft).Column 'CurrentRegion.Columns.Count '
tArr = Range(Cells(1, 6), Cells(N, Col))
For I = 3 To N
For J = 2 To Col - 5
Y1 = tArr(I, 1) & tArr(2, J)
tArr(I, J) = Dic(Y1)
Next J
Next I
Range(Cells(1, 6), Cells(N, Col)) = tArr
Set Dic = Nothing

End Sub
Bạn áp dụng theo bài này cho gọn nè!
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn áp dụng theo bài này cho gọn nè!
Bên topic Dictionary bị đóng rồi, không hỏi đc hic. chắc là có cách làm ngắn hơn , nhưng mình không biết . buồn thiệt
 
Upvote 0
Bạn cứ bám theo code bạn poss coi có rút ngắn được hôn chịu khó suy nghĩ chút đi ;)
 
Upvote 0
Bên topic Dictionary bị đóng rồi, không hỏi đc hic. chắc là có cách làm ngắn hơn , nhưng mình không biết . buồn thiệt
Bạn nên sửa lại tiêu đề bài viết, không viết HOA cả câu.
-----------------------------------------------------------
Tặng bạn Sub này, tùy nghi sử dụng, không bảo hành.
PHP:
Public Sub s_GPE()
Dim Dic As Object, sArr(), dArr(), Txt As String
Dim I As Long, K As Long, R As Long, Rws As Long, CoL As Long, xRow As Long, xCol As Long
With Sheets("Test")
    Rws = .Range("A10000").End(xlUp).Row            'Xac dinh dong cuoi Bang Goc'
    If Rws < 3 Then Exit Sub                        'Neu dong cuoi Bang Goc <3 thi thoat'
    Set Dic = CreateObject("Scripting.Dictionary")
        sArr = .Range("A3:C" & Rws).Value
        R = UBound(sArr)
    ReDim dArr(1 To R, 1 To 100)
    K = 1
    CoL = 1
    dArr(K, 1) = .Range("A2").Value
    For I = 1 To R
        If sArr(I, 1) <> Empty Then
            Txt = sArr(I, 1) & "#"
            If Not Dic.Exists(Txt) Then         'Ten duy nhat'
                K = K + 1
                Dic.Item(Txt) = K               'Dong K chua Ten'
                dArr(K, 1) = sArr(I, 1)
            End If
            If Not Dic.Exists(sArr(I, 2)) Then  'Loai duy nhat'
                CoL = CoL + 1
                Dic.Item(sArr(I, 2)) = CoL      'Cot CoL chua Loai'
                dArr(1, CoL) = sArr(I, 2)
            End If
            xRow = Dic.Item(Txt)                'Xac dinh Dong chua Ten'
            xCol = Dic.Item(sArr(I, 2))         'Xac dinh Cot chua Loai'
            dArr(xRow, xCol) = dArr(xRow, xCol) + sArr(I, 3)    'Tinh Tong'
        End If
    Next I
    .Range("F2").Resize(1000, 100).ClearContents
    .Range("F2").Resize(K, CoL) = dArr
End With
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Chào các Anh Chị Em GPE,

Em có vấn đề cần giúp đỡ, nhưng không biết ghi tiêu đề sao cho đúng nữa. Ý em là như vầy: Anh chị xem hình bên dưới, có cách nào code VBA chuyển từ bảng gốc sang giống như bảng kết quả không, xin giúp em. em có đính kèm file trong attach . Anh / Chị xem giúp em . Xin cảm ơn.


View attachment 230215
Thử code có sort Tên và loại
Mã:
Sub Pivot()
    Dim Rng As Range, Res(), Ten$, Loai$, SoLuong$, eRow&
    With Sheets("Test")
      eRow = .Range("A" & Rows.Count).End(xlUp).Row
      Ten = .Range("A2"): Loai = .Range("B2"): SoLuong = .Range("C2")
      .Range("F1").Select
    End With
    Application.DisplayAlerts = False
    Application.ScreenUpdating = False
    ActiveWorkbook.PivotCaches.Create(SourceType:=xlDatabase, SourceData:= _
        "Test!R2C1:R" & eRow & "C3", Version:=xlPivotTableVersion12).CreatePivotTable _
        TableDestination:="Test!R1C6", TableName:="PivotTable1", DefaultVersion _
        :=xlPivotTableVersion12
    With ActiveSheet.PivotTables("PivotTable1").PivotFields(Ten)
        .Orientation = xlRowField
        .Position = 1
    End With
    ActiveSheet.PivotTables("PivotTable1").AddDataField ActiveSheet.PivotTables( _
        "PivotTable1").PivotFields(SoLuong), "Sum of SO LUONG", xlSum
    ActiveSheet.PivotTables("PivotTable1").AddDataField ActiveSheet.PivotTables( _
        "PivotTable1").PivotFields(Loai), "Sum of LOAI", xlSum
    With ActiveSheet.PivotTables("PivotTable1").PivotFields("Sum of LOAI")
        .Orientation = xlColumnField
    End With
    With Sheets("Test")
      Set Rng = .Range("F1").CurrentRegion
      Res = .Range("F2").Resize(Rng.Rows.Count - 2, Rng.Columns.Count - 1).Value
      Rng.Clear
      .Range("F2").Resize(UBound(Res), UBound(Res, 2)) = Res
      .Range("F2") = Ten
    End With
    Application.ScreenUpdating = True
    Application.DisplayAlerts = True
End Sub
 
Upvote 0
Bạn nên sửa lại tiêu đề bài viết, không viết HOA cả câu.
...
'lai' cái này.

Tặng bạn Sub này, tùy nghi sử dụng, không bảo hành.
...
Code của bạn sợ kém "hiện đại". Pivot Table mà còn bị chê thì cỡ code Power BI mới đạt.

...Nhưng em đang muốn dùng code cho nó hiện đại và em có nhiều cái áp dụng nữa, còn pivot thì em cũng hiện đang làm .
Trong diễn đàn này, cho tới giờ phút này chỉ có 1 người có khả năng viết code cho nó hiện đại (mà không hại điện) thôi. Còn lại, code mà bạn có thể lấy ở đây chỉ là chữa cháy.
Nói trước, người ấy không phải là tôi.
 
Upvote 0
'lai' cái này.


Code của bạn sợ kém "hiện đại". Pivot Table mà còn bị chê thì cỡ code Power BI mới đạt.


Trong diễn đàn này, cho tới giờ phút này chỉ có 1 người có khả năng viết code cho nó hiện đại (mà không hại điện) thôi. Còn lại, code mà bạn có thể lấy ở đây chỉ là chữa cháy.
Nói trước, người ấy không phải là tôi.
Chắc Bác nhắc đến nhân vật này @HeSanbi phải không? Em chỉ nhắc đến thôi không có ý gì cả.
 
Upvote 0
Bạn tham khảo code này nhé

Mã:
Sub tao_bang()
    Dim Tongs As New dnDictionaryString, Tens As New dnListOfString, Loais As New dnListOfInteger
    Dim i As Integer, j As Integer, row As Integer, col As Integer, row0 As Integer, col0 As Integer
    Dim ten As String, loai As Integer, soLuong As Integer, key As String
    
    '# Lay data
    For row = 3 To 14
        ten = Cells(row, 1).Value:  loai = Cells(row, 2).Value
        soLuong = Cells(row, 3).Value:  key = ten & ";" & loai
        
        If Not Tens.Contains(ten) Then Tens.Add (ten)
        If Not Loais.Contains(loai) Then Loais.Add (loai)
        If Tongs.ContainsKey(key) Then soLuong = soLuong + CInt(Tongs(key))
        Tongs(key) = soLuong
    Next
    Tens.Sort: Loais.Sort
    
    '# ghi ra bang
     row0 = 12: col0 = 6
     For row = row0 To row0 + Tens.Count - 1
        Cells(1 + row, col0).Value = Tens(row - row0)
     Next
     For col = col0 To col0 + Loais.Count - 1
        Cells(row0, 1 + col).Value = Loais(col - col0)
     Next
     For i = 0 To Tens.Count - 1
        For j = 0 To Loais.Count - 1
            key = Tens(i) & ";" & Loais(j)
            If Tongs.ContainsKey(key) Then Cells(1 + j + row0, 1 + j + col0).Value = Tongs(key)
        Next j
     Next i
End Sub

Ví dụ này dùng thư viện NetForVBA
 

File đính kèm

  • FILE_MAU.xlsm
    19.3 KB · Đọc: 7
Upvote 0
Chào các Anh Chị Em GPE,

Em có vấn đề cần giúp đỡ, nhưng không biết ghi tiêu đề sao cho đúng nữa. Ý em là như vầy: Anh chị xem hình bên dưới, có cách nào code VBA chuyển từ bảng gốc sang giống như bảng kết quả không, xin giúp em. em có đính kèm file trong attach . Anh / Chị xem giúp em . Xin cảm ơn.


View attachment 230215
Bạn dùng code sau thử nhé:

Mã:
Sub TongHop_HLMT()
    With CreateObject("ADODB.Connection")
        .Open "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & ThisWorkbook.FullName & ";Extended properties=""Excel 12.0;HDR=No"""
        Sheet1.Range("F3").CopyFromRecordset .Execute("Transform Sum(F3) Select F1 From [Test$A3:C] Group By F1 Pivot F2")
    End With
End Sub
 
Upvote 0
Xin cảm ơn các Anh/ Chị / Em rất nhiều.
rất nhiệt tình và lăn xả ...triệu lai ... :)
 
Upvote 0
Bạn nên sửa lại tiêu đề bài viết, không viết HOA cả câu.
-----------------------------------------------------------
Tặng bạn Sub này, tùy nghi sử dụng, không bảo hành.
PHP:
Public Sub s_GPE()
Dim Dic As Object, sArr(), dArr(), Txt As String
Dim I As Long, K As Long, R As Long, Rws As Long, CoL As Long, xRow As Long, xCol As Long
With Sheets("Test")
    Rws = .Range("A10000").End(xlUp).Row            'Xac dinh dong cuoi Bang Goc'
    If Rws < 3 Then Exit Sub                        'Neu dong cuoi Bang Goc <3 thi thoat'
    Set Dic = CreateObject("Scripting.Dictionary")
        sArr = .Range("A3:C" & Rws).Value
        R = UBound(sArr)
    ReDim dArr(1 To R, 1 To 100)
    K = 1
    CoL = 1
    dArr(K, 1) = .Range("A2").Value
    For I = 1 To R
        If sArr(I, 1) <> Empty Then
            Txt = sArr(I, 1) & "#"
            If Not Dic.Exists(Txt) Then         'Ten duy nhat'
                K = K + 1
                Dic.Item(Txt) = K               'Dong K chua Ten'
                dArr(K, 1) = sArr(I, 1)
            End If
            If Not Dic.Exists(sArr(I, 2)) Then  'Loai duy nhat'
                CoL = CoL + 1
                Dic.Item(sArr(I, 2)) = CoL      'Cot CoL chua Loai'
                dArr(1, CoL) = sArr(I, 2)
            End If
            xRow = Dic.Item(Txt)                'Xac dinh Dong chua Ten'
            xCol = Dic.Item(sArr(I, 2))         'Xac dinh Cot chua Loai'
            dArr(xRow, xCol) = dArr(xRow, xCol) + sArr(I, 3)    'Tinh Tong'
        End If
    Next I
    .Range("F2").Resize(1000, 100).ClearContents
    .Range("F2").Resize(K, CoL) = dArr
End With
End Sub
Hay quá anh ơi.
Triệu lai. Nhưng chỉ lai có được 1 lần à, tiếc quá haha
 
Upvote 0
Chào các Anh Chị Em GPE,

Em có vấn đề cần giúp đỡ, nhưng không biết ghi tiêu đề sao cho đúng nữa. Ý em là như vầy: Anh chị xem hình bên dưới, có cách nào code VBA chuyển từ bảng gốc sang giống như bảng kết quả không, xin giúp em. em có đính kèm file trong attach . Anh / Chị xem giúp em . Xin cảm ơn.


View attachment 230215
Của bạn đây nhé! Cơ bản tôi nghĩ những thứ đơn giản thì cần gì code kiếc cho phức tạp. Kiểu như giết gà thì cần gì đến dao mổ trâu.
1592522183946.png
 

File đính kèm

  • PBi-SL.rar
    29.3 KB · Đọc: 5
Upvote 0
Web KT
Back
Top Bottom