Giúp em lấy 1 dòng trong sheet này đưa vào sheet khác với ạ!

Liên hệ QC

271giaiphapexcel

Thành viên mới
Tham gia
30/3/10
Bài viết
17
Được thích
3
Tình hình rất ư là tình hình:!$@!!!$@!!

Số là bây giờ em cần lấy dòng tô màu xanh trong các sheet: "CTy A", "CTy B", "CTy C" (hoặc sheet "CTy A+B+C")để đưa vào trong sheet "Tổng hợp" nhưng bây giờ không biết phải link, lọc như thế nào cho ưu việt ạ.

Em chừa vài dòng ở mỗi sheet để phòng khi có thêm nhân viên mới thì mình thêm vô, nhân viên nghỉ thì mình delete.

Các bác tư vấn cho em xem có nên: làm duy nhất 1 sheet "CTy A+B+C" hay ta tách riêng từng sheet "CTy A", "CTy B", "CTy C"?

Em thử tách riêng từng sheet thì dung lượng file lên hơn 32MB lận (vì có tới gần 86 công ty lận, ở đây em chỉ làm nháp 3 Cty thôi).

Công thức trong mỗi cell em làm vậy có được không ạ, có cách nào hay hơn không? vì em làm nhưng vẫn thấy nó cứ thủ công sao đó ạ ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;, nhất là nếu em làm trong sheet "CTy A+B+C" thì cứ mỗi lần qua CTy khác thì em lại phải copy công thức lại (86 cty nên hơi ngán).!$@!!!$@!!

P/S: em có attach file, mong chờ hồi đáp của các bác ạ.--=0--=0
 

File đính kèm

  • Mẫu.rar
    12.7 KB · Đọc: 32
Chuyện không có gì ầm ĩ!

Macro của bạn đây: (Trong file đính kèm: Fương án 1 trang duy nhất )

PHP:
Option Explicit
Sub TongHop()
 Dim Sh As Worksheet, Rng As Range, sRng As Range, Clls As Range
 Dim Color_ As Byte
 
 Sheet1.Select:               Set Sh = Sheets("CTy A+B+C")
 Set Rng = Sh.Range(Sh.[B5], Sh.[B65500].End(xlUp))
 With [c4].Resize(, 3).Interior
   If .ColorIndex < 34 Or .ColorIndex > 42 Then
      .ColorIndex = 35
   Else
      .ColorIndex = .ColorIndex + 1
   End If
 End With
 For Each Clls In Range([B6], [B9999].End(xlUp))
   Set sRng = Rng.Find(Clls.Value, , xlValues, xlWhole)
   If Not sRng Is Nothing Then
      Clls.Offset(, 1).Resize(, 3).Value = sRng.Offset(, 5).Resize(, 3).Value
      Clls.Offset(, 4).Resize(, 4).Value = sRng.Offset(, 12).Resize(, 4).Value
      Clls.Offset(, 8).Resize(, 2).Value = sRng.Offset(, 18).Resize(, 2).Value
      Clls.Offset(, 10).Resize(, 6).Value = sRng.Offset(, 21).Resize(, 6).Value
   Else
      MsgBox Clls.Value, , "Hay Nhap Du Lieu CTi:"
   End If
 Next Clls
End Sub
 
Lần chỉnh sửa cuối:
Cứ Vlookup làm tới thôi
#NA xí chỗ trước
Nhập dữ liệu vào Cty A+B+C tức khắc cập nhật
Bang.....--> Ctrol+F3 xem name
 

File đính kèm

  • Mẫu.rar
    25.3 KB · Đọc: 35
Macro của bạn đây: (Trong file đính kèm: Fương án 1 trang duy nhất )

PHP:
Option Explicit
Sub TongHop()
Dim Sh As Worksheet, Rng As Range, sRng As Range, Clls As Range
Dim Color_ As Byte

Sheet1.Select: Set Sh = Sheets("CTy A+B+C")
Set Rng = Sh.Range(Sh.[B5], Sh.[B65500].End(xlUp))
With [c4].Resize(, 3).Interior
If .ColorIndex < 34 Or .ColorIndex > 42 Then
.ColorIndex = 35
Else
.ColorIndex = .ColorIndex + 1
End If
End With
For Each Clls In Range([B6], [B9999].End(xlUp))
Set sRng = Rng.Find(Clls.Value, , xlValues, xlWhole)
If Not sRng Is Nothing Then
Clls.Offset(, 1).Resize(, 3).Value = sRng.Offset(, 5).Resize(, 3).Value
Clls.Offset(, 4).Resize(, 4).Value = sRng.Offset(, 12).Resize(, 4).Value
Clls.Offset(, 8).Resize(, 2).Value = sRng.Offset(, 18).Resize(, 2).Value
Clls.Offset(, 10).Resize(, 6).Value = sRng.Offset(, 21).Resize(, 6).Value
Else
MsgBox Clls.Value, , "Hay Nhap Du Lieu CTi:"
End If
Next Clls
End Sub
Bác SA_DQ ơi, sao khi chạy macro tonghop thì
MsgBox Clls.Value, , "Hay Nhap Du Lieu CTi:"
chạy hoài vậy, OK mỏi tay luôn, bác sửa giúp đi.
 
