Mình Uolad file rồi nhờ Bạn giúp với !Gởi file thật với dữ liệu giả định lên
Mình Uolad file rồi nhờ Bạn giúp với !Gởi file thật với dữ liệu giả định lên
file đâu có khác gì file trướcMình Uolad file rồi nhờ Bạn giúp với !
Public Sub GPE()
Dim Sh As Worksheet
Dim dArr, Arr, key As Variant
Dim i, k, lRow As Long
Dim ShName, Col As String
On Error Resume Next
Col = InputBox("Nhap Ky Tu Cot muon tim, nhu A, B, C ... ")
Trolai:
i = Range(Col & "1").Row
If Err.Number Then
Err.Clear
Col = InputBox("Nhap sai, Nhap lai Ky Tu Cot muon tim, nhu A, B, C ... ")
GoTo Trolai
End If
Col = UCase(Col)
With CreateObject("Scripting.Dictionary")
For Each Sh In Worksheets
ShName = Sh.Name
If ShName <> "Sheet1" Then
lRow = Sh.Range(Col & Rows.Count).End(xlUp).Row
If lRow = 1 Then lRow = 2
dArr = Sh.Range(Col & 1).Resize(lRow).Value
For i = 1 To UBound(dArr)
key = dArr(i, 1)
If key <> "" Then
If Not .exists(key) Then
.Add key, Array(ShName, Col & i)
Else
If IsArray(.Item(key)) Then .Item(key) = 1
End If
End If
Next i
End If
Next Sh
ReDim Arr(1 To .Count, 1 To 3)
For i = 0 To .Count - 1
dArr = .items()(i)
If IsArray(dArr) Then
k = k + 1
Arr(k, 1) = dArr(0): Arr(k, 2) = dArr(1): Arr(k, 3) = .keys()(i)
End If
Next i
End With
With Sheet1
.Range("A2", .Range("C" & .Range("A2").End(xlDown).Row)).ClearContents
.Range("A2").Resize(k, 3) = Arr
End With
End Sub
Đúng vậy, Em chỉ muốn tìm trên cột theo ý mình. Ok rồi Anh ạ!file đâu có khác gì file trướcMã:Public Sub GPE() Dim Sh As Worksheet Dim dArr, Arr, key As Variant Dim i, k, lRow As Long Dim ShName, Col As String On Error Resume Next Col = InputBox("Nhap Ky Tu Cot muon tim, nhu A, B, C ... ") Trolai: i = Range(Col & "1").Row If Err.Number Then Err.Clear Col = InputBox("Nhap sai, Nhap lai Ky Tu Cot muon tim, nhu A, B, C ... ") GoTo Trolai End If Col = UCase(Col) With CreateObject("Scripting.Dictionary") For Each Sh In Worksheets ShName = Sh.Name If ShName <> "Sheet1" Then lRow = Sh.Range(Col & Rows.Count).End(xlUp).Row If lRow = 1 Then lRow = 2 dArr = Sh.Range(Col & 1).Resize(lRow).Value For i = 1 To UBound(dArr) key = dArr(i, 1) If key <> "" Then If Not .exists(key) Then .Add key, Array(ShName, Col & i) Else If IsArray(.Item(key)) Then .Item(key) = 1 End If End If Next i End If Next Sh ReDim Arr(1 To .Count, 1 To 3) For i = 0 To .Count - 1 dArr = .items()(i) If IsArray(dArr) Then k = k + 1 Arr(k, 1) = dArr(0): Arr(k, 2) = dArr(1): Arr(k, 3) = .keys()(i) End If Next i End With With Sheet1 .Range("A2", .Range("C" & .Range("A2").End(xlDown).Row)).ClearContents .Range("A2").Resize(k, 3) = Arr End With End Sub
Có một yêu cầu nhỏ nhờ Bạn giúp mình: Bạn chỉnh code khong phân biệt chữ Hoa chữ thường mình với như file mình Up lại.Đúng vậy, Em chỉ muốn tìm trên cột theo ý mình. Ok rồi Anh ạ!
Cám ơn Anh !
Anh HiueCD chỉnh lại code mà không phân biệt chữ hoa và chữ thường em với. Code về mảng em không rành lắm.file đâu có khác gì file trướcMã:Public Sub GPE() Dim Sh As Worksheet Dim dArr, Arr, key As Variant Dim i, k, lRow As Long Dim ShName, Col As String On Error Resume Next Col = InputBox("Nhap Ky Tu Cot muon tim, nhu A, B, C ... ") Trolai: i = Range(Col & "1").Row If Err.Number Then Err.Clear Col = InputBox("Nhap sai, Nhap lai Ky Tu Cot muon tim, nhu A, B, C ... ") GoTo Trolai End If Col = UCase(Col) With CreateObject("Scripting.Dictionary") For Each Sh In Worksheets ShName = Sh.Name If ShName <> "Sheet1" Then lRow = Sh.Range(Col & Rows.Count).End(xlUp).Row If lRow = 1 Then lRow = 2 dArr = Sh.Range(Col & 1).Resize(lRow).Value For i = 1 To UBound(dArr) key = dArr(i, 1) If key <> "" Then If Not .exists(key) Then .Add key, Array(ShName, Col & i) Else If IsArray(.Item(key)) Then .Item(key) = 1 End If End If Next i End If Next Sh ReDim Arr(1 To .Count, 1 To 3) For i = 0 To .Count - 1 dArr = .items()(i) If IsArray(dArr) Then k = k + 1 Arr(k, 1) = dArr(0): Arr(k, 2) = dArr(1): Arr(k, 3) = .keys()(i) End If Next i End With With Sheet1 .Range("A2", .Range("C" & .Range("A2").End(xlDown).Row)).ClearContents .Range("A2").Resize(k, 3) = Arr End With End Sub
Dùng hàm Ucase để chuyển key về chữ inAnh HiueCD chỉnh lại code mà không phân biệt chữ hoa và chữ thường em với. Code về mảng em không rành lắm.
Cám ơn Anh !
Public Sub GPE()
Dim Sh As Worksheet
Dim dArr, Arr, key As Variant
Dim i, k, lRow As Long
Dim ShName, Col As String
On Error Resume Next
Col = InputBox("Nhap Ky Tu Cot muon tim, nhu A, B, C ... ")
Trolai:
i = Range(Col & "1").Row
If Err.Number Then
Err.Clear
Col = InputBox("Nhap sai, Nhap lai Ky Tu Cot muon tim, nhu A, B, C ... ")
GoTo Trolai
End If
Col = UCase(Col)
With CreateObject("Scripting.Dictionary")
For Each Sh In Worksheets
ShName = Sh.Name
If ShName <> "Sheet1" Then
lRow = Sh.Range(Col & Rows.Count).End(xlUp).Row
If lRow = 1 Then lRow = 2
dArr = Sh.Range(Col & 1).Resize(lRow).Value
For i = 1 To UBound(dArr)
key = UCase(dArr(i, 1))
If key <> "" Then
If Not .exists(key) Then
.Add key, Array(ShName, Col & i, dArr(i, 1))
Else
If IsArray(.Item(key)) Then .Item(key) = 1
End If
End If
Next i
End If
Next Sh
ReDim Arr(1 To .Count, 1 To 3)
For i = 0 To .Count - 1
dArr = .items()(i)
If IsArray(dArr) Then
k = k + 1
Arr(k, 1) = dArr(0): Arr(k, 2) = dArr(1): Arr(k, 3) = dArr(2)
End If
Next i
End With
With Sheet1
.Range("A2", .Range("C" & .Range("A2").End(xlDown).Row)).ClearContents
.Range("A2").Resize(k, 3) = Arr
End With
End Sub
Đã có địa chỉ, lấy thêm dữ liệu các cột khác không khó đâu, bạn tự viết code, có gì mình chỉnh lạiChào các Anh Chị Diễn đàn GPE !
Sau khi tìm được các giá trị không trùng thì lại phải ngồi copy từng dòng số liệu mà số liệu thì lớn quá nên vật vã lắm. Em nhờ các Anh Chị code thêm phần copy dòng số liệu không trùng đó về sheet1 như file đính kèm.
Ps: Em đang cần gấp ạ !
Em cám ơn !
Em đang bận với nhiều số liệu nên cũng chưa viết đc với lai viết về mảng em không có rành lắm. Cám ơn anh nhiều.Đã có địa chỉ, lấy thêm dữ liệu các cột khác không khó đâu, bạn tự viết code, có gì mình chỉnh lại
ReDim Arr(1 To .Count, 1 To 3) chỉnh số 3 lại
k = k + 1
Arr(k, 1) = dArr(0): Arr(k, 2) = dArr(1): Arr(k, 3) = dArr(2)
thêm các lệnh Arr(k, 4) = .... hoặc dùng for
chỉnh lại lệnh xuất kết quả
Đọc kỹ hướng dẫn trước khi chạy code.Em đang bận với nhiều số liệu nên cũng chưa viết đc với lai viết về mảng em không có rành lắm. Cám ơn anh nhiều.
Dear anh chị
Em có hai sheet có cột dữ liệu project code : Sheet "Project 2018" và sheet "finished". Em muốn tạo sheet "WIP" có mẫu giống như sheet 'project 2018" nhưng loại bỏ các project code đã có trong sheet "finished". Em nhờ anh chị giúp em tạo code VBA ạ. Em xin cám ơn ạ
Sub Laydulieu()
Dim Dic As Object, sArr(), dArr(), tArr()
Dim I As Long, J As Long, K As Long
Set Dic = CreateObject("Scripting.Dictionary")
With Sheets("Finished services")
tArr = .Range("K6", .Range("K" & Rows.Count).End(3)).Value
End With
For I = 1 To UBound(tArr)
Dic.Item(CStr(tArr(I, 1))) = I
Next I
With Sheets("Project 2018")
sArr = .Range("A4", .Range("A" & Rows.Count).End(3)).Resize(, 21).Value
ReDim dArr(1 To UBound(sArr, 1), 1 To UBound(sArr, 2))
For I = 1 To UBound(sArr)
If Not Dic.Exists(CStr(sArr(I, 4))) Then
K = K + 1
For J = 1 To 21
dArr(K, J) = sArr(I, J)
Next J
End If
Next I
End With
With Sheets("WIP")
If K Then
.Range("A4:X10000").ClearContents
.Range("A4").Resize(K, UBound(sArr, 2)) = dArr
End If
End With
Set Dic = Nothing
End Sub
Sub CopyRowsNotInFinishedServices()
Dim Arr(), Sh As Worksheet, sArr(), Tmp As Boolean
Dim Rws As Long, Col As Byte, J As Long, Dm As Byte, W As Long, Z As Long
Sheets("Project 2018").Select
Rws = [d3].CurrentRegion.Rows.Count
Col = [d3].CurrentRegion.Columns.Count
Arr() = [a4].Resize(Rws, Col).Value
ReDim dArr(1 To Rws, 1 To Col)
Sheets("WIP").[a4].Resize(Rws, Col).Value = dArr()
With Sheets("Finished services")
Rws = .[b5].CurrentRegion.Rows.Count
sArr() = .[k6].Resize(Rws).Value
End With
For J = 1 To UBound(Arr())
For Z = 1 To UBound(sArr())
If Arr(J, 4) = sArr(Z, 1) Then
Tmp = True: Exit For
End If
Next Z
If Tmp Then
Tmp = False
Else
W = W + 1
For Dm = 1 To Col
dArr(W, Dm) = Arr(J, Dm)
Next Dm
End If
Next J
Sheets("WIP").[a4].Resize(W, Col).Value = dArr()
End Sub
**PHP:Sub Laydulieu() Dim Dic As Object, sArr(), dArr(), tArr() Dim I As Long, J As Long, K As Long Set Dic = CreateObject("Scripting.Dictionary") With Sheets("Finished services") tArr = .Range("K6", .Range("K" & Rows.Count).End(3)).Value End With For I = 1 To UBound(tArr) Dic.Item(CStr(tArr(I, 1))) = I Next I With Sheets("Project 2018") sArr = .Range("A4", .Range("A" & Rows.Count).End(3)).Resize(, 21).Value ReDim dArr(1 To UBound(sArr, 1), 1 To UBound(sArr, 2)) For I = 1 To UBound(sArr) If Not Dic.Exists(CStr(sArr(I, 4))) Then K = K + 1 For J = 1 To 21 dArr(K, J) = sArr(I, J) Next J End If Next I End With With Sheets("WIP") If K Then .Range("A4:X10000").ClearContents .Range("A4").Resize(K, UBound(sArr, 2)) = dArr End If End With Set Dic = Nothing End Sub
Mình đã thử nhung trên sheet WIP vẫn còn giá trị trùng ạ. VD : project code 37743 đã có trên sheet Finishes thì không có trên sheet WIP nữa ạ.Macro của bạn đây (tuy chậm chân rồi); Chúc vui vẻ & thành công:
PHP:Sub CopyRowsNotInFinishedServices() Dim Arr(), Sh As Worksheet, sArr(), Tmp As Boolean Dim Rws As Long, Col As Byte, J As Long, Dm As Byte, W As Long, Z As Long Sheets("Project 2018").Select Rws = [d3].CurrentRegion.Rows.Count Col = [d3].CurrentRegion.Columns.Count Arr() = [a4].Resize(Rws, Col).Value ReDim dArr(1 To Rws, 1 To Col) Sheets("WIP").[a4].Resize(Rws, Col).Value = dArr() With Sheets("Finished services") Rws = .[b5].CurrentRegion.Rows.Count sArr() = .[k6].Resize(Rws).Value End With For J = 1 To UBound(Arr()) For Z = 1 To UBound(sArr()) If Arr(J, 4) = sArr(Z, 1) Then Tmp = True: Exit For End If Next Z If Tmp Then Tmp = False Else W = W + 1 For Dm = 1 To Col dArr(W, Dm) = Arr(J, Dm) Next Dm End If Next J Sheets("WIP").[a4].Resize(W, Col).Value = dArr() End Sub
Mình đã sửa được rồi bạn nhé. cám ơn bạn nhiều ạ**
Mình đã thử rồi nhưng giá trị ở cột Cost-USD và Cost - VND không hiện lên ạ
Thầy cho em hỏi, em muốn đổi điểm trung bình thành tổng điểm thì mình sữa lại chỗ nào.2 cột điểm thì cũng vẫn dùng Consolidate thôi ---> Add vào 2 vùng C225 và C2:E5
Để bạn đở mất công làm bằng tay, tôi viết nó thành code... bạn chỉ việc nhấn nút là xong!
PHP:Sub DiemTB() Range("I1").CurrentRegion.Offset(1).ClearContents With Range([C2], [C65536].End(xlUp)) Range("I2").Consolidate _ Array(.Resize(, 2).Address(, , 2), .Resize(, 3).Address(, , 2)), 1, False, True End With End Sub
Chỗ này:Thầy cho em hỏi, em muốn đổi điểm trung bình thành tổng điểm thì mình sữa lại chỗ nào.
Em thấy code thầy hay và gọn nên áp dụng
Em cám ơn
Số 1 sửa thành số 9 nghĩa là SUMArray(.Resize(, 2).Address(, , 2), .Resize(, 3).Address(, , 2)), 1, False, True
Dạ em cám ơn thầyChỗ này:
Số 1 sửa thành số 9 nghĩa là SUM
Chào anhBạn cứ thử sửa lại như vầy xem sao:
Mã:Private Sub Worksheet_SelectionChange(ByVal Target As Range) Range("[COLOR=red]F2:G65536[/COLOR]").Clear With Range("[COLOR=red]B2:C[/COLOR]" & [[COLOR=red]B65536[/COLOR]].End(xlUp).Row) Range("[COLOR=red]F2[/COLOR]").Consolidate .Address(, , 2), Function:=xlSum, LeftColumn:=True End With End Sub
DIỄN ĐÀN GIẢI PHÁP EXCEL