Cần giúp Code duyệt, thao tác mảng 2 chiều tại vị trí cố định (2 người xem)

Liên hệ QC

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

OsamaPikachu

Thành viên mới
Tham gia
19/4/14
Bài viết
17
Được thích
0
Hi anh em GPE, Thiệt em cũng không biết đặt tiêu đề sao cho đúng. Ả thông cảm .E mới tập tành VBA và hiện tại em đang gặp phải vấn đề như thế này khi duyệt mảng 2 chiều mà không biết làm tao, mang lên đây nhờ anh em giúp với.

Giả sử coi mảng Array(1 to 31, 0 to 23) đại diện cho Tháng có 1 - 31 ngày và ngày có 0 - 23h
Ta có phương tiện đến (Time-in) 22h ngày 5 và Time-out 2h ngày 6. Vậy tổng thời gian của phương tiện là 5h(tính lun 22h)
Ta có time-in, time-out, TotalLoadingTime
Em mún cứ mỗi phần tử Array tương ứng với ngày giờ của phương tiện thì + 1 đơn vị.

Ví dụ theo phương tiện trên thì Array[5][23]+1, Array[6][0]+1, Array[6][1]+1, Array[6][2]+1

Em kém quá nên không biết lặp như thế nào cho nó biết tự cộng lên theo tự time-in cho đến time-out (có thể lớn hơn 1 ngày).

Nhờ anh em giúp với.
P/s Điên đầu nên giờ này còn lên GPE post bài +-+-+-++-+-+-+
 
Lần chỉnh sửa cuối:
Giả sử coi mảng Array(1 to 31, 0 to 23) đại diện cho Tháng có 1 - 31 ngày và ngày có 0 - 23h
Ta có phương tiện đến (Time-in) 22h ngày 5 và Time-out 2h ngày 6. Vậy tổng thời gian của phương tiện là 5h(tính lun 22h)
Em muốn cứ mỗi phần tử Array tương ứng với ngày giờ của phương tiện thì + 1 đơn vị.

Ví dụ theo phương tiện trên thì Array[5][23]+1, Array[6][0]+1, Array[6][1]+1, Array[6][2]+1

Em kém quá nên không biết lặp như thế nào cho nó biết tự cộng lên theo tự time-in cho đến time-out (có thể lớn hơn 1 ngày).
Nhờ anh em giúp với.

Tại: http://www.giaiphapexcel.com/forum/...hể-trong-tháng&p=573411&highlight=#post573411
đã có macro sự kiện này rồi nà:
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Sh As Worksheet, Rng As Range, WF As Object
 Dim J As Byte, Gio As Byte, Ww As Byte, Dat As Date
 
 If Not Intersect(Target, [T2]) Is Nothing Then
    Set Sh = ThisWorkbook.Worksheets("DuLieu")
    Dat = DateSerial([AA1].Value, Target.Value, 1)
    Set WF = Application.WorksheetFunction
    Set Rng = Sh.[b2].CurrentRegion
    For J = 0 To 30
        Application.ScreenUpdating = False
        If Month(Dat + J) <> Month(Dat) Then Exit For
        Sh.[AB7].Value = Dat + J
        For Ww = 0 To 23
            Sh.[aC7].Value = Ww
            Cells(4 + J, 3 + Ww).Value = WF.DCountA(Rng, Sh.[B1], Sh.[aa1:ad3])
        Next Ww
        If J Mod 9 = 0 Then Application.ScreenUpdating = True
    Next J
    [Z1].Value = Target.Value
    Application.ScreenUpdating = True
 End If
End Sub

Bạn diễn dịch macro này xem tác giả làm như thế nào;
Sao đó chuyển sang xài mảng cũng không muộn, 1 khi có túi đồ nghề kha khá!

Tự 'hộc' thì fải từ từ từng bước bạn à
 
Upvote 0
Tôi hiểu mang máng là bạn làm một cái bảng tính tình trạng sử dụng của phương tiện. Có các điều sau đây:

1. bảng tính theo ngày tháng đáng lẽ phải là mảng 3 chiều: tháng, ngày, và giờ

2. Theo lý thuyết bảng sử dụng, dùng con toán +1 khi phương tiện có thể chia ra cho nhiều đối tượng sử dụng 1 lúc. Ví dụ một cái bàn, có thể nhiều người ngồi chung. Nếu phương tiện chỉ có thể một đối tượng sử dụng trong một lúc thì người ta dùng con toán AND 1. Ví dụ chiếc xe đạp chỉ có một người cỡi. Nói cách khác, theo kiểu a thì trị của phần tử mảng là 0-N, trong khi theo kiểu b thì phần tử mảng chỉ là 0-1

3. bạn ghi ví dụ Array[5][23]. Đó là cách diễn đạt mảng của C, Java, ... Tôi đoán chừng bạn đọc code đâu đó ở mấy bài này. Nếu vậy bạn chịu khó đọc luôn giải thuật xem người ta làm như thế nào

Đại khái muốn ghi mảng thì ta làm như sau:
Mã:
For gio = gioVao to IIF(ngayRa > ngayVao, 24, gioRa) ' ghi giờ ngày vào
  mang(ngayVao,gio) = mang(ngayVao,gio) +1
Next gio
For ngay = ngayVao+1 to ngayRa-1 ' ghi giờ những ngày giữa 2 ngày 
  For gio = 1 to 24
    mang(ngay,gio) = mang(ngay,gio) +1
  Next gio
Next ngay
For gio = 1 to IIF(ngayRa > ngayVao, gioRa, -1) ' ghi giờ ngày ra
' lưu ý con số -1 định rằng nếu ngày ra không lớn hơn ngày vào thì vòng lặp này không chạy lượt nào
  mang(ngayVao,gio) = mang(ngayVao,gio) +1
Next gio
Tôi chỉ sơ qua cách thiết kế. Còn chi tiết thì tôi cũng chẳng hiểu bạn muốn làm cái gì.
 
Upvote 0
Tại: http://www.giaiphapexcel.com/forum/...hể-trong-tháng&p=573411&highlight=#post573411
đã có macro sự kiện này rồi nà:
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim Sh As Worksheet, Rng As Range, WF As Object
 Dim J As Byte, Gio As Byte, Ww As Byte, Dat As Date
 
 If Not Intersect(Target, [T2]) Is Nothing Then
    Set Sh = ThisWorkbook.Worksheets("DuLieu")
    Dat = DateSerial([AA1].Value, Target.Value, 1)
    Set WF = Application.WorksheetFunction
    Set Rng = Sh.[b2].CurrentRegion
    For J = 0 To 30
        Application.ScreenUpdating = False
        If Month(Dat + J) <> Month(Dat) Then Exit For
        Sh.[AB7].Value = Dat + J
        For Ww = 0 To 23
            Sh.[aC7].Value = Ww
            Cells(4 + J, 3 + Ww).Value = WF.DCountA(Rng, Sh.[B1], Sh.[aa1:ad3])
        Next Ww
        If J Mod 9 = 0 Then Application.ScreenUpdating = True
    Next J
    [Z1].Value = Target.Value
    Application.ScreenUpdating = True
 End If
End Sub

Bạn diễn dịch macro này xem tác giả làm như thế nào;
Sao đó chuyển sang xài mảng cũng không muộn, 1 khi có túi đồ nghề kha khá!

Tự 'hộc' thì fải từ từ từng bước bạn à

Cảm ơn bạn. Thì cái chủ đề đó cũng là mình hỏi và được giúp đỡ. Nhưng thú thật đối với mình bạn kia viết Macro "cao siêu" quá. Tuy mình đã đọc, Google và hiểu sơ sơ ý đồ của tác giả để modify nhưng nếu mình tự làm thì không làm đc như vậy. Nên tự mình làm theo khả năng của mình đã. Bí đến đâu lên nhờ anh em GPE giúp đỡ vậy. Thanks tất cả anh em GPE /-*+/
 
Upvote 0
Tôi hiểu mang máng là bạn làm một cái bảng tính tình trạng sử dụng của phương tiện. Có các điều sau đây:

1. bảng tính theo ngày tháng đáng lẽ phải là mảng 3 chiều: tháng, ngày, và giờ

2. Theo lý thuyết bảng sử dụng, dùng con toán +1 khi phương tiện có thể chia ra cho nhiều đối tượng sử dụng 1 lúc. Ví dụ một cái bàn, có thể nhiều người ngồi chung. Nếu phương tiện chỉ có thể một đối tượng sử dụng trong một lúc thì người ta dùng con toán AND 1. Ví dụ chiếc xe đạp chỉ có một người cỡi. Nói cách khác, theo kiểu a thì trị của phần tử mảng là 0-N, trong khi theo kiểu b thì phần tử mảng chỉ là 0-1

3. bạn ghi ví dụ Array[5][23]. Đó là cách diễn đạt mảng của C, Java, ... Tôi đoán chừng bạn đọc code đâu đó ở mấy bài này. Nếu vậy bạn chịu khó đọc luôn giải thuật xem người ta làm như thế nào

Đại khái muốn ghi mảng thì ta làm như sau:
Mã:
For gio = gioVao to IIF(ngayRa > ngayVao, 24, gioRa) ' ghi giờ ngày vào
  mang(ngayVao,gio) = mang(ngayVao,gio) +1
Next gio
For ngay = ngayVao+1 to ngayRa-1 ' ghi giờ những ngày giữa 2 ngày 
  For gio = 1 to 24
    mang(ngay,gio) = mang(ngay,gio) +1
  Next gio
Next ngay
For gio = 1 to IIF(ngayRa > ngayVao, gioRa, -1) ' ghi giờ ngày ra
' lưu ý con số -1 định rằng nếu ngày ra không lớn hơn ngày vào thì vòng lặp này không chạy lượt nào
  mang(ngayVao,gio) = mang(ngayVao,gio) +1
Next gio
Tôi chỉ sơ qua cách thiết kế. Còn chi tiết thì tôi cũng chẳng hiểu bạn muốn làm cái gì.

Đầu tiên cảm ơn bạn đã giúp }}}}}. Ý của mình là xác định thời điểm cụ thể trong tháng có bao nhiêu phương tiện trong nhà máy.
Vd mình có report các đơn hàng của 1 năm (mỗi đơn hàng có time-in-out). Mình xét tháng 2,
pt Time-in 31/1 22h và time out 2/3 1h. Vì chỉ xét tháng 2 nên mình đăt lại time-in của đơng hàng là 1/2 0:00 và time-out 28/2 23:59 (tương tự mình đổi time-in-out của những đơn hàng xem kẻ giữa các tháng dựa vào tháng mình xét. Nếu pt có mặt giờ nào trong nhà máy thì mang(ngayvao, giờ)+1 đến (ngày ra,giờ)+1. duyệt từng tự các đơn hàng có liên quan đến tháng 2. Xong chạy cái mãng ra là biết uh lúc 7h 22/2 có 3 pt trong nhà máy.

Đúng là đó mình có biết sơ C, PHP,... nhưng cái này mình tự làm cho nhu cầu report của mình = excel, mình tự đặt ra cách làm luôn @@>. BIết là nó chưa tối ưu nhưng đây là cách mà khả năng mình nghĩ ra và mình muốn hoàn thiện ý tưởng theo khả năng mình (biết thêm VBA thì optimize sau.)

Thanks code của bạn. Nhờ nó mà mình "sáng" ra nhiều lắm. Để mình bắt tay vào làm tiếp có gì mong đc bạn cũng như anh em GPE hổ trợ cho mình. Thanks all }}}}}
 
Upvote 0
Tôi copy/paste mà quên coi lại.

Các phần tử mảng ở vòng lặp cuối cùng đáng lẽ phải là mang(ngayRa,gio) thay vì mang(ngayVao,gio)
 
Upvote 0
Tôi hiểu mang máng là bạn làm một cái bảng tính tình trạng sử dụng của phương tiện. Có các điều sau đây:

1. bảng tính theo ngày tháng đáng lẽ phải là mảng 3 chiều: tháng, ngày, và giờ

2. Theo lý thuyết bảng sử dụng, dùng con toán +1 khi phương tiện có thể chia ra cho nhiều đối tượng sử dụng 1 lúc. Ví dụ một cái bàn, có thể nhiều người ngồi chung. Nếu phương tiện chỉ có thể một đối tượng sử dụng trong một lúc thì người ta dùng con toán AND 1. Ví dụ chiếc xe đạp chỉ có một người cỡi. Nói cách khác, theo kiểu a thì trị của phần tử mảng là 0-N, trong khi theo kiểu b thì phần tử mảng chỉ là 0-1

3. bạn ghi ví dụ Array[5][23]. Đó là cách diễn đạt mảng của C, Java, ... Tôi đoán chừng bạn đọc code đâu đó ở mấy bài này. Nếu vậy bạn chịu khó đọc luôn giải thuật xem người ta làm như thế nào

Đại khái muốn ghi mảng thì ta làm như sau:
Mã:
For gio = gioVao to IIF(ngayRa > ngayVao, 24, gioRa) ' ghi giờ ngày vào
  mang(ngayVao,gio) = mang(ngayVao,gio) +1
Next gio
For ngay = ngayVao+1 to ngayRa-1 ' ghi giờ những ngày giữa 2 ngày 
  For gio = 1 to 24
    mang(ngay,gio) = mang(ngay,gio) +1
  Next gio
Next ngay
For gio = 1 to IIF(ngayRa > ngayVao, gioRa, -1) ' ghi giờ ngày ra
' lưu ý con số -1 định rằng nếu ngày ra không lớn hơn ngày vào thì vòng lặp này không chạy lượt nào
  mang(ngayVao,gio) = mang(ngayVao,gio) +1
Next gio
Tôi chỉ sơ qua cách thiết kế. Còn chi tiết thì tôi cũng chẳng hiểu bạn muốn làm cái gì.

Bạn ơ đây là code mình viết nè. Chạy ít transation thì không sao. Chạy nhiều quá quá nó bị lỗi "Run Time 6" Overflow +-+-+-++-+-+-++-+-+-+.

Bạn coi có cách gì giúp mình không @#!^%
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0

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

Back
Top Bottom