Thử: (sử dụng excel từ 2010 trở lên)Em lập công thức tìm và sắp xếp dữ liệu theo thời gian nhưng chưa đạt được như ý muốn như file đính kèm. Mong các anh/chị giúp đỡ
A10=AGGREGATE(15,6,$A$2:$G$6,ROW($A1))
B10=INDIRECT(MID(REPT(TEXT(AGGREGATE(15,6,(COLUMN($B$1:$H$1)*10^3+ROW($A$1:$A$6))/($A$1:$G$6=$A10),COUNTIF($A$10:$A10,$A10)),"C000R000"),2),5,8),)
Xem file kèm.Cảm ơn anh nhưng vấn đề hàm của anh là tham chiếu dữ liệu sheet khác là mất kết quả, có cách nào khắc phục không ạ ! (và vấn đề nữa hàm này đang ưu tiên thứ tự trên xuống dưới, sau đó từ trái sang phải. Em muốn ưu tiên nhưng ngày trùng nhau thì dữ liệu ưu tiên là từ trái sang phải trước sau là trên xuống dưới ạ)
Thử: (sử dụng excel từ 2010 trở lên)
anh ơi. hàm của anh chạy đạt mong muốn về yêu cầu kỹ thuật nhưng khi em chạy với dữ liệu lên đến 1000 hàng tốc độ xử lý rất chậm (như file em đính kèm), Mong anh giúp đỡ em giải quyết vấn đề này, em chân thành cảm ơn !Xem file kèm.
Thân
Du2ng code Vbaanh ơi. hàm của anh chạy đạt mong muốn về yêu cầu kỹ thuật nhưng khi em chạy với dữ liệu lên đến 1000 hàng tốc độ xử lý rất chậm (như file em đính kèm), Mong anh giúp đỡ em giải quyết vấn đề này, em chân thành cảm ơn !
Sub XepThuTu()
Dim sh As Worksheet
Dim j As Long, sRow As Long, sCol As Long, eRow As Long
Set sh = Sheets("Sheet2") 'Dat sh là Sheet2
eRow = sh.Range("A" & Rows.Count).End(xlUp).Row 'Dong cuoi Sheet2
If eRow > 1 Then sh.Range("A2:B" & eRow).ClearContents 'Xoa du lieu cu
With Sheets("Sheet1")
sRow = .Range("A1").CurrentRegion.Rows.Count - 1 'So dong du lieu Sheet1(tu dong 2 xuong)
sCol = .Range("AAA1").End(xlToLeft).Column 'So cot du lieu
If sCol < 2 Then Exit Sub 'Khong co du lieu 2 cot, thoat Sub
For j = 1 To sCol Step 2
eRow = sh.Range("A" & Rows.Count).End(xlUp).Row 'Dong cuoi Sheet 2
sh.Range("A" & eRow + 1).Resize(sRow, 2) = .Cells(2, j).Resize(sRow, 2).Value 'Gán du lieu sheet1 qua sheet2
Next j
eRow = sh.Range("A" & Rows.Count).End(xlUp).Row
sh.Range("A1:B" & eRow).Sort sh.[A1], 1, sh.[B1], , 1, Header:=xlYes 'Sort du lieu
End With
End Sub
Anh ơi! Anh có thể chú thích trong code được không Anh?Du2ng code Vba
Mã:Sub XepThuTu() Dim sh As Worksheet Dim j As Long, sRow As Long, sCol As Long, eRow As Long Set sh = Sheets("Sheet2") eRow = sh.Range("A" & Rows.Count).End(xlUp).Row If eRow > 1 Then sh.Range("A2:B" & eRow).ClearContents With Sheets("Sheet1") sRow = .Range("A1").CurrentRegion.Rows.Count - 1 sCol = .Range("AAA1").End(xlToLeft).Column If sCol < 2 Then Exit Sub For j = 1 To sCol Step 2 eRow = sh.Range("A" & Rows.Count).End(xlUp).Row sh.Range("A" & eRow + 1).Resize(sRow, 2) = .Cells(2, j).Resize(sRow, 2).Value Next j eRow = sh.Range("A" & Rows.Count).End(xlUp).Row sh.Range("A1:B" & eRow).Sort sh.[A1], 1, sh.[B1], , 1, Header:=xlYes End With End Sub
Mới thêm chú thích bài #6Anh ơi! Anh có thể chú thích trong code được không Anh?
cảm ơn Anh nhiều!
Anh ơi. VBA của anh ứng dụng được cột A (date) còn ở cột B hiện tại đang ưu tiên sắp xếp theo thứ tự chữ cái, em mong muốn là sắp xếp thứ tự ở cột B (List) TH1: ưu tiên trên xuống dưới và TH2: ưu tiên từ trái qua phải như các bảng Excel em nhờ anh Phan Thế Hiệp ạ, anh có thể chỉnh sửa lại code VBA giúp em không ạMới thêm chú thích bài #6
Hai cách xếpAnh ơi. VBA của anh ứng dụng được cột A (date) còn ở cột B hiện tại đang ưu tiên sắp xếp theo thứ tự chữ cái, em mong muốn là sắp xếp thứ tự ở cột B (List) TH1: ưu tiên trên xuống dưới và TH2: ưu tiên từ trái qua phải như các bảng Excel em nhờ anh Phan Thế Hiệp ạ, anh có thể chỉnh sửa lại code VBA giúp em không ạ
Sub XepTraiPhai()
Dim sh As Worksheet, sArr(), Res()
Dim j As Long, sRow As Long, sCol As Long, eRow As Long
Set sh = Sheets("Sheet2")
With Sheets("Sheet2")
i = .Range("A" & Rows.Count).End(xlUp).Row
If i > 1 Then .Range("A2:B" & i + 1).ClearContents
End With
sArr = Sheets("Sheet1").Range("A1").CurrentRegion.Value
sRow = UBound(sArr, 1): sCol = Int(UBound(sArr, 2) / 2) * 2
If sCol < 2 Then Exit Sub
ReDim Res(1 To (sRow - 1) * sCol, 1 To 2)
For j = 1 To sCol Step 2
For i = 2 To sRow
If Len(sArr(i, j)) + Len(sArr(i, j + 1)) > 0 Then
k = k + 1
Res(k, 1) = sArr(i, j): Res(k, 2) = sArr(i, j + 1)
End If
Next i
Next j
Sheets("Sheet2").Range("A2:B2").Resize(k) = Res
End Sub
Sub XepTrenXuong()
Dim sh As Worksheet, sArr(), Res()
Dim j As Long, sRow As Long, sCol As Long, eRow As Long
Set sh = Sheets("Sheet2")
With Sheets("Sheet2")
i = .Range("A" & Rows.Count).End(xlUp).Row
If i > 1 Then .Range("A2:B" & i + 1).ClearContents
End With
sArr = Sheets("Sheet1").Range("A1").CurrentRegion.Value
sRow = UBound(sArr, 1): sCol = Int(UBound(sArr, 2) / 2) * 2
If sCol < 2 Then Exit Sub
ReDim Res(1 To (sRow - 1) * sCol, 1 To 2)
For i = 2 To sRow
For j = 1 To sCol Step 2
If Len(sArr(i, j)) + Len(sArr(i, j + 1)) > 0 Then
k = k + 1
Res(k, 1) = sArr(i, j): Res(k, 2) = sArr(i, j + 1)
End If
Next j
Next i
Sheets("Sheet2").Range("A2:B2").Resize(k) = Res
End Sub
Đúng là làm vậy là đạt yêu cầu nhưng em nhờ anh ghép luôn vào code VBA vì bảng tính em gồm nhiều cột và dữ liệu khác nữa, nếu dùng cách như anh hướng dẫn thì mỗi lần làm phải copy sang một sheet mới và copy ngược lại ạThử:
1. Lấy dữ liệu từ trái qua phải. từ trên xuống
2. Sort cột A.
Hai cách xếp
Anh ơi anh giúp em sửa lại bổ sung giúp em một chút được không ạ, phần giữ liệu đầu vào ở sheet1 giờ em chỉ muốn lấy vùng từ cột C đến cột H mà không lấy cột A và B nữa ạ hoặc chỉ một vùng nhất định mà người sử dụng có thể thay đổi tùy công việc ạ. Em chân thành cảm ơn
Vâng phần sort thì em copy phầnBài 4 sort theo cột A mờ, Không hiểu bạn muốn sort theo kiểu nào, sort tay gởi kết quả lên
Anh giúp em sửa lại code, phần giữ liệu đầu vào ở sheet1 giờ em chỉ muốn lấy vùng từ cột C đến cột H mà không lấy cột A và B nữa ạ (một vùng nhất định có thể thay đổi trong đoạn code để người sử dụng có thể thay đổi tùy công việc ạ).
Vâng phần sort thì em copy phần
eRow = sh.Range("A" & Rows.Count).End(xlUp).Row
sh.Range("A1:B" & eRow).Sort sh.[A1], 1, sh.[B1], , 1, Header:=xlYes
của anh vào đoạn code mới, em test thì được rồi ạ.
Anh giúp em sửa lại code, phần giữ liệu đầu vào ở sheet1 giờ em chỉ muốn lấy vùng từ cột C đến cột H mà không lấy cột A và B nữa ạ (một vùng nhất định có thể thay đổi trong đoạn code để người sử dụng có thể thay đổi tùy công việc ạ). Em chân thành cảm ơn !
Sub XepThuTu()
Dim Rng As Range
Dim j As Long, sRow As Long, sCol As Long, eRow As Long
With Sheets("Sheet2")
eRow = .Range("A" & Rows.Count).End(xlUp).Row
If eRow > 1 Then .Range("A2:B" & eRow).ClearContents
On Error Resume Next
Set Rng = Application.InputBox("Chon vung du lieu", "Input Range", Type:=8)
If Err.Number > 0 Then MsgBox ("Chua chon vùng du lieu"): On Error GoTo 0: Exit Sub
sCol = Rng.Columns.Count
If sCol < 2 Then MsgBox ("Chon vùng du lieu có hon 2 cot"): Exit Sub
sRow = Rng.Rows.Count
For j = 1 To sCol Step 2
eRow = .Range("A" & Rows.Count).End(xlUp).Row
.Range("A" & eRow + 1).Resize(sRow, 2) = Rng.Cells(1, j).Resize(sRow, 2).Value
Next j
eRow = .Range("A" & Rows.Count).End(xlUp).Row
.Range("A1:B" & eRow).Sort .[A1], 1, .[B1], , 1, Header:=xlYes
End With
End Sub
Chủ động thay đổi vùng sao bằng chọn vùng trực tiếp?@Ba Tê
Vâng cảm ơn Thầy. Thầy có thể giúp em thêm 1 trường hợp nữa là các ngày trùng nhau ưu tiên lấy dữ liệu trên xuống dưới, sau đó mới từ trái sang phải được không ạ, hiện code Thầy vừa viết đang ưu tiên cho các ngày trùng nhau lấy từ trái sang phải, sau trên xuống dưới ! Em cần cả 2 ạ
Và vùng dữ liệu từ cột thầy đưa luôn vào code giúp em với ạ, ví dụ từ cột C:H em sẽ chủ động thay đổi vùng đó ạ
Thu code@HieuCD
Em cảm ơn anh nhưng em test thử thì Code lấy dữ liệu cho code B những ngày trùng nhau thì không được theo quy luật ưu tiên nào ạ, anh xem lại giúp em; em muốn lấy theo thứ tự không theo Alpha B của chữ cái mà ưu tiên th1: từ trên xuống dưới và th2: trái qua phải. Và vùng dữ liệu em cũng muốn đưa luôn vào code, em sẽ chủ động thay đổi vùng đó trong code ạ
Sub XepThuTu()
Dim Rng As Range
Dim j As Long, sRow As Long, sCol As Long, fRow As Long, eRow As Long
Set Rng = Sheets("Sheet1").Range("A2:H10")
sCol = Int(Rng.Columns.Count / 2) * 2
If sCol < 2 Then MsgBox ("Vùng du lieu phai >= 2 cot"): Exit Sub
sRow = Rng.Rows.Count
With Sheets("Sheet2")
eRow = .Range("A" & Rows.Count).End(xlUp).Row
If eRow > 1 Then .Range("A2:B" & eRow).ClearContents
For j = 1 To sCol Step 2
eRow = .Range("A" & Rows.Count).End(xlUp).Row
.Range("A" & eRow + 1).Resize(sRow, 2) = Rng.Cells(1, j).Resize(sRow, 2).Value
Next j
eRow = .Range("A" & Rows.Count).End(xlUp).Row + 1
.Range("A2:B" & eRow).Sort .Range("A2"), 1, Header:=xlNo
End With
End Sub
Anh Hiếu có thể giải thích giải thuật dòng code này được không?Thu code
Mã:Sub XepThuTu() Dim Rng As Range Dim j As Long, sRow As Long, sCol As Long, fRow As Long, eRow As Long Set Rng = Sheets("Sheet1").Range("A2:H10") sCol = Int(Rng.Columns.Count / 2) * 2 If sCol < 2 Then MsgBox ("Vùng du lieu phai >= 2 cot"): Exit Sub sRow = Rng.Rows.Count With Sheets("Sheet2") eRow = .Range("A" & Rows.Count).End(xlUp).Row If eRow > 1 Then .Range("A2:B" & eRow).ClearContents For j = 1 To sCol Step 2 eRow = .Range("A" & Rows.Count).End(xlUp).Row .Range("A" & eRow + 1).Resize(sRow, 2) = Rng.Cells(1, j).Resize(sRow, 2).Value Next j eRow = .Range("A" & Rows.Count).End(xlUp).Row + 1 .Range("A2:B" & eRow).Sort .Range("A2"), 1, Header:=xlNo End With End Sub
File bài #21.Vâng em cảm ơn Thầy làm cả 2 trường hợp về thứ tự ưu tiên lựa chọn khi trùng nhau như vậy đạt ý nguyện của em rồi, giờ em muốn thêm một chút "Chủ động thay đổi vùng sao bằng chọn vùng trực tiếp?" nghĩa là bổ sung đoạn code chọn vùng như trong đoạn code của anh HieuCd
Set Rng = Sheets("Sheet1").Range("A2:H100"). Vùng A2H100 là vùng em có thể thay đổi đối với mỗi dự án sẽ cố định phần này, không phải quét lại vùng mỗi khi chạy lại VBA khi có thay đổi dữ liệu đầu vào ạ.
Public Sub sGpe1()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, R As Long, Col As Long
sArr = Sheet1.Range("C2:H10000").Value '-------Thay doi vung chon tuy y'
R = UBound(sArr)
Col = UBound(sArr, 2)
ReDim dArr(1 To R * Col, 1 To 2)
For I = 1 To R
For J = 1 To Col Step 2
If sArr(I, J) <> Empty Then
K = K + 1
dArr(K, 1) = sArr(I, J)
If J + 1 <= Col Then dArr(K, 2) = sArr(I, J + 1)
End If
Next J
Next I
With Sheets("GPE")
.Select
.Range("B2").Resize(100000, 2).ClearContents
.Range("B2").Resize(K, 2) = dArr
.Range("B2").Resize(K, 2).Sort Key1:=Range("B2"), Order1:=xlAscending
End With
End Sub
Public Sub sGpe2()
Dim sArr(), dArr(), I As Long, J As Long, K As Long, R As Long, Col As Long
sArr = Sheet1.Range("C2:H10000").Value '-------Thay doi vung chon tuy y'
R = UBound(sArr)
Col = UBound(sArr, 2)
ReDim dArr(1 To R * Col, 1 To 2)
For J = 1 To Col Step 2
For I = 1 To R
If sArr(I, J) <> Empty Then
K = K + 1
dArr(K, 1) = sArr(I, J)
If J + 1 <= Col Then dArr(K, 2) = sArr(I, J + 1)
End If
Next I
Next J
With Sheets("GPE")
.Select
.Range("B2").Resize(100000, 2).ClearContents
.Range("B2").Resize(K, 2) = dArr
.Range("B2").Resize(K, 2).Sort Key1:=Range("B2"), Order1:=xlAscending
End With
End Sub
Chạy code, chọn cách sort@Ba Tê
Vâng em cảm ơn Thầy làm cả 2 trường hợp về thứ tự ưu tiên lựa chọn khi trùng nhau như vậy đạt ý nguyện của em rồi, giờ em muốn thêm một chút "Chủ động thay đổi vùng sao bằng chọn vùng trực tiếp?" nghĩa là bổ sung đoạn code chọn vùng như trong đoạn code của anh HieuCd
Set Rng = Sheets("Sheet1").Range("A2:H100"). Vùng A2H100 là vùng em có thể thay đổi đối với mỗi dự án sẽ cố định phần này, không phải quét lại vùng mỗi khi chạy lại VBA khi có thay đổi dữ liệu đầu vào ạ.
Bài đã được tự động gộp:
@HieuCD
yeah.Cảm ơn anh ! anh giúp em thêm trường hợp ưu tiên trái sang phải trước, rồi mới đến trên xuống dưới. Code anh vừa viết với trường hợp ưu tiên trên xuống dưới, trái qua phải như vậy em thấy ok rồi ạ
Sub XepThuTu()
Dim sArr(), tArr(), Res(), S
Dim i As Long, k As Long, sRow As Long, j As Byte, sCol As Byte
Dim t, tMin As Long, tMax As Long
Dim Msb, Style, Title
Const VungChon As String = "A2:H10"
With Sheets("Sheet1")
sArr = .Range(VungChon).Value
tMin = Application.Min(.Range(VungChon))
tMax = Application.Max(.Range(VungChon))
End With
sCol = Int(UBound(sArr, 2) / 2) * 2
If sCol < 2 Then MsgBox ("Vùng du lieu phai >= 2 cot"): Exit Sub
sRow = UBound(sArr)
ReDim tArr(tMin To tMax)
ReDim Res(1 To sRow * sCol / 2, 1 To 2)
Msg = "Yes: Sort List from Up to Down" & Chr(10) & Chr(10) & "No: Sort List from Left to Right"
Style = vbYesNo + vbDefaultButton1
Title = "Do you want Sort Lists Up to Down ?"
Response = MsgBox(Msg, Style, Title)
If Response = vbYes Then ' User chose Yes.
For j = 1 To sCol Step 2
For i = 1 To sRow
t = CLng(sArr(i, j))
If t > 0 Then tArr(t) = tArr(t) & "," & sArr(i, j + 1)
Next i
Next j
Else ' User chose No.
For i = 1 To sRow
For j = 1 To sCol Step 2
t = CLng(sArr(i, j))
If t > 0 Then tArr(t) = tArr(t) & "," & sArr(i, j + 1)
Next j
Next i
End If
For i = tMin To tMax
If Len(tArr(i)) > 0 Then
t = CDate(i)
S = Split(tArr(i), ",")
For j = 1 To UBound(S)
k = k + 1
Res(k, 1) = t: Res(k, 2) = S(j)
Next j
End If
Next i
With Sheets("Sheet2")
eRow = .Range("A" & Rows.Count).End(xlUp).Row
If eRow > 1 Then .Range("A2:B" & eRow).ClearContents
If k > 0 Then .Range("A2:B2").Resize(k) = Res
End With
End Sub