AnhThu-1976
Thành viên tích cực


- Tham gia
- 17/10/14
- Bài viết
- 1,065
- Được thích
- 175
Em đã mô tả trong file đính kèm
Nhờ các anh/ chị hướng dẫn
Em cảm ớn
P/S: em đã seach nhưng không thấy, nếu có đường link nào tương tự thì chỉ giúp em!
Thử:Em đã mô tả trong file đính kèm
Nhờ các anh/ chị hướng dẫn
Em cảm ớn
P/S: em đã seach nhưng không thấy, nếu có đường link nào tương tự thì chỉ giúp em!
Sub abc()
Dim i&, j&, k&, a(), b()
a = Range("E2", Range("E" & Rows.Count).End(3)).Resize(, 3).Value
For i = 1 To UBound(a, 2)
For j = 1 To UBound(a, 1)
k = k + 1: ReDim Preserve b(1 To k): b(k) = a(j, i)
Next
Next
Range("M2").Resize(UBound(b), 1).Value = Application.Transpose(b)
End Sub
Trước đây tôi có viết hàm Join2DArray, có thể áp dụng cho bài nàyEm đã mô tả trong file đính kèm
Nhờ các anh/ chị hướng dẫn
Em cảm ớn
P/S: em đã seach nhưng không thấy, nếu có đường link nào tương tự thì chỉ giúp em!
Function Join2DArray(ParamArray arrays())
Dim arr(), aSub, tmp
Dim lRs As Long, lCs As Long, lR As Long, lC As Long
Dim n As Long, m As Long, i As Long, bChk As Boolean
On Error Resume Next
For i = 0 To UBound(arrays)
aSub = arrays(i)
n = UBound(aSub, 1) - LBound(aSub, 1) + 1
lRs = lRs + n
m = UBound(aSub, 2) - LBound(aSub, 2) + 1
If lCs < m Then lCs = m
Next
ReDim arr(1 To lCs, 1 To lRs)
n = 0: m = 0
For i = 0 To UBound(arrays)
aSub = arrays(i)
For lR = LBound(aSub, 1) To UBound(aSub, 1)
bChk = False
n = n + 1
For lC = LBound(aSub, 2) To UBound(aSub, 2)
tmp = aSub(lR, lC)
Select Case VarType(tmp)
Case 0 To 1: arr(lC, n) = vbNullString
Case 2 To 7: arr(lC, n) = tmp
Case 8
If IsNumeric(tmp) Then
arr(lC, n) = "'" & tmp
Else
arr(lC, n) = tmp
End If
End Select
If Len(CStr(tmp)) Then bChk = True
Next
If bChk = False Then n = n - 1
Next
Next
If n Then
ReDim Preserve arr(1 To lCs, 1 To n)
Join2DArray = Transpose2DArray(arr)
End If
End Function
Function Transpose2DArray(ByVal arr2D)
Dim arr(), aTemp
Dim lR As Long, lC As Long
On Error Resume Next
aTemp = arr2D
ReDim arr(LBound(aTemp, 2) To UBound(aTemp, 2), LBound(aTemp, 1) To UBound(aTemp, 1))
For lR = LBound(aTemp, 1) To UBound(aTemp, 1)
For lC = LBound(aTemp, 2) To UBound(aTemp, 2)
arr(lC, lR) = aTemp(lR, lC)
Next
Next
Transpose2DArray = arr
End Function
Sub Test()
Dim aRes
aRes = Join2DArray(Range("E2:E1000"), Range("F2:F1000"), Range("G2:G1000"))
Range("M2").Resize(UBound(aRes, 1), UBound(aRes, 2)).Value = aRes
End Sub
Cho em hỏi anh @ndu96081631 với ! Hàm này có thể ứng dụng trong việc gộp các sheet nhưng copy theo chiều ngang được không ạ !Trước đây tôi có viết hàm Join2DArray, có thể áp dụng cho bài này
1> Code của hàm Join2DArray
2> Phần áp dụng:Mã:Function Join2DArray(ParamArray arrays()) Dim arr(), aSub, tmp Dim lRs As Long, lCs As Long, lR As Long, lC As Long Dim n As Long, m As Long, i As Long, bChk As Boolean On Error Resume Next For i = 0 To UBound(arrays) aSub = arrays(i) n = UBound(aSub, 1) - LBound(aSub, 1) + 1 lRs = lRs + n m = UBound(aSub, 2) - LBound(aSub, 2) + 1 If lCs < m Then lCs = m Next ReDim arr(1 To lCs, 1 To lRs) n = 0: m = 0 For i = 0 To UBound(arrays) aSub = arrays(i) For lR = LBound(aSub, 1) To UBound(aSub, 1) bChk = False n = n + 1 For lC = LBound(aSub, 2) To UBound(aSub, 2) tmp = aSub(lR, lC) Select Case VarType(tmp) Case 0 To 1: arr(lC, n) = vbNullString Case 2 To 7: arr(lC, n) = tmp Case 8 If IsNumeric(tmp) Then arr(lC, n) = "'" & tmp Else arr(lC, n) = tmp End If End Select If Len(CStr(tmp)) Then bChk = True Next If bChk = False Then n = n - 1 Next Next If n Then ReDim Preserve arr(1 To lCs, 1 To n) Join2DArray = Transpose2DArray(arr) End If End Function Function Transpose2DArray(ByVal arr2D) Dim arr(), aTemp Dim lR As Long, lC As Long On Error Resume Next aTemp = arr2D ReDim arr(LBound(aTemp, 2) To UBound(aTemp, 2), LBound(aTemp, 1) To UBound(aTemp, 1)) For lR = LBound(aTemp, 1) To UBound(aTemp, 1) For lC = LBound(aTemp, 2) To UBound(aTemp, 2) arr(lC, lR) = aTemp(lR, lC) Next Next Transpose2DArray = arr End Function
Bạn không cần quan tâm code hàm Join2DArray viết gì, chỉ cần biết áp dụng theo cú pháp: Join2DArray(mảng 1, mảng 2,...., mảng n) <--- kết quả trả về sẽ lại 1 mảng được "nối đuôi" nhauMã:Sub Test() Dim aRes aRes = Join2DArray(Range("E2:E1000"), Range("F2:F1000"), Range("G2:G1000")) Range("M2").Resize(UBound(aRes, 1), UBound(aRes, 2)).Value = aRes End Sub
Công dụng của hàm thường để copy nhiều sheet vào 1 sheet, kết quả sẽ bỏ quả các dòng rổng
Vậy thì... không! Muốn thì phải viết hàm khác bạn àCho em hỏi anh @ndu96081631 với ! Hàm này có thể ứng dụng trong việc gộp các sheet nhưng copy theo chiều ngang được không ạ !
Cho em hỏi, nếu nối chuỗi ở 2 File khác nhau, ví dụ File A là nguồn và File B là đích thì code trên có chạy được không và thay đổi thế nào? em cảm ơn!Trước đây tôi có viết hàm Join2DArray, có thể áp dụng cho bài này
1> Code của hàm Join2DArray
2> Phần áp dụng:Mã:Function Join2DArray(ParamArray arrays()) Dim arr(), aSub, tmp Dim lRs As Long, lCs As Long, lR As Long, lC As Long Dim n As Long, m As Long, i As Long, bChk As Boolean On Error Resume Next For i = 0 To UBound(arrays) aSub = arrays(i) n = UBound(aSub, 1) - LBound(aSub, 1) + 1 lRs = lRs + n m = UBound(aSub, 2) - LBound(aSub, 2) + 1 If lCs < m Then lCs = m Next ReDim arr(1 To lCs, 1 To lRs) n = 0: m = 0 For i = 0 To UBound(arrays) aSub = arrays(i) For lR = LBound(aSub, 1) To UBound(aSub, 1) bChk = False n = n + 1 For lC = LBound(aSub, 2) To UBound(aSub, 2) tmp = aSub(lR, lC) Select Case VarType(tmp) Case 0 To 1: arr(lC, n) = vbNullString Case 2 To 7: arr(lC, n) = tmp Case 8 If IsNumeric(tmp) Then arr(lC, n) = "'" & tmp Else arr(lC, n) = tmp End If End Select If Len(CStr(tmp)) Then bChk = True Next If bChk = False Then n = n - 1 Next Next If n Then ReDim Preserve arr(1 To lCs, 1 To n) Join2DArray = Transpose2DArray(arr) End If End Function Function Transpose2DArray(ByVal arr2D) Dim arr(), aTemp Dim lR As Long, lC As Long On Error Resume Next aTemp = arr2D ReDim arr(LBound(aTemp, 2) To UBound(aTemp, 2), LBound(aTemp, 1) To UBound(aTemp, 1)) For lR = LBound(aTemp, 1) To UBound(aTemp, 1) For lC = LBound(aTemp, 2) To UBound(aTemp, 2) arr(lC, lR) = aTemp(lR, lC) Next Next Transpose2DArray = arr End Function
Bạn không cần quan tâm code hàm Join2DArray viết gì, chỉ cần biết áp dụng theo cú pháp: Join2DArray(mảng 1, mảng 2,...., mảng n) <--- kết quả trả về sẽ lại 1 mảng được "nối đuôi" nhauMã:Sub Test() Dim aRes aRes = Join2DArray(Range("E2:E1000"), Range("F2:F1000"), Range("G2:G1000")) Range("M2").Resize(UBound(aRes, 1), UBound(aRes, 2)).Value = aRes End Sub
Công dụng của hàm thường để copy nhiều sheet vào 1 sheet, kết quả sẽ bỏ quả các dòng rổng
Cụ thể chút đi bạn.Cho em hỏi, nếu nối chuỗi ở 2 File khác nhau, ví dụ File A là nguồn và File B là đích thì code trên có chạy được không và thay đổi thế nào? em cảm ơn!
Nói chính xác hơn là nối mảng với nhau, cụ thể:Cụ thể chút đi bạn.
Ngoài ra thì nối nhiều mảng lại với nhau khác hoàn toàn với nối chuỗi nhé