Nhờ các thầy hướng dẫn giúp em phần mảng (arr).

Liên hệ QC

MỹHạnhCB

Đi mây, về gió. !!!
Tham gia
25/3/22
Bài viết
123
Được thích
17
Em thực hiện lọc những dòng không có "ngày kết thúc" cho vào mảng (arr) rồi nhưng sao em trả ra thì lại không có gì ạ. Mong các anh chị giúp đỡ ạ.Em xin cám ơn nhiều ạ :D
 

File đính kèm

  • quanly.xlsm
    20.6 KB · Đọc: 20
Em thực hiện lọc những dòng không có "ngày kết thúc" cho vào mảng (arr) rồi nhưng sao em trả ra thì lại không có gì ạ. Mong các anh chị giúp đỡ ạ.Em xin cám ơn nhiều ạ :D
Những cái không có ngày kết thúc thì mảng bạn chứa những cái gì: Chứa xe, Ngày bắt đầu à
 
Upvote 0
Những cái không có ngày kết thúc thì mảng bạn chứa những cái gì: Chứa xe, Ngày bắt đầu à
Dạ đúng rồi anh. Mục đích là em lọc những dòng không có ngày kết thúc ra ạ, sao đó thực hiện xóa hết những dòng có ngày kết thúc sau đó thực hiện trả dữ liệu của mảng ra lại ạ
 
Upvote 0
Em thực hiện lọc những dòng không có "ngày kết thúc" cho vào mảng (arr) rồi nhưng sao em trả ra thì lại không có gì ạ. Mong các anh chị giúp đỡ ạ.Em xin cám ơn nhiều ạ :D
Đọc lại kiến thức về mảng đi.Bạn chưa biết gán giá trị vào mảng.Chưa biết gán từ mảng xuống sheets.
 
Upvote 0
Vâng cám ơn anh. Thực sự em có đọc nhưng vẫn không thông nổi ạ :D. Để em học lại thêm ạ
Có hơi đi tắt một tí, bạn tự nghiên cứu lấy. Kết quả trả ra vùng từ E1:F chứ không xóa kết quả cũ
Mã:
Sub abc()
Dim I As Long, K As Long, Arr()
With Sheets("Sheet1")
    Arr = .Range("A1:C" & .Cells(Rows.Count, "A").End(xlUp).Row).Value
    K = 1
    For I = 2 To UBound(Arr)
        If Arr(I, 3) = "" Then
            K = K + 1
            Arr(K, 1) = Arr(I, 1)
            Arr(K, 2) = Arr(I, 2)
            Arr(K, 3) = Arr(I, 3)
        End If
    Next
    If K > 1 Then .Range("E1").Resize(K, 3) = Arr
End With
End Sub
 
Upvote 0
Có hơi đi tắt một tí, bạn tự nghiên cứu lấy. Kết quả trả ra vùng từ E1:F chứ không xóa kết quả cũ
Mã:
Sub abc()
Dim I As Long, K As Long, Arr()
With Sheets("Sheet1")
    Arr = .Range("A1:C" & .Cells(Rows.Count, "A").End(xlUp).Row).Value
    K = 1
    For I = 2 To UBound(Arr)
        If Arr(I, 3) = "" Then
            K = K + 1
            Arr(K, 1) = Arr(I, 1)
            Arr(K, 2) = Arr(I, 2)
            Arr(K, 3) = Arr(I, 3)
        End If
    Next
    If K > 1 Then .Range("E1").Resize(K, 3) = Arr
End With
End Sub
Vâng em xin cảm ơn anh ạ. Em sẽ vọc bài này để hiểu hơn về mảng ạ, chứ thật ra em có đọc nhưng không hiểu cách hoạt động là như thế nào ạ. Cảm ơn anh nhiều
 
Upvote 0
Vâng em xin cảm ơn anh ạ. Em sẽ vọc bài này để hiểu hơn về mảng ạ, chứ thật ra em có đọc nhưng không hiểu cách hoạt động là như thế nào ạ. Cảm ơn anh nhiều
Code trên tôi còn thiếu một khúc là xóa giá trị cũ trước khi gán giá trị mới. Giả sử nếu bạn chạy code lần 1 giá trị cũ nhiều hơn. Sau đó chạy lần nữa số lượng dòng ít hơn thì ghi xuống nếu chưa xóa giá trị cũ sẽ bị nhầm lẫn.
Bạn tự tìm hiểu và thêm vào
 
Upvote 0
Code trên tôi còn thiếu một khúc là xóa giá trị cũ trước khi gán giá trị mới. Giả sử nếu bạn chạy code lần 1 giá trị cũ nhiều hơn. Sau đó chạy lần nữa số lượng dòng ít hơn thì ghi xuống nếu chưa xóa giá trị cũ sẽ bị nhầm lẫn.
Bạn tự tìm hiểu và thêm vào
Vâng cám ơn anh ạ
 
