Hàm transpsoe cho kết quả bị lỗi (1 người xem)

Liên hệ QC

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

quocphuoc88

Thành viên thường trực
Tham gia
29/11/10
Bài viết
299
Được thích
230
Nghề nghiệp
Kế toán - kiểm toán
E có viết 1 hàm để chuyển dữ liệu mảng từ cột thành dòng, tuy nhiên sau khi dùng transpose thì kết quả ra bị lỗi về định dạng ngày tháng:
Ví dụ: cột A ban đầu có định dạng là đ/mm/yy ( 1/8/13 ) nhưng sau khi qua hàm transpose thì nó lại thành 8/1/13 ( e đã định dạng ngày tháng 2 bên giống nhau )

E có tham khảo bài này :

http://www.giaiphapexcel.com/forum/showthread.php?40565-Chuy%E1%BB%83n-ng%C3%A0y-th%C3%A0nh-dd-mm-yyyy-khi-d%C3%B9ng-wf-Transpose%28Arr%29%21


nhưng không tìm ra lỗi tại sao như thế. Mong các a/ chị và các Thầy hướng dẫn giúp e ạ !

Em cám ơn !
 

File đính kèm

E tự mày mò và vận dụng theo bài #469 của Thầy Nud thì e thêm hàm transpose2darray thì lỗi trên không còn, Tuy nhiên e vẫn thắc mắc là tại sao hàm transpose lại cho kết quả như thế và có cách nào khắc phục không ạ !
 

File đính kèm

Upvote 0
Mình cũng bị dính chưởng với cái thằng Transpose này rồi, theo mình tìm hiểu thì không có cách. Và từ đây ta hiểu rằng thằng này nó không những chuyển chiều của mảng mà còn can thiệp vào dữ liệu của mảng nữa. Như vậy cách viết thì gọn gàng thật nhưng chưa chắc đã hiệu quả.

Ngoài cách bạn áp dụng hàm UDF Transpose2DArr thì mình cũng tham gia 1 cách nữa là lượt dữ liệu đánh dấu dòng đạt tiêu chuẩn rồi ta chỉ chép dòng đạt TC. Như vậy, sẽ giảm đáng kể số lần chép chuyển Data:

Mã:
Function value_nkc(ByVal Arr2D)
    Dim Arr(), Tmp, Id() As Integer
    Dim i, j
    Tmp = Arr2D
    For i = 1 To UBound(Tmp, 1)
    If Tmp(i, 5) = "v" Then
    j = j + 1
    ReDim Preserve Id(1 To j)
    Id(j) = i
    End If
    Next
    ReDim Arr(1 To j, 1 To UBound(Tmp, 2))
    For i = 1 To UBound(Id)
    For j = 1 To UBound(Tmp, 2)
    Arr(i, j) = Tmp(Id(i), j)
    Next
    Next
  value_nkc = Arr
End Function
 
Upvote 0
Mình cũng bị dính chưởng với cái thằng Transpose này rồi, theo mình tìm hiểu thì không có cách. Và từ đây ta hiểu rằng thằng này nó không những chuyển chiều của mảng mà còn can thiệp vào dữ liệu của mảng nữa. Như vậy cách viết thì gọn gàng thật nhưng chưa chắc đã hiệu quả.

Ngoài cách bạn áp dụng hàm UDF Transpose2DArr thì mình cũng tham gia 1 cách nữa là lượt dữ liệu đánh dấu dòng đạt tiêu chuẩn rồi ta chỉ chép dòng đạt TC. Như vậy, sẽ giảm đáng kể số lần chép chuyển Data:

Mã:
Function value_nkc(ByVal Arr2D)
    Dim Arr(), Tmp, Id() As Integer
    Dim i, j
    Tmp = Arr2D
    For i = 1 To UBound(Tmp, 1)
    If Tmp(i, 5) = "v" Then
    j = j + 1
    ReDim Preserve Id(1 To j)
    Id(j) = i
    End If
    Next
    ReDim Arr(1 To j, 1 To UBound(Tmp, 2))
    For i = 1 To UBound(Id)
    For j = 1 To UBound(Tmp, 2)
    Arr(i, j) = Tmp(Id(i), j)
    Next
    Next
  value_nkc = Arr
End Function

Cám ơn a, cách của a rất hay. Hạn chế nhiều việc hoán đổi dữ liệu !
e test cách của a cho hơn 50.000 dòng thì chưa tới 0.6 giây còn nếu cách cũ của e thì là 1.6 giây !
 
Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom