Giúp em Code VB để thay thế các hàm trên các cột (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

tiendo1988

Thành viên chính thức
Tham gia
6/8/09
Bài viết
82
Được thích
11
Rất mong các Thầy, các Pro cùng các AE GPE giúp em code xử lý dữ liệu thay thế cho hàm em đang sử dụng trên các cột.
Em đã mô tả trong file đính kèm.
Giúp em code VB trong 2 Sheet: LTMOI1, NienHanQMT
Các cột trong sheet "LTMOI1" lấy dữ liệu từ NHẬT KÝ ĐIỀU CHỈNH, THAY ĐỔI LỊCH TRỰC, QUÂN SỐ TẠI CÁC MỤC TIÊU THEO YÊU CẦU CỦA KH HOẶC BGĐ trong Sheet "MT"

Nếu có gì chưa hiểu ý em muốn nhờ giúp đỡ thì P/M lại cho em, em sẽ ghi chú rõ hơn.

Em rất mong nhận được sự giúp đỡ trong thời gian sớm nhất.

Xin chân thành cảm ơn!

chúc toàn thể các anh em GPE và khách của GPE kỳ nghỉ 30/4, 1/5 vui!
 

File đính kèm

Lần chỉnh sửa cuối:
Chào bạn !
Mình đã xem file của bạn thiết kế. Mình góp ý với bạn như thế này:
- Ý tưởng của bạn thay VBA cho các hàm ở các cột là tốt nhưng khối lượng sẽ rất lớn, chỉ dân IT chính hiệu mới đủ sức giải quyết.
- Bạn nên tận dụng công cụ của excel để giải quyết. Mình nghĩ, bạn nên thiết kế sheet chitiet để ghi chép, cập nhật tât cả vào sheet đó. Sau đó bạn dùng pivotable kết hợp với VBA để tạo ra các báo cáo. Pivottable sẽ tạo ra các báo cáo có khả năng tùy biến cao.
Nếu bạn đồng ý với đề suất này thì mình sẽ giúp đỡ bạn. Liên hệ với mình theo địa chỉ: long_ltl@yahoo.com
Chào bạn !
 
Trước tiên mình cám ơn bạn đã dành thời gian cho topic của mình.
mình thì ko hiểu gì về VBA song mình copy một số đoạn code của các anh em trên mạng.
Do mình thất trên một Workbook, trong các sheet nếu ta sử dụng công thức trong cột của các sheet, nếu dữ liệu nhiều ta sẽ thất dung lượng file lớn lên nhanh, file xử lý chậm... vì vậy tôi muốn nhờ các AE giúp tôi code để xử lý thay cho các hàm mình gõ vào các cells để file xử lý nhanh và nhẹ.
Trân trọng cảm ơn!
 
Được cái nào xào cái nấy!

Dưới đây là 2 macro thay cho 2 hàm tự tạo MaxIf() & FindTwoCondition() của bạn

PHP:
Sub NgàyAD()
 Dim WF As Object, Sh As Worksheet, Rng As Range, Cls As Range, sRng As Range
 Dim Ngay As Date, Ng0 As Date, MyAdd As String
 
 Set Sh = ThisWorkbook.Worksheets("MT")
 Set Rng = Sh.Range(Sh.[o4], Sh.[o5].End(xlDown))
 Set WF = Application.WorksheetFunction
 Ngay = WF.Min(Rng.Offset(, 2)):                    Sheets("LTMOI1").Select
 For Each Cls In Range([B6], [B6].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        Cls.Offset(, 1).Value = Ngay
    Else
        Ng0 = Ngay:                                 MyAdd = sRng.Address
        Do
            With sRng.Offset(, 2)
                If .Value > Ng0 Then Ng0 = .Value
            End With
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
        Cls.Offset(, 1).Value = IIf(Ngay < Ng0, Ng0, Ngay)
    End If
 Next Cls
End Sub

PHP:
Sub QuanSo()
 Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range
 Const Kh As String = "-":                          Dim MyAdd As String
 
 Set Sh = ThisWorkbook.Worksheets("MT"):            Sheets("LTMOI1").Select
 Set Rng = Sh.Range(Sh.[o4], Sh.[o5].End(xlDown))
 For Each Cls In Range([B6], [B6].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        Cls.Offset(, 2).Value = Kh
    Else
        MyAdd = sRng.Address
        Do
            If Cls.Offset(, 1).Value = sRng.Offset(, 2).Value Then _
                Cls.Offset(, 2).Value = sRng.Offset(, 5).Value
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
 Next Cls
End Sub

Bạn kiểm xem sao, nha!
 
Macro con mang hai dòng máu của cha & mẹ

PHP:
Sub NgàyHD()
 gpeNgay 2
End Sub
PHP:
Sub NgàyCT()
 gpeNgay 7
End Sub

Mã:
[B]Sub gpeNgay(Offs As Byte)[/B]
 Dim WF As Object, Sh As Worksheet, Cls As Range, sRng As Range, Rng As Range
 Dim Ngay As Date, Ng0 As Date, MyAdd As String
 
 Set Sh = ThisWorkbook.Worksheets("MT")
 Set Rng = Sh.Range(Sh.[o4], Sh.[o5].End(xlDown))
 Sheets("LTMOI1").Select
 Set WF = Application.WorksheetFunction
 Ngay = WF.Min(Rng.Offset(, Offs))
 For Each Cls In Range([B6], [B6].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        Cls.Offset(, (Offs + 1) \ 2).Value = Ngay
    Else
        Ng0 = Ngay:                                 MyAdd = sRng.Address
        Do
            With sRng.Offset(, Offs)
                If .Value > Ng0 Then Ng0 = .Value
            End With
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
        Cls.Offset(, (Offs + 1) \ 2).Value = IIf(Ngay < Ng0, Ng0, Ngay)
    End If
 Next Cls
[B]End Sub[/B]
 
Dưới đây là 2 macro thay cho 2 hàm tự tạo MaxIf() & FindTwoCondition() của bạn

PHP:
Sub NgàyAD()
 Dim WF As Object, Sh As Worksheet, Rng As Range, Cls As Range, sRng As Range
 Dim Ngay As Date, Ng0 As Date, MyAdd As String
 
 Set Sh = ThisWorkbook.Worksheets("MT")
 Set Rng = Sh.Range(Sh.[o4], Sh.[o5].End(xlDown))
 Set WF = Application.WorksheetFunction
 Ngay = WF.Min(Rng.Offset(, 2)):                    Sheets("LTMOI1").Select
 For Each Cls In Range([B6], [B6].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        Cls.Offset(, 1).Value = Ngay
    Else
        Ng0 = Ngay:                                 MyAdd = sRng.Address
        Do
            With sRng.Offset(, 2)
                If .Value > Ng0 Then Ng0 = .Value
            End With
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
        Cls.Offset(, 1).Value = IIf(Ngay < Ng0, Ng0, Ngay)
    End If
 Next Cls
End Sub

PHP:
Sub QuanSo()
 Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range
 Const Kh As String = "-":                          Dim MyAdd As String
 
 Set Sh = ThisWorkbook.Worksheets("MT"):            Sheets("LTMOI1").Select
 Set Rng = Sh.Range(Sh.[o4], Sh.[o5].End(xlDown))
 For Each Cls In Range([B6], [B6].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        Cls.Offset(, 2).Value = Kh
    Else
        MyAdd = sRng.Address
        Do
            If Cls.Offset(, 1).Value = sRng.Offset(, 2).Value Then _
                Cls.Offset(, 2).Value = sRng.Offset(, 5).Value
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
 Next Cls
End Sub

Bạn kiểm xem sao, nha!

Mình cám ơn bạn đã giúp đỡ.
Ban Cho mình hỏi: 2 đoạn code trên mình đưa vào Sheet hay đưa vào Module để thay 2 hàm tự tạo của minh? và cách dùng của Macro như thế nào?
 
Macro cùa HYen17 sẽ fải sửa lại, bạn chờ nha!

Ban Cho hỏi: (1) 2 đoạn code trên mình đưa vào Sheet hay đưa vào Module để thay 2 hàm tự tạo của minh? (2) & cách dùng của Macro như thế nào?

(1) Bạn đưa vô Module cho chắc ăn;

(2) Bạn chạy lần lượt các macro cha & mẹ;
Thật ra cũng có thể gộp chung cha & mẹ này vô làm 1, như

PHP:
Sub GPE()
     gpeNgay 2
     gpeNgay 7
End Sub

(Bạn thấy đó: Gộp thì mất đi 1 fần tự do!)
 
Lần chỉnh sửa cuối:
PHP:
Sub NgàyHD()
 gpeNgay 2
End Sub
PHP:
Sub NgàyCT()
 gpeNgay 7
End Sub

Mã:
[B]Sub gpeNgay(Offs As Byte)[/B]
 Dim WF As Object, Sh As Worksheet, Cls As Range, sRng As Range, Rng As Range
 Dim Ngay As Date, Ng0 As Date, MyAdd As String
 
 Set Sh = ThisWorkbook.Worksheets("MT")
 Set Rng = Sh.Range(Sh.[o4], Sh.[o5].End(xlDown))
 Sheets("LTMOI1").Select
 Set WF = Application.WorksheetFunction
 Ngay = WF.Min(Rng.Offset(, Offs))
 For Each Cls In Range([B6], [B6].End(xlDown))
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If sRng Is Nothing Then
        Cls.Offset(, (Offs + 1) \ 2).Value = Ngay
    Else
        Ng0 = Ngay:                                 MyAdd = sRng.Address
        Do
            With sRng.Offset(, Offs)
                If .Value > Ng0 Then Ng0 = .Value
            End With
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
        Cls.Offset(, (Offs + 1) \ 2).Value = IIf(Ngay < Ng0, Ng0, Ngay)
    End If
 Next Cls
[B]End Sub[/B]


Cám ơn bác!
Bác hướng dẫn giúp em đoạn code của bác đưa vào đâu? sử dụng đoạn code trên thế nào?
Nếu em không nhầm thì đoạn code trên dùng cho Sheet "LTmoi1"?
Xin cảm ơn,
 
Các bác cho em hỏi: đoạn code của SA_DQ và của HYen17HYen1 đưa vào file như thế nào? em đưa cả 2 đoạn code của HYen17 vào một Module mà không thấy có kết quả gì bên bảng tính cả?
Nhờ các bác hướng dẫn thêm!
xin cảm ơn.
 
Bạn xem trong file đính kèm

Hao tài nguyên với bạn, & vui nhe!


(Sẽ tháo file xuống, 1 khi bạn nhấn 'Thanks' hay đã download)
 
Lần chỉnh sửa cuối:
cám ơn bác SA_DQ, em đã tải về, sau khi em thử dữ liệu, thy đổi một thông tin để kiểm tra thì em thấy có một số điểm như sau:
ở sheet "LTMoi1" cột B (cột Mục Tiêu) rỗng, không có dữ liệu thì ở các cột bên vẫn có thông tin.... làm sao để khắc phục, để khi cột B rỗng thì các cột bên cũng rỗng.
thức 2: vẫn ở sheet "LTMOI1", khi em thay đổi lấy ngày ở phần "nhật ký điều chỉnh, thay đổi lịch trưc..." thi ngày thay đổi chưa được cập nhật.
Em phải sửa code trên như thế nào để có thể khắc phục được ạ?


Ở Sheet "NienHanQMT" trong file của em có phần ngày về mục tiêu lấy dữ liệu từ cột "ngày" bên sheet "NKDieuQuan", yêu cầu gần giống với phần ngày AD của bên Sheet "LTMOI1", các bác xem và cho em xin code.

Xin cảm ơn các Bác đã quan tâm và giúp đỡ.
 
Sau khi em thử dữ liệu, thay một thông tin để kiểm tra thì em thấy có một số điểm như sau:
(1) ở sheet "LTMoi1" cột B (cột Mục Tiêu) rỗng, không có dữ liệu thì ở các cột bên vẫn có thông tin.... làm sao để khắc phục, để khi cột B rỗng thì các cột bên cũng rỗng.

thứ (2): Vẫn ở sheet "LTMOI1", khi em thay đổi lấy ngày ở phần "nhật ký điều chỉnh, thay đổi lịch trưc..." thi ngày thay đổi chưa được cập nhật.
Em phải sửa code trên như thế nào để có thể khắc phục được ạ?

(3) Ở Sheet "NienHanQMT" trong file của em có phần ngày về mục tiêu lấy dữ liệu từ cột "ngày" bên sheet "NKDieuQuan", yêu cầu gần giống với phần ngày AD của bên Sheet "LTMOI1", các bác xem và cho em xin code.

(1) Ở đây có 2 vấn đề bạn cần lưu í:
(*) Có thể bạn sửa lại hàm trong cột 'B' này, để khi không tìm thấy dữ liệu, hàm sẽ trả về chuỗi rỗng;
(*) Mình đã gộp 3 macro mà bạn đang quan tâm vô làm một, như dưới đây, Bạn copy nó & cho chạy thử xem sao, nha!
Trong đó iêu cầu 1 của bạn đã được thực hiện bằng dòng lệnh có mũi tên

PHP:
Sub gpeNgay_()
 Dim WF As Object, Sh As Worksheet, Cls As Range, sRng As Range, Rng As Range
 Dim Ngay As Date, Ng0 As Date, Offs As Byte
 Dim MyAdd As String
 
 Set Sh = ThisWorkbook.Worksheets("MT"):            Sheets("LTMOI1").Select
 Set Rng = Sh.Range(Sh.[o4], Sh.[o5].End(xlDown))
 Set WF = Application.WorksheetFunction
 For Offs = 2 To 8 Step 5
    Ngay = WF.Min(Rng.Offset(, Offs))
    For Each Cls In Range([B6], [B6].End(xlDown))
        If Cls.Value = "" Then Exit For             '<=|'
        Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
        If sRng Is Nothing Then
            Cls.Offset(, (Offs + 1) \ 2).Value = Ngay
        Else
            Ng0 = Ngay:                             MyAdd = sRng.Address
            Do
                With sRng.Offset(, Offs)
                    If .Value > Ng0 Then Ng0 = .Value
                End With
                Set sRng = Rng.FindNext(sRng)
            Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
            Cls.Offset(, (Offs + 1) \ 2).Value = IIf(Ngay < Ng0, Ng0, Ngay)
        End If
    Next Cls
 Next Offs
End Sub

(2) Hiện tại chàng 'CHANG HONG' có kết quả tại cột 'C' là #2/15/2012# & cột 'F' là #3/18/2012#;
Ứng với số liệu này, ở trang 'MT' ta có 3 dòng 7..9; Vậy bạn cùng tôi ta thử thêm vô [Q9] ngày #4/30/2012# & tại [V8] à trị #5/1/2012# & chạy macro xem sao!
/(/ếu tại [C7] & [f7] hiện lên các trị tương ứng, nghĩa là bạn mắc thêm tội vu cáo đó nha.

(3) Hãy đợi đấy, trang này chưa đến hồi kết mà, sao sống gấp làm vậy?!
 
Trước hết mình xin cám ơn bạn ChanhTQ,
Mình không hiểu gì nhiều về VB và Macro nên có gì phát biểu hoặc thắc mắc không đúng mong các AE và các bạn bỏ qua và hướng dẫn thêm cho mình (mình ko có ý vu cáo )
Sau khi đọc ý kiến của bạn xong mình xem lại file mò mẫm phần Macro và chọn macro rồi Run thì đoạn code mới có hiệu lực.
Các Bạn cho mình hỏi thêm: Nếu muốn macro tự chạy khi thay đổi dữ liệu bên nhật ký thì ta sửa code thế nào?
 
Đây, xong cho trang tính đầu tiên theo iêu cầu của bạn đó nhe!

Các Bạn cho mình hỏi: Nếu muốn macro tự chạy khi thay đổi dữ liệu bên nhật ký thì ta sửa code thế nào?
Có nhiều cách để chạy 1 macro bất kỳ lúc nào bạn muốn;
Nhưng theo mình bạn nên xài tổ hợp fím tắc đã gán cho macro;
Trong file đính kèm, mình đã gán tổ hợp {CTRL}+{SHIFT}+G để chạy tuần tự 2 macro (& {CTRL}+{SHIFT}+Q để chỉ chạy macro thứ 2 1 cách riêng rẽ.)
Những cách khác để chạy 1 macro, như:

(*) Gắn macro đến 1 nút lệnh;

(*) Macro sự kiện;

(*) . . . .
 

File đính kèm

Bạn chạy macro dưới đây để có kết qủa tại 'H' của trang 'NienHan...'

PHP:
Sub NgayVeMucTieu()
 Dim Sh As Worksheet, Rng As Range, WF As Object, Cls As Range, sRng As Range
 Dim Ngay As Date, Dat As Date, Rws As Long
 Dim MyAdd As String
 
 Set Sh = ThisWorkbook.Worksheets("NKDieuQuan"):    Sheets("NienHanQMT").Select
 Set WF = Application.WorksheetFunction
 Set Rng = Sh.Range(Sh.[E6], Sh.[e7].End(xlDown))
 Ngay = WF.Min(Rng) - 1:                            Set WF = Nothing
1 'Lap Danh Sách Ma Nhan Vien Duy Nhát:'
 Rws = [d12].CurrentRegion.Rows.Count
 [d11].Resize(Rws).AdvancedFilter Action:=xlFilterCopy, CopyToRange:=[BA1], Unique:=True
 Set Rng = Sh.Range(Sh.[B6], Sh.[B7].End(xlDown))
2' Ghi Ngày Dièu Dong Gàn Nhát:'
 For Each Cls In [BA2].CurrentRegion.Offset(1)
    Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
    If Not sRng Is Nothing Then
        MyAdd = sRng.Address
        Do
            With sRng.Offset(, 3)
                If Dat < .Value Then Dat = .Value
            End With
            Set sRng = Rng.FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
    If Dat > Ngay Then
        Cls.Offset(, 1).Value = Dat:                        Dat = Ngay
    End If
 Next Cls
 Set Rng = [d11].Resize(Rws)
3'Ghi Két Qua:' 
 For Each Cls In Range([BA2], [BA2].End(xlDown))
    If Cls.Offset(, 1).Value > Ngay Then
        Set sRng = Rng.Find(Cls.Value, , xlValues)
        If Not sRng Is Nothing Then
            MyAdd = sRng.Address
            Do
                sRng.Offset(, 4).Value = Cls.Offset(, 1).Value
                Set sRng = Rng.FindNext(sRng)
            Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
        End If
    End If
 Next Cls
End Sub
 
Lần chỉnh sửa cuối:
Cám ơn bạn "ChanhTQ" và Bạn "HYen17" đã giúp đỡ mình.
Về cơ bản Sheet "LTMOI1" và cột "Ngày Về Mục Tiêu" ở Sheet "NienHanQMT" đã ổn theo yêu cầu trong bài của mình.
- Em muốn Macro của "ChanhTQ" và Bạn "HYen17" sang chế độ tự chạy khi thay đổi dữ liệu gốc mà không phải qua bước Run Macro hay bấm tổ hợp phím tắt... thì em sử thế nào ạ?
ở Sheet "NienHanQMT":
- cột "tổng ngày làm tại mục tiêu" mình dùng hàm "Datedif", còn cột "thời gian làm tại mục tiêu" hiển thị ở dạng: ...năm ... tháng ... ngày thì mình phải sử dụng tới một số cột phụ và các hàm mới ra. Tuy là về mặt kết quả thì như ý Song với dữ liệu nhiều việc dùng các hàm như vậy mình thấy file chạy chậm và tăng dung lượng.
Các Thầy, các AE GPE, Các PRO nghiên cứu giúp em code để giải quyết yêu cầu ở các cột này.

Xin cảm ơn sự quan tâm, giúp đỡ của các bạn.
Rất mong nhận được sự giúp đỡ của các bạn.
 
Lần chỉnh sửa cuối:
Tính thời gian tại mục tiêu

Trước tiên bạn đến [BB1] của trang tính & gán cho nó 1 cái tên là 'Nam' & nhập dữ liệu vô nó là " năm " (có 2 khoảng trắng nhe!)
(Việc làm này hầu để có Font tiếng Việt)
Sau đó bạn cho chạy macro sau:

PHP:
Sub ThoiGianTaiMucTieu()
 Dim Cls As Range, StrC As String
 Dim Rws As Long, Dat As Date, SoNgay As Integer, SoLg As Integer
 Const KC As String = " "
 
 Sheets("NienHanQMT").Select:                           Dat = [i10].Value
 Rws = [D12].CurrentRegion.Rows.Count
 For Each Cls In Range([H12], [H65500].End(xlUp))
    If Cls.Value <> "" Then
        SoNgay = Dat - Cls.Value
        If SoNgay > 364 Then
            SoLg = Int(SoNgay / 365.25)
            StrC = CStr(SoLg) & Range("Nam")       '<=|'
            SoNgay = Int(SoNgay - SoLg * 365.25)
        End If
        If SoNgay >= 30 Then
            SoLg = Int((SoNgay / 30))
            StrC = StrC & CStr(SoLg) & " tháng "
            SoNgay = (SoNgay - SoLg * 30)
        End If
        StrC = StrC & CStr(SoNgay) & " ngày"
    End If
    Cls.Offset(, 1).Value = StrC:                       StrC = ""
 Next Cls
End Sub

(húc thành công!
 
Cám ơn bác "SA_DQ", em đã làm được cột đó rồi.

Xin gửi lời cám ơn tới toàn thể AE GPE.
Em đang từng bước hoàn thiện file của - một phần công việc quản lý nhân sự ở công ty em. Nếu AE nào có cao kiến gì thì góp ý thêm cho em để ngày một hoàn chỉnh hơn. Em không biết gì về VBA, mà học lỏm được vài đoạn code muốn thay đổi nó để phù hợp với bài của mình thì khi được khi không nên đành phải làm phiền tới các AE.
việc em sử dụng toàn bộ công thức và hàm nhập trực tiếp vào các bảng tính thì dung lượng file tăng lên nhanh quá và tốc độ xử lý dữ liệu ì ạch quá.

rất mong sự giúp đỡ của Các thầy, các Pro, các AE GPE trong thời gian tới.

Xin cảm ơn!
 
các thầy, các Pro cùng AE GPE và anh SA_DQ cho em hỏi:
em sử dụng đoạn code của Anh SA_DQ đưa vào file của em, ở Sheet NienHanQMT và sheet nhật ký điều quân vẫn giữ nguyên như trong file em gửi lên nhờ các bác giúp, chỉ khác là file của em đang làm nhiều Sheet dữ liệu hơn, trong các sheet cũng nhiều dữ liệu hơn, sheet nào cũng vài trăm dòng chứa dữ liệu. nhưng ko hiểu vì sao khi chạy ở file em gửi lên nhờ các AE giúp thì chạy ok, chỉ phải chờ trong giây lát, còn khi em đưa đoạn doce đó vào file của mình thì khi chạy Macro em bị tình trạng: Macro cứ chạy hoài không dừng.
em không hiểu vì sao. em chỉ sửa chút síu code trên" " tháng " và " ngày " thì em chuyển vào range("thang") và Range("ngay") giống với range("nam") vì máy em sài cả tiếng Hoa nên khi để nguyên đoạn code đó thì kết quả bị lỗi font.
Sau khi kiên nhẫn chờ đợi thì mất gần 5 phút Macro được chuyển vào file của em mới chạy xong.
Giúp em tìm nguyên nhân và khắc phục lỗi với ạ.
Xin cảm ơn.
 
Lần chỉnh sửa cuối:
Để có đủ số liệu trên trang tính đó bằng macro, bạn lấy cái này chép đè lên cái cũ

PHP:
Sub ThoiGianTaiMucTieu()
 Dim Cls As Range, StrC As String
 Dim Rws As Long, Dat As Date, SoNgay As Integer, SoLg As Integer
 Const KC As String = " "
 
 Sheets("NienHanQMT").Select:                           Dat = [i10].Value
 Rws = [D12].CurrentRegion.Rows.Count
 For Each Cls In Range([H12], [H65500].End(xlUp))
    If Cls.Value <> "" Then
        SoNgay = Dat - Cls.Value
        If SoNgay > 364 Then
            SoLg = Int(SoNgay / 365.25)
            StrC = CStr(SoLg) & Range("Nam")
            SoNgay = Int(SoNgay - SoLg * 365.25)
        End If
        If SoNgay >= 30 Then
            SoLg = Int((SoNgay / 30))
            StrC = StrC & CStr(SoLg) & " tháng "
            SoNgay = (SoNgay - SoLg * 30)
        End If
        StrC = StrC & CStr(SoNgay) & " ngày"
        Cls.Offset(, 1).Value = StrC:                   StrC = ""    '***'
        Cls.Offset(, 2).Value = Dat - Cls.Value                      '<=|'
    End If
 Next Cls
End Sub
 
Mình đã copy đoạn code của "ChanhTQ@" về chạy thử, mình ko hiểu do file dữ liệu của mình hay vì lý do gì mà khi Run Macro ThoiGianTaiMucTieu thì phải ngồi chờ rất lâu mới có kết quả cuối cùng.
Mình đã thử cả đoạn code của anh SA_DQ, cũng phải ngồi chờ rất lâu.
Mình gửi file của mình đã đưa code vào ở link dưới:


Các bác kiểm tra giúp và cho xin ý kiến đóng góp và giúp đỡ.
file của mình đang trong qus trình xây dựng ý tưởng, dữ liệu mang tính thực tế cao trong công việc em đang làm, có một số chỗ em copy vào và sửa chưa đúng với thực tế.
Hiện giờ mình đang quan tâm 2 Sheet : "LTMOI1", và "NienHanQMT".
Hình như file của mình ở trong link chưa cập nhật code của HYen17, mới đưa code của "ChanhTQ@" và "SA_DQ"

Các Bác kiểm tra giúp em và cho em xin ý kiến => để file xử lý nhanh và mang lại hiệu quả cao trong công việc.
Xin cảm ơn và mong sự giúp đỡ của các AE GPE
 
Lần chỉnh sửa cuối:
Cũng định rỗi sẽ thảo luận về CSDL của bạn, sẵn đây nói luôn:

mình ko hiểu do file dữ liệu của mình hay vì lý do gì mà khi Run Macro ThoiGianTaiMucTieu thì phải ngồi chờ rất lâu mới có kết quả cuối cùng.

Với nội dung macro này mà máy chậm tất yếu là do CSDL của bạn chưa ổn;
Điều chưa ổn trước tiên mình muốn nói với bạn sờ sờ tại trang 'ChiTiet'
Tại trang tính này, tất cả các dữ liệu từ cột 'F' đến cột 'Q' là không cần thiết, chỉ tổ làm máy lặc lè mà thôi!
Những thông tin này chỉ cần có ở 'LLNV' là được rồi.
Chắc mình sẽ không được fép đi sâu vô cách thức chấm công & fân công trực mục tiêu của CQ bạn, nhưng mình cảm giác có cách khác nhẹ nhàng & lẹ làng hơn, một khi đã hiểu kỹ về nó!

Thân ái & xin chào!
 
Thứ nhất: Do đặc thù công việc và cách thức quản lý của công ty: quản lý phân tán và mang tính chất vẫn còn rất thủ công. Bên nhân sự ở công ty mình ko chấm công mà chỉ theo dõi quân số biên chế của các mục tiêu thôi. Tuy nhiên nó cũng là cơ sở cho việc kiểm tra công cuối tháng khi các mục tiêu tổng hợp công về có những sai lệch lớn.
Thứ hai: bên sheet “ChiTiet” mình để dư một số thông tin vì mình muốn sử dụng thông tin đó để lập danh sách trích ngang của mục tiêu gửi cho khách hàng khi có yêu cầu, khi đó mình chỉ cần lọc theo mục tiêu và theo ngày mà khách hàng yêu cầu.
Tuy nhiên mình cũng đang phân vân việc danh sách trích ngang này sẽ đưa ra riêng một sheet hay để nguyên trong “ChiTiet” khi cần thì lọc.
Rất mong bạn góp ý thêm.
Chân thành cảm ơn!
 
Thôi thì ta thảo luận cấu trúc từng trang tính vậy!

Trước tiên là 'NienHan...";
Hiện tại các trường trước cột 'H' đang chứa đầy các công thức;
Hình như đa số các công thức này lấy số liệu từ trang 'Loc' (Trừ cột đầu dùng để đánh số thứ tự.)

Bạn hãy cho biết cớ gì fải dùng công thức làm vậy?
Sao không dùng cách nào khác để cái máy thương iêu của bạn đỡ cực hơn, khi fải thực hiện công việc cho bạn?

Hay bạn thử lưu & ghi dung lượng file; Sau đó copy bên 'Loc' dán lên trang này & thực hiện lưu lại lân nữa xem dung lượng có suy xuyễn gì không?

Chờ tin từ bạn!
 
Cám ơn HYen đóng góp ý kiến,
Mình ko biết nhiều về tin học cũng như lập trình, song mình luôn hướng tới tính tự động hóa và nhanh gọn trong file làm việc.
Như trong file mình có mô tả một một số mục đích của các sheet rồi đó.
Bên sheet "NienHanQMT" mình luôn phải in cho các sếp của mình tính đến ngày hiện tại. trong khi quân số mình theo dõi bên sheet "ChiTiet" và theo dõi hàng tháng, vì vậy Mình thường Dùng "LOC" để lấy danh sách quân của ngày hiện tại, kiểm tra quân số của các mục tiêu trong tháng.
Nếu các bạn có cao kiến gì thì góp ý cho mình.
 
Thử kiên nhẫn với bạn thêm 1 lần xem sao?

Thứ hai: bên sheet “ChiTiet” mình để dư một số thông tin vì mình muốn sử dụng thông tin đó để lập danh sách trích ngang của mục tiêu gửi cho khách hàng khi có yêu cầu, khi đó mình chỉ cần lọc theo mục tiêu và theo ngày mà khách hàng yêu cầu.

Bạn hãy cho biết qui trình lập danh sách trích ngang này & form của nó ra sao?

(Biết đâu có cách khác với cách của bạn.)
 
Danh sách trích ngang theo Form bên công ty mình thì mình đã đưa luôn vào trong "ChiTiet" rồi đó: từ cột D đến cọt O, trừ cột F thôi. đó là những thông tin phải đưa vào trích ngang.
Yêu cầu trích ngang của mục tiêu phải là danh sách quân số đang làm tại mục tiêu tính đến ngày mình gửi cho khách hàng.
 
Lần chỉnh sửa cuối:
Hình như có sự chồng chéo giữa 3 trang tính

Đó là các trang 'ChiTiet', 'Loc' & 'NienHan...'
Theo mình chỉ nên là 2 & là như ri:

Trang 'ChiTiet' sẽ trở thành CSDL của bạn cả năm; không có các trường từ sau cột 'F'
Trên trang này ta thêm các nút gắn với các macro, để:

(*) Tạo ra tất cả các dạng BC (báo cáo) cần thiết cho bạn trên trang mà mình sắp gọi là 'Report'

Nó sẽ là form BC cho các mục tiêu;
Nó còn có thể là 'Loc' như hiện nay
& nó trở th anh 'NienHan...' 1 khi bạn muốn;
& tất tần tật những thứ BC khác nữa, khi bạn cần (như 'LTMOI1'),. . .

Bạn nghĩ sao về đề xuất thay đổi như là 1 cuộc cách mạng này?
 
Không biết bạn "HYen17" đã xem file trong linh này chưa?


file trong link trên mình đã mô tả cơ bản những việc mà mình cần làm và theo dõi.
"(*) Tạo ra tất cả các dạng BC (báo cáo) cần thiết cho bạn trên trang mà mình sắp gọi là 'Report'" như bạn "HYen17" nói thì mình rất muốn, xong mình chưa biết phải làm sao để có thể ra được các báo cáo cần thiết một cách linh hoạt mà không tốn nhiều sheet, thuận tiện cho người dùng.
Bạn "HYen17" cùng các bạn đóng góp thêm ý kiến để file trên hoàn thiện hơn.
Cám ơn các Ban nhiều!
 
Lần chỉnh sửa cuối:
Ta đi vào thảo luận về trang 'ChiTiet'

(1) Nó là DL (dữ liệu) của 1 tháng tại CQ (cơ quan) bạn.
DL này thường được bạn nhập hàng ngày bằng tay hay copy từ đâu đó.

(2) Giờ tôi đề xuất bỏ các cột từ sau 'E' sẽ gây ra điều gì trỡ ngại cho bạn?
Bạn hãy liệt kê hết các trỡ ngại dùm nhe.

(3) Mình có théc méc fần sau cột 'Q'; Mình chưa rõ các dòng bên nớ có liên quan gì với fía trước không?
Nếu liên quan thì liên quan đến từng người nhân viên (?);
Thêm nữa, trong bảng ni, có các công khác như 'M' hay 'B' là những công gì? & ngoài chúng còn có những ký hiệu qui ước gì khác thêm?

Chờ hồi âm các thông tin từ bạn./.
 
- Cám ơn bạn “ChanhTQ@” đã quan tâm.
- Nếu bỏ các cột từ sau cột E thì khi muốn lập danh sách trích ngang nhân viên của các mục tiêu mình phải tạo một sheet mới chẳng hạn. thay vì đó, mình đưa những thông tin cần thiết trong trích ngang vào trong “ChiTiet” để khi cần in danh sách trích ngang mình chỉ cần lọc theo “Mục tiêu” và lọc theo “ngày” – những nhân viên còn làm tại mục tiêu rồi copy thông tin vào biểu “Danh sách trích ngang”
- Các cột sau cột “Q” của mình thể hiện tình trạng quân tại các mục tiêu từ ngày 1 đến ngày 31 hàng tháng.
- Các quy ước về ký hiệu hiện mình đang để ở bên Sheet “LOC”
- Trong quy ước của mình: những ngày nhân viên không làm, đã nghỉ hoặc đã chuyển mục tiêu thì sẽ được để trống. khi chuyển sang mục tiêu khác thì tiếp tục cập nhật một dòng mới và đánh dấu vào ngày chuyển đến, những cột (ngày trước đó) để trống.
 

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

Back
Top Bottom