Upvote 0
Code trên tôi còn thiếu một khúc là xóa giá trị cũ trước khi gán giá trị mới. Giả sử nếu bạn chạy code lần 1 giá trị cũ nhiều hơn. Sau đó chạy lần nữa số lượng dòng ít hơn thì ghi xuống nếu chưa xóa giá trị cũ sẽ bị nhầm lẫn.
Bạn tự tìm hiểu và thêm vào
Anh cho em hỏi thêm là trường hợp nhiều cột, thì bắt buộc mình phải đánh nhiều "arr" ra luôn hả anh, chứ mình không có cách để gom gọn lại được hả. Cám ơn anh.
 

File đính kèm

  • 1654671063017.png
    1654671063017.png
    20.9 KB · Đọc: 27
Upvote 0
Anh cho em hỏi thêm là trường hợp nhiều cột, thì bắt buộc mình phải đánh nhiều "arr" ra luôn hả anh, chứ mình không có cách để gom gọn lại được hả. Cám ơn anh.
Có. Nhưng mà đang học cơ bản thì bạn cứ học vậy đi, thành thạo hơn tí sẽ ngộ ra thôi :D
 
Upvote 0
Em thực hiện lọc những dòng không có "ngày kết thúc" cho vào mảng (arr) rồi nhưng sao em trả ra thì lại không có gì ạ. Mong các anh chị giúp đỡ ạ.Em xin cám ơn nhiều ạ :D
Mảng có 2 loại, mảng 2chiều và mảng 1 chiều.
Tạm tưởng tượng như thế này nhé:
Mảng 2 chiều giống như một bảng tính ảo, có nhiều dòng và nhiều cột. Số dòng và số cột do người dùng tùy chọn
Mảng 1 chiều là 1 bảng tính ảo, có 1 dòng và nhiều cột

Kiểu hiểu này là mình nghĩ như vậy, có vẻ không hàn lâm nhưng có thể tạm xài được
 
Upvote 0
Mảng có 2 loại, mảng 2chiều và mảng 1 chiều.
Theo em thấy câu trả lời đúng là 2 loại, nhưng là mảng 1 chiều và mảng nhiều chiều chứ ạ? Vì không chỉ có mỗi 2 chiều mà nó có tới tối đa theo em biết là 60 chiều. Nhưng loại 1 và 2 là thường sử dụng nhất
 
Upvote 0
Theo em thấy câu trả lời đúng là 2 loại, nhưng là mảng 1 chiều và mảng nhiều chiều chứ ạ? Vì không chỉ có mỗi 2 chiều mà nó có tới tối đa theo em biết là 60 chiều. Nhưng loại 1 và 2 là thường sử dụng nhất
Mình thì chưa có cơ hội xem cách sử dụng của mảng >= 3 chiều nên mặc định chỉ có mảng 1 chiều và mảng 2 chiều. Đa số anh em trên gpe đều chỉ quan tâm 2 cái mảng này.
Nói thật mình chỉ biết VBA và VB6 thôi nên không hề có tí khái niệm nào với mảng lớn hơn 2 chiều. Chắc cũng khó đấy.
 
Upvote 0
Theo em thấy câu trả lời đúng là 2 loại, nhưng là mảng 1 chiều và mảng nhiều chiều chứ ạ? Vì không chỉ có mỗi 2 chiều mà nó có tới tối đa theo em biết là 60 chiều. Nhưng loại 1 và 2 là thường sử dụng nhất
Các Thầy cho em hỏi thêm: Em đang hiểu là ở bên (1) là mảng và bên (2) là bên dữ liệu đổ vào mảng có đúng không ạ. Vì em đang thử là dữ liệu đổ vào mảng là dòng i cột 2. Nhưng em muốn lưu nó vào mảng và trả về của dòng K cột 4. Nhưng khi đổ dữ liệu vào mảng lại bị báo lỗi là như nào vậy ạ. Em cảm ơn.
 

File đính kèm

  • 1654742428019.png
    1654742428019.png
    94.7 KB · Đọc: 18
Upvote 0
Các Thầy cho em hỏi thêm: Em đang hiểu là ở bên (1) là mảng và bên (2) là bên dữ liệu đổ vào mảng có đúng không ạ. Vì em đang thử là dữ liệu đổ vào mảng là dòng i cột 2. Nhưng em muốn lưu nó vào mảng và trả về của dòng K cột 4. Nhưng khi đổ dữ liệu vào mảng lại bị báo lỗi là như nào vậy ạ. Em cảm ơn.
Gán mảng Arr là vùng A2:C thì không thể có cột >3 được bạn nhé. Chắc bạn nên tìm các bài trong diễn đàn về mảng (rất nhiều) để nắm cơ bản đã nhé
 
Upvote 0
Theo em thấy câu trả lời đúng là 2 loại, nhưng là mảng 1 chiều và mảng nhiều chiều chứ ạ? Vì không chỉ có mỗi 2 chiều mà nó có tới tối đa theo em biết là 60 chiều. Nhưng loại 1 và 2 là thường sử dụng nhất
Lý thuyết về mảng còn tùy thuộc vào bạn muốn đào sâu vào đến phức tạp cỡ nào.
Mảng ở độ cao thì có 2 loại chính. Loại bình thường và loại răng cưa (mảng của mảng)

1. mảng răng cưa là loại mảng mà bạn sẽ thấy thỉnh thoảng ở đây có người dùng. Bạn có thể nhận dạng nó như
mang(i)(j) : phần tử j của phần tử i trong mảng a.
Tôi tạm gác ở đây, không nói về loại mảng này nữa.

2. mảng bình thường là loại mảng mà các bạn nói ở các bài trên. Có thể có từ 1 đến n chiều.

Mảng đơn giản nhất là 1 chiều, dạng:
mang(i) : phần tử i của mảng a

Kế đó là mảng 2 chiều, cách trình bày là chiều thứ nhất cách chiều thứ hai bằng một dấu phẩy:
mang(i, j) : phần tử i, j của mang.
- mảng 2 chiều được xếp theo dòng và cột, chiều thứ nhât gọi là dòng và chiều thứ hai là cột. Vì vậy ta cũng gọi mang(i, j) là phần tử ở cột j hàng i của mang.
Quan trọng:
Vì Excel căn bản là bảng tính mở rộng và trình bày dữ liệu theo bảng, tức là hàng ngang (cột) và hàng dọc (dòng) cho nên VBA tạo một sự liên hệ mật thiết giữa range với mảng hai chiều. Phép gán "= " mà VBA dùng để trút dữ liệu từ một range vào mảng thực ra là một lệnh gọi phương thức mặc định của range để làm công việc moi dữ liệu ra, điều chỉnh độ lớn của mảng theo đúng số dòng và số cột của range và gán. Vì range có hai chiều (dòng và cột) cho nên mảng nhận được luôn luôn là 2 chiều (*1). Nếu range chỉ có 1 cột thì mảng cũng vẫn 1 chiều, tuy rằng chiều thứ hai chỉ có 1 cột. Điều đáng nhớ thứ hai là là range không có khái niệm phần tử 0 cho nên mảng trút từ range ra luôn luôn có chỉ số bắt đầu bằng 1. Trái với một số mặc định khác của VBA coi chỉ số bắt đầu là 0.
Phép gán ngược lại (các bạn ở GPE hay gọi là dập/đập) trở lại range cũng tương tự vậy. Phải là mảng 2 chiều.

(*1) cách duy nhất để chơi với range mà dùng mảng một chiều là ép kiểu bằng hàm Application.Transposse

Mảng 3 chiều phức tạp hơn. Chiều thứ 3 người ta gọi tà trang/tờ (page/sheet). Tuy Excel cũng có sheets nhưng không có sự liên hệ thẳng với chiều thứ 3 như mảng 2 chiều với range.

Chú thích: nếu tôi cần nhiều sheets thì tôi tạo mảng răng cưa, a()(). Mỗi phần tử của mảng chính liên hệ đến một range riêng, sheet nào cũng được.

Mảng n chiều chỉ dùng vào trường hợp hết sức đặc biệt.

Hết. Có gì hỏi thêm thì chỉ nên hỏi về mảng 1-n chiều. Đừng hỏi về mảng răng cưa, chỉ gây phức tạp thêm.
 
Upvote 0
Mình thì chưa có cơ hội xem cách sử dụng của mảng >= 3 chiều nên mặc định chỉ có mảng 1 chiều và mảng 2 chiều. Đa số anh em trên gpe đều chỉ quan tâm 2 cái mảng này.
Nói thật mình chỉ biết VBA và VB6 thôi nên không hề có tí khái niệm nào với mảng lớn hơn 2 chiều. Chắc cũng khó đấy.
Mảng nhiều hơn 2 chiều có chứ, vấn đề là mình kiểm soát được tới chiều thứ mấy. Chỉ tưởng tượng chiều thứ 4 là đã hoa mắt chóng mặt rồi. Mảng 3 chiều thì tôi có xài, nhưng nếu xài trong Excel thì dùng mảng trong mảng tiện lợi hơn.
Cách truy xuất mảng 3 chiều thí dụ sheet i, dòng j và cột k là Arr3D(i, j, k). Cách gán thì khổ sở hơn.

Nếu dùng mảng trong mảng:
Cũng thí dụ sheet i, dòng j cột k

PHP:
Dim ShArr 'mảng các sheet'
Redim ShArr(1 to 5) ' mảng 1 chiều'
For i = 1 to 5
    LastRw = Sheets(i).Cells(1000, 1).End(xlUp).Row
    ShArr(i) = Sheets(i).Range("A2:D" & LastRw).Value
    MsgBox "Size: " & UBound(ShArr(i), 1) & " - " & UBound(ShArr(i), 2)
    MsgBox "last Item = " & ShArr(i)(LastRw - 1, 4)
Next i
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom