win-sun
Thành viên hoạt động
- Tham gia
- 19/1/09
- Bài viết
- 151
- Được thích
- 15
Option Explicit
Sub DSDNTu2Trang()
Dim jJ, eRw As Long: Dim Ten As String
Dim Sh As Worksheet, Sh0 As Worksheet, Rng As Range
Application.ScreenUpdating = False
Set Sh0 = Sheets("NXT-Du tru")
Sh0.Columns("A:A").Insert Shift:=xlToRight
For jJ = 1 To 2
Set Sh = Sheets(IIf(jJ = 1, "VP", "NM"))
eRw = Sh.[c65500].End(xlUp).Row
Sh.Columns("A:A").Insert Shift:=xlToRight
Sh.[a1] = Sh.[d1].Value
Sh.Range("D1:D" & eRw).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=Sh.[a1], Unique:=True
Sh.[a1].Resize(eRw).Offset(jJ - 1).Copy Destination:=Sh0.[a65500].End(xlUp).Offset(1)
Sh.Columns("A:A").Delete Shift:=xlToLeft
Next jJ
Sh0.Range("A2:A" & Sh0.[a65500].End(xlUp).Row).AdvancedFilter Action:=xlFilterCopy, _
CopyToRange:=Sh0.[d9], Unique:=True
Sh0.Columns("A:A").Delete Shift:=xlToLeft
End Sub
Option Explicit: Dim Clls As Range
Sub CopyValues()
Dim eRw As Long, lRw As Long
Dim Sh1 As Worksheet, Sh2 As Worksheet, Rng1 As Range, Rng2 As Range
Dim Rng8 As Range, Rng9 As Range, Rng5 As Range
Sheets("NXT-Du tru").Select: Application.ScreenUpdating = False
eRw = Sheets("VP").[c65500].End(xlUp).Row
lRw = Sheets("NM").[c65500].End(xlUp).Row
If eRw > lRw Then
Set Sh1 = Sheets("VP"): Set Sh2 = Sheets("NM")
Else
Set Sh1 = Sheets("NM"): Set Sh2 = Sheets("VP")
End If
Set Rng1 = Sh1.Range(Sh1.[c1], Sh1.[c65500].End(xlUp))
Set Rng2 = Sh2.Range(Sh2.[c1], Sh2.[c65500].End(xlUp))
For Each Clls In Range([C10], [c65500].End(xlUp))
Set Rng8 = Rng1.Find(Clls.Value, , xlFormulas, xlWhole)
If Not Rng8 Is Nothing Then
DienTri Rng8
Else
Clls.Interior.ColorIndex = 35
Set Rng9 = Rng2.Find(Clls.Value)
If Not Rng9 Is Nothing Then
DienTri Rng9
End If
End If
Next Clls
Set Clls = Nothing
End Sub
Sub DienTri(Rng As Range)
Clls.Offset(, -1).Value = Rng.Offset(, -1).Value
Clls.Offset(, 1).Value = Rng.Offset(, 1).Value
Clls.Offset(, 2).Value = Rng.Offset(, 2).Value
Clls.Offset(, 3).Value = Rng.Offset(, 3).Value
End Sub
Cảm ơn Bác SA_DQ thật nhiều
Dường như có trục trặc gì đó bac, macro chạy nhưng không gán được giá trị, khi nào rảnh bác xem giúp em nhé!
Vâng em thử lại thấy được rồi, nhưng minh gôm thành một macro thôi được không bác, để nhấn nút một cái là xong, cảm ơn bác
Option Explicit
Sub CopyAllValues()
Dim jJ As Byte, lRw As Long, Timer_ As Double
Dim Sh As Worksheet, Rng As Range, sRng As Range, Clls As Range
Sheets("Temp").Select: Cells.Clear
Application.ScreenUpdating = False: Timer_ = Timer
For jJ = 0 To 1
Set Sh = Sheets(IIf(jJ = 0, "VP", "NM"))
lRw = Sh.[c65500].End(xlUp).Row + 1
With [A65500].End(xlUp).Offset(1)
.Resize(lRw, 5).Value = Sh.[B1].Offset(jJ).Resize(lRw, 5).Value
End With
Next jJ
Rows("1:1").Delete Shift:=xlUp
[g1].Resize(, 5).Value = [A1].Resize(, 5).Value
Columns("B:B").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=[H1], Unique:=True
Set Rng = Range([B1], [B1].End(xlDown))
For Each Clls In Range([H2], [H2].End(xlDown))
Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole)
If Not sRng Is Nothing Then _
Clls.Offset(, -1).Resize(, 5).Value = sRng.Offset(, -1).Resize(, 5).Value
Next Clls
[g1].CurrentRegion.Offset(1).Copy Destination:=Sheets("NXT-Du tru").[B10]
9 MsgBox Timer - Timer_
End Sub
Sư phụ ơi, em thấy vòng lập For... Next thứ 2 của sư phụ là thừa ---> đã Advanced Filter thì đâu cần thêm vòng lập chứ?(1) Tạo 1 trang tạm thời có tên là Temp
(2) Chạy macro sau & thời gian chỉ tốn khoảng 1/5 so với chạy 2 macro lần lượt nêu trên.
Sau 1 thời gian thử nghiệm & ổn định, ta có thể vô hiệu hóa dòng lệnh mang số 9 kia đi.PHP:Option Explicit Sub CopyAllValues() Dim jJ As Byte, lRw As Long, Timer_ As Double Dim Sh As Worksheet, Rng As Range, sRng As Range, Clls As Range Sheets("Temp").Select: Cells.Clear Application.ScreenUpdating = False: Timer_ = Timer For jJ = 0 To 1 Set Sh = Sheets(IIf(jJ = 0, "VP", "NM")) lRw = Sh.[c65500].End(xlUp).Row + 1 With [A65500].End(xlUp).Offset(1) .Resize(lRw, 5).Value = Sh.[B1].Offset(jJ).Resize(lRw, 5).Value End With Next jJ Rows("1:1").Delete Shift:=xlUp [g1].Resize(, 5).Value = [A1].Resize(, 5).Value Columns("B:B").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=[H1], Unique:=True Set Rng = Range([B1], [B1].End(xlDown)) For Each Clls In Range([H2], [H2].End(xlDown)) Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole) If Not sRng Is Nothing Then _ Clls.Offset(, -1).Resize(, 5).Value = sRng.Offset(, -1).Resize(, 5).Value Next Clls [g1].CurrentRegion.Offset(1).Copy Destination:=Sheets("NXT-Du tru").[B10] 9 MsgBox Timer - Timer_ End Sub
Sub CopyAllValues2()
Dim jJ As Byte, lRw As Long, Timer_ As Double, Temp As Worksheet
Dim Sh As Worksheet, Rng As Range, sRng As Range, Clls As Range
Application.ScreenUpdating = False: Timer_ = Timer
Set Temp = Sheets.Add(After:=Sheets(Sheets.Count))
For jJ = 0 To 1
Set Sh = Sheets(IIf(jJ = 0, "VP", "NM"))
lRw = Sh.[c65500].End(xlUp).Row + 1
With Temp.[A65500].End(xlUp).Offset(1)
.Resize(lRw, 5).Value = Sh.[B1].Offset(jJ).Resize(lRw, 5).Value
End With
Next jJ
With Temp.Range(Temp.[A2], Temp.[A65536].End(xlUp)).Resize(, 5)
.Resize(, 1).Offset(, 1).AdvancedFilter 1, , , True
.SpecialCells(12).Copy: Sheets("NXT-Du tru").[B9].PasteSpecial 3
End With
Application.DisplayAlerts = False
Temp.Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
9 MsgBox Timer - Timer_
End Sub
- Xóa các Mã cũ ở sheet NXT: Sheets("NXT-Du tru").Range("B9:F10000").ClearContents (đặt ở dưới dòng Application.ScreenUpdating = False)Cảm ơn thầy nhiều!
thầy có thể xóa các mã cũ ở sh NXT trước khi gán giá trị vào được không thầy,
khi mở rộng thêm 2 sh nữa thì có ảnh hưởng gì lớn không thầy!
Vẫn chưa hiểu!Em muốn tính NXT và dự trù thuốc thêm cho 3 chi nhánh nữa đó thầy
Vậy có nghĩa là có bao nhiêu sheet thì sẽ tổng hợp toàn bộ vào sheet NXT-Du tru, đúng không?Em thêm 3 sh vào nữa HN, CT, DN giống như VP và NM hiện có vậy. mục đích cũng là lọc mã thuốc duy nhất, còn phần tính toán em dùng công thức là được rồi, em cảm ơn
Sub CopyAllValues2()
Dim Temp As Worksheet, Sh As Worksheet
Application.ScreenUpdating = False
Sheets("NXT-Du tru").Range("B9:F10000").ClearContents
Set Temp = Sheets.Add(After:=Sheets(Sheets.Count))
Temp.Range("A1:E1").Value = Evaluate("Title")
For Each Sh In ThisWorkbook.Worksheets
If Sh.Name <> "NXT-Du tru" And Sh.Name <> Temp.Name Then
With Sh.Range(Sh.[B2], Sh.[B65536].End(xlUp)).Resize(, 5)
Temp.Range("A65536").End(xlUp).Offset(1).Resize(.Rows.Count, 5).Value = .Value
End With
End If
Next Sh
With Temp.Range(Temp.[A1], Temp.[A65536].End(xlUp)).Resize(, 5)
.Resize(, 1).Offset(, 1).AdvancedFilter 1, , , True
.SpecialCells(12).Copy: Sheets("NXT-Du tru").[B9].PasteSpecial 3
End With
Application.DisplayAlerts = False
Temp.Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
Sub CopyAllValues2()
Dim Temp As Worksheet, Sh As Worksheet
Application.ScreenUpdating = False
Sheets("NXT-Du tru").Range("B10:F10000").ClearContents
Set Temp = Sheets.Add(After:=Sheets(Sheets.Count))
Temp.Range("A1:E1").Value = Evaluate("Title")
For Each Sh In ThisWorkbook.Worksheets
If Sh.Name <> "NXT-Du tru" And Sh.Name <> Temp.Name Then
With Sh.Range(Sh.[B2], Sh.[B65536].End(xlUp)).Resize(, 5)
Temp.Range("A65536").End(xlUp).Offset(1).Resize(.Rows.Count, 5).Value = .Value
End With
End If
Next Sh
With Temp.Range(Temp.[A1], Temp.[A65536].End(xlUp)).Resize(, 5)
.Resize(, 1).Offset(, 1).AdvancedFilter 1, , , True
Intersect(.Cells, .Offset(1)).SpecialCells(12).Copy
Sheets("NXT-Du tru").[B10].PasteSpecial 3
End With
Application.DisplayAlerts = False
Temp.Delete
Application.DisplayAlerts = True
Application.ScreenUpdating = True
End Sub
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 1
DIỄN ĐÀN GIẢI PHÁP EXCEL Group 2