(vì có tới gần 86 công ty lận, ở đây em chỉ làm nháp 3 Cty thôi).

Nhưng để không gặp hộp thoại này, ta chỉ cần đánh dấu nháy đơn vô đầu dòng lệnh là được.

hoặc thay vì Else
ta dùng dòng này
PHP:
  ElseIf Clls.Value = "CTy AZ" Then

Để báo 1 lần duy nhất, nếu công ti này vẫn chưa được nhập liệu

(SPAM 1 chút & chúc vui)
 
Cám ơn bác SA_DQ và bác Tống Văn Đệ nhiều.

Có sự cố kĩ thuật các bác ơi. Em quên là ở mỗi công ty, số lượng nhân viên không phải là mười mấy người, mà là cỡ từ 200 - 500 người lận, nếu làm 1 sheet duy nhất thì nó dài quá, di chuyển lâu lắm ạ (86cty x 500 = 43.000 dòng)!$@!!!$@!!. --> Có cách nào khác không ạ.

Àh, em có thêm 02 vấn đề cần các bác giúp ạ:
- Em dùng Auto filter ở sheet "Cty A+B+C" để xem từng Cty, thì khi bấm vào column "Tên CTy" để chọn xem 1 cty nào đó thì em nó chỉ hiện ra có 1 dòng thôi, còn tên chi nhánh, tên nhân viên thì không hiện --> Chỉ dùm em cách nào để khi chọn xem cty nào thì nó hiện luôn tên chi nhánh, tên nhân viên đầy đủ luôn (dòng nào chừa trống, không có tên ai thì không hiện ra, và kết quả bên sheet "Tổng hợp" vẫn không thay đổi).
- Em có thêm 2 cột: "Ngày vào làm", "Ngày nhận chính thức" được format theo kiểu Date. Mình dùng công thức gì để cứ ai vào làm việc dd/mm/yyyy nào ở cột "Ngày vào làm" thì ở cột "Ngày nhận chính thức" sẽ tự động cộng vào 1 năm (cũng hiển thị theo định dạng dd/mm/yyyy)?
 
(A3 ) Ngày vào làm : 24-06-10
(A4) Ngày nhận chính thức =DATE(YEAR(A3)+1;MONTH(A3);DAY(A3))
 
(1) Là ở mỗi công ty, số nhân viên không phải là mười mấy người, mà là cỡ từ 200 - 500 người lận, nếu làm 1 sheet duy nhất thì nó dài quá, di chuyển lâu lắm ạ (86cty x 500 = 43.000 dòng)!$@!!!$@!!. --> Có cách nào khác không ạ.

Àh, em có thêm 02 vấn đề cần các bác giúp ạ:
(2) - Em dùng Auto filter ở sheet "CtyABC" để xem từng Cty, thì khi bấm vào column "Tên CTy" để chọn xem 1 cty nào đó thì em nó chỉ hiện ra có 1 dòng thôi, còn tên chi nhánh, tên nhân viên thì không hiện --> Chỉ dùm em cách nào để khi chọn xem cty nào thì nó hiện luôn tên chi nhánh, tên nhân viên đầy đủ luôn (dòng nào chừa trống, không có tên ai thì không hiện ra. . .
(3) - Em có thêm 2 cột: "Ngày vào làm", "Ngày nhận chính thức" được format theo kiểu Date. Mình dùng công thức gì để cứ ai vào làm việc dd/mm/yyyy nào ở cột "Ngày vào làm" thì ở cột "Ngày nhận chính thức" sẽ tự động cộng vào 1 năm (cũng hiển thị theo định dạng dd/mm/yyyy)?

(1) Mình giả lập cho bạn (trong file đính kèm) 11 CTi (công ty), mà CTi nào cũng trên 500 NV đó nha;
Kết quả tổng hợp như sau (Đang ghi trên Sheet2)
| NumSheet | Timer |
|9|5.641|
|10|6.843|
|11|8.188|

Mình biếu bạn macro để giả lập tiếp các CTi khác để bạn thử xem sao; Trình tự tiến hành như sau:
(*) Đến trang tính "CTy" & sửa tăng con số tại [A6] lên 1 đơn vị;
(*) Nhấn tổ hợp fím nóng để chạy macro này ({CTRL}+{SHIFT}+M
(*) Sang trang "CSDL, tại các dòng từ 6 đến dòng 532 sẽ có dữ liệu của CTi mới được nạp vô CSDL giả lập này.
Để việc giả lập giống với đời thường hơn, bạn tô chọn vài chục dòng bất kỳ nào mà bạn thích/ghét & bấm nút {Delete} cho nó vô dĩ vãng.
(*) Sau đó bấm {CTRL}+{SHIFT}+T để macro TongHop làm việc.
(*) Tìm đâu đó trên WorkBook số liệu đã ghi lại thời gian

Đây là thử thách lòng kiên nhẫn của bạn; Nhưng mình vẫn chúc bạn đạt thành công như í.

& đây là macro khuyến mãi với bạn:

PHP:
Sub TaoCTMoi()
 Dim eRw As Long, Sh As Worksheet
 
 Sheets("CTy").Select:                          Set Sh = Sheets("CSDL")
 Rows("6:527").Select:                          eRw = Selection.Rows.Count
 Sh.[a6].EntireRow.Resize(eRw + 5).Insert Shift:=xlDown
 Selection.Copy Destination:=Sh.[a6]
 
End Sub

& Xin nhờ bạn 1 việc sau:
Tài nguyên tải file của mỗi NICK là hữu hạn & mình cũng không ngoại lệ.
Vậy nhờ bạn tải file đính kèm trong bài & đưa vô bài cuối topic này của bạn.
Nhưng dủ bạn không giúp được việc này thì sau 36 giờ nữa mình cũng tháo bỏ file nặng nề này, BỐ CÁO!
 

File đính kèm

  • GPE.rar
    952.2 KB · Đọc: 28
Lần chỉnh sửa cuối:
Em đã tải file về rồi bác SA_DQ.
"tải file đính kèm trong bài & đưa vô bài cuối topic này của bạn." làm như thế nào bác, em mới tham gia diễn đàn nên kô biết, bác chỉ cho em với nhé, và mục đích của việc này để làm gì ạ?:-=

Cũng file như trên, nhưng vấn đề là các cty sáp nhập lại thành tổng công ty (Ví dụ: Cty D, Cty E sáp nhập với Cty A và lấy tên là Cty A; Cty B sáp nhập với Cty C và lấy tên là Cty C).
Khi đó, bên sheet "Tổng hợp" mình phải dùng công thức gì để máy hiểu là đã được sát nhập?
Tức là: ở dòng cty D, Cty E sẽ trống, còn dòng cty A sẽ được tổng của A, D và E.
ở dòng cty B sẽ trống, còn dòng cty C sẽ được tổng của B và C.

P/S: mong chờ sự giúp đỡ của các bác (vì vấn đề sáp nhập này mới là vấn đề chính của em hổm rày).
@SA_DQ: bác có thể chỉ cho em cách nào không dùng macro được không ạ. Em thấy file chạy nhưng không hiểu nó chạy ntn (vì em chưa được học gì về macro cả):''"
@Tống Văn Đệ: trong file em gởi kèm hôm nay, em đã điền đầy đủ tên cty, tên chi nhánh, ứng với tên từng nhân viên. Em xin hỏi là: công thức nó chạy ntn mà máy vẫn hiểu là chỉ lấy dòng em tô màu xanh, mấy dòng còn lại thì không lấy (đây đúng ý em rồi, nhưng em nhờ bác giải thích dùm ạ, vì em thấy công thức được dò theo STT (em đánh hết STT vào lun) nhưng sao nó chỉ lấy dòng màu xanh).
Em có kèm theo file ạ (file 22,8 KB mới đúng các bác ạ).
 

File đính kèm

  • Mẫu.rar
    22 KB · Đọc: 2
  • Mẫu.rar
    22.8 KB · Đọc: 6
Lần chỉnh sửa cuối:
Vấn đề bạn nên quan tâm trước tiên hiện này là chọn giải fáp nào, VBA hay công thức

Sao mình fải ngắt mạch công việc chúng ta làm vậy?
Vì dữ liệu của bạn là tương đối lớn. Nên trước tiên fải quan tâm đến tốc độ của quá trình tính toán.

Như xài fương thức macro mình đã dẫn ra kết quả của 11 CTi, mỗi CTi >500 người thì mất khoảng 8,2 gy. (Thêm 1 CTi mất thêm khoảng 2gy trở lên) như vậy số liệu đủ sẽ tổn hao của bạn ~ 30 fút. Bạn thử với cách dùng công thức xem sẽ mất bao nhiêu thời gian.
Thời gian tốn hao không fải tăng 1 cấp số cộng mà có thể là cấp số nhân.

Vì bọn này chưa có dữ liệu thật, nên tính toán trên về thời gian là ước lệ; Chỉ có bạn mới thấy số thật mà thôi.

Nói vậy để bạn nhanh chóng chọn ngay fương án thích hợp.

Mọi cái xác nhập hay gì, gì đó chưa quan trọng bằng cái ni đâu!

Hãy giả lập file
(A) 1/3 số người trong Tổng CTi
(B) 1/2 Số người TCTi
& chạy thử bằng 2 cách để chọn hướng nào ít tốn thời gian nhất cho bạn. (Coi như đây là hướng chiến lược)

Còn các câu của bạn mình chưa trả lời vì chúng chỉ là chiến thuật & không fải không có cách giải.

Thân ái! }}}}}
 
Lần chỉnh sửa cuối:
Cám ơn bác SA_DQ.}}}}}
Tình hình là tuần sau em phải nộp bản thống kê rồi (chỉ còn 02 ngày để làm thôi, hu...hu...)

Công thức thì em bỏm bẻm có thể xử lí được, còn VBA thực tình là em chưa học, nếu xài VBA lỡ có gì trục trặc mà em kô xử lí được thì sếp giết em chít (Sếp em cũng biết vi tính nên sẽ hỏi file chạy ntn, diễn giải ra cho sếp biết, đúng thì sếp mới duyệt ạ ---> khổ lắm.........bác ạ-\\/., ổng mà hông duyệt thì tháng này em đói ạ:.,:.,).

Các bác giúp dùm em cái vụ Sáp nhập Cty thành tổng CTy với ạ (dùng công thức í). Em hứa sau cái vụ này em sẽ xách cặp đi học thêm 1 khóa về VBA ạ.--=0--=0

Giúp em lẹ lẹ với.......Em cám ơn trước ạ.
 
Khoảng công thức thì có khi mình còn thua cả bạn nữa ấy chứ!

Còn theo hướng VBA thì có trong 'DS CTy' (Có nghĩa có trong 'Tổng hợp' thì sẽ được liệt kê nếu có dòng tổng như vậy bên CSDL. (Cái mình đang nói là file của mình đó nha.)

Mà bạn hãy cho biết TgCTi bạn bao nhiêu người trong DS đó vậy?.

(*) Góp ý nho nhỏ:
Tên trang tính không nên xài tiếng Việt (có dấu) & không nên có khoảng trắng.
Chỉ tổ mất thêm thời gian thôi. Ví dụ 'TongHop' hay 'THop' cũng trực quan như thường.
(Đừng sợ Sếp bạn thắc mắc; Mà có théc méc, thì có khối cách trả lời lẫn lãi.)

& Hãy kêu gọi lòng hão tâm của các siêu công thức.

Chúc vui!
(SPAM 1 tẹo).
 
Thêm 1 lựa chọn cho bạn: Hàm mảng tự tạo

PHP:
Option Explicit:        Option Base 1
Function TongHopSL(CTi As Range, Optional Num As Byte = 15)
 'Num=3: Tong/Nam/Nu:               Num=4 : Do Tuoi'
 'Num=2:Van Hoa:                    Num=6: Hoc Vi'
 ReDim MDL(1, Num) As Integer
 Dim Rng As Range, sRng As Range, Sh As Worksheet
 
 Set Sh = Sheets("CSDL")
 Set Rng = Sh.Range("B5:B" & Sh.[F65500].End(xlUp).Row)
 Set sRng = Rng.Find(CTi.Value, , xlValues, xlWhole)
 If Not sRng Is Nothing Then
   Select Case Num
   Case 3
      MDL(1, 1) = sRng.Offset(, 5).Value
      MDL(1, 2) = sRng.Offset(, 6).Value
      MDL(1, 3) = sRng.Offset(, 7).Value
   Case 4
      MDL(1, 1) = sRng.Offset(, 12).Value
      MDL(1, 2) = sRng.Offset(, 13).Value
      MDL(1, 3) = sRng.Offset(, 14).Value
      MDL(1, 4) = sRng.Offset(, 15).Value
   Case 2
      MDL(1, 1) = sRng.Offset(, 18).Value
      MDL(1, 2) = sRng.Offset(, 19).Value
   
   Case 6
      MDL(1, 1) = sRng.Offset(, 21).Value
      MDL(1, 2) = sRng.Offset(, 22).Value
      MDL(1, 3) = sRng.Offset(, 23).Value
      MDL(1, 4) = sRng.Offset(, 24).Value
      MDL(1, 5) = sRng.Offset(, 25).Value
      MDL(1, 6) = sRng.Offset(, 26).Value
   End Select
 End If
 TongHopSL = MDL
End Function


(+) Không quan trọng về tốc độ
(-) Xem thêm trong vùng dưới dòng 18 của trang 'TongHop'

(+) Quan trọng là thuyết fục Sếp của bạn.

(+) Mình nghĩ có thể viết 1 hàm trả về 15 kết quả 1 lần luôn. Nhưng sẽ đợi í bạn.
 

File đính kèm

  • GPE.rar
    934.5 KB · Đọc: 10
Web KT

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

Back
Top Bottom