làm cách nào để các chuyển tàu tự động tăng số chuyến

  • Thread starter Thread starter ST-Lu!
  • Ngày gửi Ngày gửi
Liên hệ QC

ST-Lu!

Love Wingchun
Tham gia
19/8/08
Bài viết
730
Được thích
546
Nghề nghiệp
Xích lô một thời
Thưa các anh chị
Em xin gửi file và mong các anh, chị giúp việc sau
- Các chuyến tàu cứ sau chù kỳ (1 tuần, hoặc 2 tuần) tùy theo từng tàu mà sẽ tăng số chuyến dần lên theo từng tuần.

Rất mong đựoc chỉ giúp

Xin cám ơn
 

File đính kèm

Đây là một đề bài thú vị

Cho hỏi lại, số lượng các tàu khác là 4 phải không, đó là:

A|B
Ten |( Ma )
ASIAN GLORY|AGG
GISIANG|GIS
STADT HAMBURG|STH
VINALINE PIONEER|VIP

Các chú này tuần nào cũng có mặt?!
 
ChanhTQ đã viết:
Cho hỏi lại, số lượng các tàu khác là 4 phải không, đó là:

A B
Ten (Ma)
ASIAN GLORY AGG
GISIANG GIS
STADT HAMBURG STH
VINALINE PIONEER VIP
Các chú này tuần nào cũng có mặt?!

Thưa anh ChanhTQ
Thực ra các tàu chỉ loanh quanh như vậy, nhưng là thuê tàu ngoài (công ty chỉ có 2 tàu)
Em cũng không dám chắc số tàu khác là 4???
Có phải anh đang nghĩ đến một thuật toán nào không?

Em xin ghi lại quy luật như sau
1. Đối với các tàu
HUB GRANDIOSE
STELLAR PACIFIC
GREAT PRIDE

--> Sau Quy luat: sau 2 tuan quay tro lai thi so chuyen + 2
số chuyến = số chuyến + 2
(ví dụ: tàu HUB tuần 15 là 364S: --> đến tuần 18 là 366S)

2. KOTA RIA
Quy luat: sau 1 tuan quay tro lai thi so chuyen + 2
Ví dụ: Tàu Kota ria tuần 16 số chuyên là RAA156 --> đến tuần 18 sẽ là : RAA158

3.
SINAR PADANG
VINASHIN NAVIGATOR
VINASHIN MARINER
VINASHIN TRADER
VINASHIN FREIGHTER

Quy luat: sau 1 tuan quay tro lai thi so chuyen + 1
Ví dụ: Tàu SINAR PADANG: tuần 15 là 151S ---? đến tuần 17 sẽ là 152S

4. Các tàu khác cứ sau mỗi tuần --- > chuyến chuyến tăng lên 1
Ví du:
VINALINE PIONEER tuần 15 là 55N --> sang tuần 16 là 56N
---------------------------------
Tất cả các tàu trên đều có quy luật như vậy. Mỗi lần cập nhật lịch tàu đều phải sửa bằng tay.
Theo em các thứ có tính quy luật đều phải có một công thức.
Em đang nghĩ đến lập một Data có các trường (tên tàu, số tuần ---> số chuyến tăng dần) rồi dùng
Vlookup....
Em kém quá mãi chưa nghĩ ra./

Rất mong sự chỉ dạy của các cao thủ

Xin cám ơn
 
Lần chỉnh sửa cuối:
Em đã làm được bằng công thức (tổng quát) nhưng công nhận trình độ còn kém quá nên dùng công thức hơi củ chuối

Em xin post file lên để nhận được chỉ bảo
 

File đính kèm

Em đã làm được bằng công thức (tổng quát) nhưng công nhận trình độ còn kém quá nên dùng công thức hơi củ chuối

Em xin post file lên để nhận được chỉ bảo
Nếu chỉ cần theo dõi lịch tàu như bạn làm thì Dosnet sửa lại cho gọn hơn!
 

File đính kèm

Tác giả kiểm tra & cho ý kiến để còn sửa đổi & bổ sung.

Trước khi chạy macro, bạn hãy xóa 10 dòng mà macro vừa tạo ra; sau đó chạy mỗi lần mỗi kiểm.

