kohlerbkqn
Thành viên mới 

			
		- Tham gia
 - 1/6/08
 
- Bài viết
 - 20
 
- Được thích
 - 0
 

Tặng bạn code "XiMaChao" này, nếu topic này không "bị gì..."Mình cần xử lý mảng dữ liệu hàng thành cột như sau, vì số lượng mảng lớn nên không thể làm thủ công bằng lệnh transpone Mong mọi người giúp đỡ. ThanksView attachment 129032
Public Sub XiMaChao()
Dim Dic As Object, sArr(), dArr(), I As Long, CoL As Long, MaxCoL As Long, K As Long, Tem As Variant
Set Dic = CreateObject("Scripting.Dictionary")
sArr = Range([A3], [B3].End(xlDown)).Value
ReDim dArr(1 To UBound(sArr, 1), 1 To 255)
For I = 1 To UBound(sArr, 1)
    Tem = sArr(I, 1)
    If Not Dic.Exists(Tem) Then
        K = K + 1: CoL = 3
        Dic.Add Tem, K
        dArr(K, 1) = CoL
        dArr(K, 2) = Tem
        dArr(K, CoL) = sArr(I, 2)
    Else
        CoL = dArr(Dic.Item(Tem), 1) + 1
        If CoL > MaxCoL Then MaxCoL = CoL
        dArr(Dic.Item(Tem), 1) = CoL
        dArr(Dic.Item(Tem), CoL) = sArr(I, 2)
    End If
Next I
[D3].Resize(K, MaxCoL) = dArr
[D3].Resize(K).ClearContents
Set Dic = Nothing
End Sub
	
1/ Phải lưu file kiểu .xlsm mới sử dụng VBA được, xlsx là thua.Cám ơn bạn Ba Tê. Bạn có thể kiểm tra giúp được không, mình cho vào Macro -> module nhưng bị báo lỗi.
Mình gởi lại file, nhờ bạn add giúp với. Thanks




Sub BuaXua()
Dim Data(), Res(), tmp As Variant
Dim I As Long, CoL As Long, x As Long, y As Long, k As Long
Data = Range([A3], [B3].End(xlDown)).Value
ReDim Res(1 To UBound(Data), 1 To 255)
With CreateObject("Scripting.Dictionary")
   For I = 1 To UBound(Data, 1)
      tmp = Data(I, 1)
       If Not .Exists(tmp) Then
           k = k + 1
           .Add Data(I, 1), k
           Res(k, 1) = tmp
           Res(k, 2) = Data(I, 2)
       Else
            x = .Item(Data(I, 1))
            For y = 3 To UBound(Res, 2)
               If Res(x, y) = Empty Then
                  Res(x, y) = Data(I, 2)
                  CoL = IIf(y > CoL, y, CoL)
                  Exit For
               End If
            Next
       End If
   Next I
End With
[E3].Resize(k, CoL) = Res
End Sub
	Chới khác kiểu của anh Ba Tê tí coi có tê hơn tí nào hay không
Sub Transfer(ByVal Field_1 As Range, ByVal Field_2 As Range, ByVal Target As Range)
  Dim aField_1, aField_2, aColPos(), Arr(), tmp1, tmp2
  Dim i As Long, lR As Long, lC As Long, lMaxCol As Long
  aField_1 = Field_1.Value
  aField_2 = Field_2.Value
  lMaxCol = 2
  ReDim Arr(1 To UBound(aField_1, 1), 1 To lMaxCol)
  ReDim aColPos(1 To UBound(aField_1, 1))
  With CreateObject("Scripting.Dictionary")
    For i = LBound(aField_1, 1) To UBound(aField_1, 1)
      tmp1 = CStr(aField_1(i, 1))
      If Len(tmp1) Then
        tmp2 = CStr(aField_2(i, 1))
        If Not .Exists(tmp1) Then
          lR = lR + 1
          .Add tmp1, lR
          Arr(lR, 1) = tmp1
          Arr(lR, 2) = tmp2
          aColPos(lR) = 2
        Else
          aColPos(.Item(tmp1)) = aColPos(.Item(tmp1)) + 1
          lC = aColPos(.Item(tmp1))
          If lMaxCol < lC Then lMaxCol = lC
          ReDim Preserve Arr(1 To UBound(aField_1, 1), 1 To lMaxCol)
          Arr(.Item(tmp1), lC) = tmp2
        End If
      End If
    Next
  End With
  If lR Then Target.Resize(lR, lMaxCol).Value = Arr
End Sub
	Sub Main()
  Dim Field_1 As Range, Field_2 As Range, Target As Range
  Set Field_1 = Range("A3:A10000")
  Set Field_2 = Range("B3:B10000")
  Set Target = Range("E3")
  Transfer Field_1, Field_2, Target
End Sub
	


Tặng bạn code "XiMaChao" này, nếu topic này không "bị gì..."
PHP:Public Sub XiMaChao() Dim Dic As Object, sArr(), dArr(), I As Long, CoL As Long, MaxCoL As Long, K As Long, Tem As Variant Set Dic = CreateObject("Scripting.Dictionary") sArr = Range([A3], [B3].End(xlDown)).Value ReDim dArr(1 To UBound(sArr, 1), 1 To 255) For I = 1 To UBound(sArr, 1) Tem = sArr(I, 1) If Not Dic.Exists(Tem) Then K = K + 1: CoL = 3 Dic.Add Tem, K dArr(K, 1) = CoL dArr(K, 2) = Tem dArr(K, CoL) = sArr(I, 2) Else CoL = dArr(Dic.Item(Tem), 1) + 1 If CoL > MaxCoL Then MaxCoL = CoL dArr(Dic.Item(Tem), 1) = CoL dArr(Dic.Item(Tem), CoL) = sArr(I, 2) End If Next I [D3].Resize(K, MaxCoL) = dArr [D3].Resize(K).ClearContents Set Dic = Nothing End Sub