Requirement:
The user has encounter some difficulty in solving the sorting result. The user wants the result to be sorted by name. The user has already tried inserted a code to sort first the sheets("name") before pulling the data, but the result is the same.
Attached is the file for more specific.
The code:
Option Explicit
Sub CreateReport()
Dim wsReport As Worksheet, wsName As Worksheet, wsEmp As Worksheet, wsTraining As Worksheet
Dim dlr As Long, nr As Long, er As Long, lr As Long, i As Long, j As Long, n As Long
Dim x, y(), dict, dict2, it
Dim LName As String, FName As String, MName As String
Dim hireDate As Date, Salary As Double
Application.ScreenUpdating = False
Set wsReport = Sheets("Report")
Set wsName = Sheets("name")
Set wsEmp = Sheets("employement")
Set wsTraining = Sheets("trainings")
'Sorting "name" worksheet
wsName.Sort.SortFields.Clear
wsName.Sort.SortFields.Add Key:=Range("B2:B200") _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With wsName.Sort
.SetRange Range("A2:L200")
.Header = xlGuess
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
dlr = wsReport.Cells(Rows.Count, "F").End(xlUp).Row
If dlr > 4 Then wsReport.Range("A5:H" & dlr).ClearContents
x = wsTraining.Range("A1").CurrentRegion.Value
Set dict = CreateObject("Scripting.Dictionary")
For i = 2 To UBound(x, 1)
dict.Item(x(i, 1)) = ""
Next i
For Each it In dict.keys
If Application.CountIf(wsName.Columns(1), it) > 0 Then
nr = Application.Match(it, wsName.Columns(1), 0)
LName = wsName.Cells(nr, 2)
FName = wsName.Cells(nr, 3)
MName = wsName.Cells(nr, 4)
If Application.CountIf(wsEmp.Columns(1), it) > 0 Then
er = Application.Match(it, wsEmp.Columns(1), 0)
hireDate = wsEmp.Cells(er, 2)
Salary = wsEmp.Cells(er, 6)
n = Application.CountIf(wsTraining.Columns(1), it)
ReDim y(1 To n, 1 To 8)
j = 0
For i = 2 To UBound(x, 1)
If x(i, 1) = it Then
j = j + 1
y(1, 1) = LName
y(1, 2) = FName
y(1, 3) = MName
y(1, 4) = hireDate
y(1, 5) = Salary
y(j, 6) = x(i, 2)
y(j, 7) = x(i, 3)
y(j, 8) = x(i, 5)
End If
Next i
dlr = wsReport.Cells(Rows.Count, "F").End(xlUp).Row
If dlr = 4 Then
dlr = 5
Else
dlr = dlr + 2
End If
wsReport.Range("A" & dlr).Resize(UBound(y), 8) = y
n = 0
End If
End If
Next it
Application.ScreenUpdating = True
End Sub
Solution:
Sub CreateReport()
Dim wsReport As Worksheet, wsName As Worksheet, wsEmp As Worksheet, wsTraining As Worksheet
Dim dlr As Long, tr As Long, er As Long, lr As Long, i As Long, j As Long, n As Long, k As Long
Dim x, y(), z
Dim LName As String, FName As String, MName As String
Dim hireDate As Date, Salary As Double
Application.ScreenUpdating = False
Set wsReport = Sheets("Report")
Set wsName = Sheets("name")
Set wsEmp = Sheets("employement")
Set wsTraining = Sheets("trainings")
dlr = wsReport.Cells(Rows.Count, "F").End(xlUp).Row
If dlr > 4 Then wsReport.Range("A5:H" & dlr).ClearContents
'Sorting "name" worksheet
wsName.Sort.SortFields.Clear
wsName.Range("A1").CurrentRegion.Sort key1:=wsName.Range("B2"), order1:=xlAscending, Header:=xlYes
x = wsName.Range("A1").CurrentRegion.Value
For i = 2 To UBound(x, 1)
LName = x(i, 2)
FName = x(i, 3)
MName = x(i, 4)
If Application.CountIf(wsEmp.Columns(1), x(i, 1)) > 0 Then
er = Application.Match(x(i, 1), wsEmp.Columns(1), 0)
hireDate = wsEmp.Cells(er, 2)
Salary = wsEmp.Cells(er, 6)
If Application.CountIf(wsTraining.Columns(1), x(i, 1)) > 0 Then
tr = Application.Match(x(i, 1), wsTraining.Columns(1), 0)
n = Application.CountIf(wsTraining.Columns(1), x(i, 1))
ReDim y(1 To n, 1 To 8)
j = 0
z = wsTraining.Range("A1").CurrentRegion.Value
For k = 2 To UBound(z, 1)
If z(k, 1) = x(i, 1) Then
j = j + 1
y(1, 1) = LName
y(1, 2) = FName
y(1, 3) = MName
y(1, 4) = hireDate
y(1, 5) = Salary
y(j, 6) = z(i, 2)
y(j, 7) = z(i, 3)
y(j, 8) = z(i, 5)
End If
Next k
dlr = wsReport.Cells.Find("*", SearchOrder:=xlByRows, SearchDirection:=xlPrevious).Row
If dlr = 4 Then
dlr = 5
Else
dlr = dlr + 2
End If
wsReport.Range("A" & dlr).Resize(UBound(y), 8) = y
n = 0
Else
ReDim y(1 To 1, 1 To 5)
y(1, 1) = LName
y(1, 2) = FName
y(1, 3) = MName
y(1, 4) = hireDate
y(1, 5) = Salary
End If
End If
Next i
Application.ScreenUpdating = True
End Sub
Obtained from the OzGrid Help Forum.
Solution provided by sktneer.
See also: Index to Excel VBA Code and Index to Excel Freebies and Lesson 1 - Excel Fundamentals and Index to how to… providing a range of solutions and Index to new resources and reference sheets
See also:
| How to create new workbook by copying rows from multiple sheets based on value in column A |
| How to use a Macro to copy rows from multiple worksheets based on a cell value greater than zero |
| How to read only open an excel workbook (multiple users simultaneously) |
| How to extract multiple emails separated with semicolon and brackets |
Click here to visit our Free 24/7 Excel/VBA Help Forum where there are thousands of posts you can get information from, or you can join the Forum and post your own questions.