PHP:
Option Explicit
Const SoDg As Byte = 10
Sub TaoLich()
 Dim r_Ma As Range, sRng As Range, Tuan As Range, Clls As Range, Rng As Range
 Dim eRw As Long, Zw As Long
 Dim Sh As Worksheet:                   Dim MyAdd As String
 
 Sheets("Lich").Select:                 eRw = [d65500].End(xlUp).Row + 1
 Set Rng = Range([C2], Cells(eRw, "C"))
 Set Sh = Sheets("S0")
 Set r_Ma = Sh.Range("A2:A" & Sh.[A65500].End(xlUp).Row)
 Cells(eRw, "A").Resize(2, 9).Value = Cells(eRw - SoDg, "A").Resize(2, 9).Value
 For Zw = 1 To 3
1 'Tim Theo Tuan:'
    Set sRng = r_Ma.Offset(, 2).Find(Zw, , xlValues, xlWhole)
    If Not sRng Is Nothing Then
        MyAdd = sRng.Address
        Do
            If Tuan Is Nothing Then
                Set Tuan = sRng.Offset(, -2)
            Else
                Set Tuan = Union(sRng.Offset(, -2), Tuan)
            End If
            Set sRng = r_Ma.Offset(, 2).FindNext(sRng)
        Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
    End If
2 ' Tim Trong "Lich":'
    Set sRng = Nothing
    For Each Clls In Tuan
        Set sRng = Rng.Find(Clls.Value, , xlFormulas, xlWhole)
        If Not sRng Is Nothing Then
            Set sRng = Rng.FindPrevious(sRng)
            If Zw = 1 And (eRw - sRng.Row) < 10 Then
                With [d65500].End(xlUp)
                    .Offset(1, -1) = sRng.Value
                    .Offset(1).Value = sRng.Offset(, 1).Value
                    .Offset(1, 1).Value = TangSo(sRng.Offset(, 2).Value)
                End With
            ElseIf Zw = 2 And (eRw - sRng.Row >= 10 And eRw - sRng.Row < 20) Then
                With [d65500].End(xlUp)
                    .Offset(1, -1) = sRng.Value
                    .Offset(1).Value = sRng.Offset(, 1).Value
                    If sRng.Value <> "KOR" Then
                        .Offset(1, 1).Value = TangSo(sRng.Offset(, 2).Value, 1)
                    Else
                        .Offset(1, 1).Value = Left(sRng.Offset(, 2), 3) & _
                            CStr(CInt(Mid(sRng.Offset(, 2), 4) + 2))
                    End If
                End With
                
            ElseIf Zw = 3 And (eRw - sRng.Row >= 20 And eRw - sRng.Row < 30) Then
                With [d65500].End(xlUp)
                    .Offset(1, -1) = sRng.Value
                    .Offset(1).Value = sRng.Offset(, 1).Value
                    .Offset(1, 1).Value = TangSo(sRng.Offset(, 2).Value, 2) '8'
                End With
                
            End If
        End If
        
    Next Clls
    Set Tuan = Nothing:                 Set sRng = Nothing
 Next Zw

End Sub
Mã:
[B]Function TangSo(StrC As String, Optional SoTg As Variant = 1) As String[/B]
 Dim Cuoi As String, Dai As Byte
 
 Cuoi = Left(Right(StrC, 2), 1):            Dai = Len(StrC)
 If (Cuoi <> "0" And Cuoi <> "9") Then
    TangSo = Left(StrC, Dai - 2) & CStr(CInt(Cuoi) + SoTg) & Right(StrC, 1)
 ElseIf Cuoi = "8" And SoTg = 2 Then
    TangSo = CStr(CInt(Left(StrC, Dai - 1) + 2)) & Right(StrC, 1)
 Else
    If Dai > 3 Then
        Cuoi = Left(Right(StrC, 3), 2)
        TangSo = Left(StrC, Dai - 3) & CStr(CInt(Cuoi) + SoTg) & Right(StrC, 1)
    Else
        TangSo = CStr(CInt(Left(StrC, 2)) + SoTg) & Right(StrC, 1)
    End If
 End If
[B]End Function[/B]
 

File đính kèm

Cám ơn Anh ChanhTQ rất nhiều

Qua đoạn code anh viết em học được rất nhiều, nhưng em cũng vừa chỉnh sửa lại file xong đúng lúc các anh gửi file.

Trong file em sửa lại chỉ cần gõ số tuần vào ô BM1 là số chuyến và ngày tàu chạy sẽ cập nhật
và sort lại


Cám ơn các anh
 

File đính kèm

Lần chỉnh sửa cuối:
Em cũng vừa chỉnh sửa lại file xong đúng lúc các anh gửi file.
Trong file em sửa lại chỉ cần gõ số tuần vào ô BM1 là số chuyến và ngày tàu chạy sẽ cập nhật và sort lại Cám ơn các anh
Mình cũng vừa thêm cột ngày tàu chạy đây, xin gởi bạn tham khảo thêm;
Mình dùng hàm =WEEKNUM(Date) để lấy số thứ tự của tuần trong năm luôn.

Đây là đoạn Code bổ sung. Trong đó các dòng lệnh đầu & cuối mình đã vô hiệu hóa; Nó có tác dụng chỉ ra chổ ta cần đưa phần bổ sung này vô đâu trong macro

PHP:
 'Next Zw'
 With Cells(eRw, "F")
    .Offset(2) = .Offset(-8).Value + 7:     .Offset(9).FormulaR1C1 = "=R[-1]C"
    .Offset(3).FormulaR1C1 = "=R[-1]C+2":   .Offset(4).FormulaR1C1 = "=R[-1]C"
    .Offset(5).FormulaR1C1 = "=R[-2]C+1":   .Offset(6).FormulaR1C1 = "=R[-1]C+2"
    .Offset(7).FormulaR1C1 = "=R[-1]C":     .Offset(8).FormulaR1C1 = "=R[-1]C"
    .Offset(, 1).FormulaR1C1 = "=WEEKNUM(R[2]C[-1])"
 End With 
'End Sub'

Nhân đây, có thể cho mình biết luôn, rằng cột 'G' lặp lại mãi vậy hay sao? Chắc không cần Code cột này đâu, phải không?
 
Mình cũng vừa thêm cột ngày tàu chạy đây, xin gởi bạn tham khảo thêm;
Mình dùng hàm =WEEKNUM(Date) để lấy số thứ tự của tuần trong năm luôn.

Đây là đoạn Code bổ sung. Trong đó các dòng lệnh đầu & cuối mình đã vô hiệu hóa; Nó có tác dụng chỉ ra chổ ta cần đưa phần bổ sung này vô đâu trong macro

PHP:
 'Next Zw'
 With Cells(eRw, "F")
    .Offset(2) = .Offset(-8).Value + 7:     .Offset(9).FormulaR1C1 = "=R[-1]C"
    .Offset(3).FormulaR1C1 = "=R[-1]C+2":   .Offset(4).FormulaR1C1 = "=R[-1]C"
    .Offset(5).FormulaR1C1 = "=R[-2]C+1":   .Offset(6).FormulaR1C1 = "=R[-1]C+2"
    .Offset(7).FormulaR1C1 = "=R[-1]C":     .Offset(8).FormulaR1C1 = "=R[-1]C"
    .Offset(, 1).FormulaR1C1 = "=WEEKNUM(R[2]C[-1])"
 End With 
'End Sub'

Nhân đây, có thể cho mình biết luôn, rằng cột 'G' lặp lại mãi vậy hay sao? Chắc không cần Code cột này đâu, phải không?

Thưa Anh
Hiện tại em mới vào làm ở công ty mới chưa hỏi xem là số lặp này có lặp lại mãi không? nhưng hiện tại file có thể dùng đến hết năm 2009...he he

Rất cám ơn sự tận tình của anh
 
Thấy thú vị thì làm thôi, mình cũng hưởng lợi mà!

Hiện tại file có thể dùng đến hết năm 2009...he he Rất cám ơn sự tận tình của anh
Mình có cảm giác ngay từ đầu, rằng đây là đề tài thú vị. Cảm ơn bạn nha!
Hình như nó sẽ làm lịch trình dài dài, từ năm này đến năm khác, có được không nữa?

Nếu cần xóa bớt, thì chí ít phải để lại 3 block liên tục để macro có cơ sở tính tiếp.

Macro trên cũng có thể viết gọn lại chút đĩnh nữa, bằng cách gộp ba đoạn vào làm 1, như sau:
PHP:
          If (Zw = 1 And (eRw - sRng.Row) < 10) Or _
                (Zw = 3 And (eRw - sRng.Row >= 20 And eRw - sRng.Row < 30)) Or _
                (Zw = 2 And (eRw - sRng.Row >= 10 And eRw - sRng.Row < 20)) Then
                With [d65500].End(xlUp)
                    .Offset(1, -1) = sRng.Value
                    .Offset(1).Value = sRng.Offset(, 1).Value
                    If sRng.Value <> "KOR" Then
                        .Offset(1, 1).Value = TangSo(sRng.Offset(, 2).Value, 1)
                    Else
                        .Offset(1, 1).Value = Left(sRng.Offset(, 2), 3) & _
                            CStr(CInt(Mid(sRng.Offset(, 2), 4) + 2))
                    End If
                End With
            End If
 
Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom