Các câu hỏi về mảng trong VBA (Array)

Liên hệ QC

viehoai

Thành viên gắn bó
Tham gia
22/5/09
Bài viết
2,600
Được thích
2,907
Xin các anh chị giúp đỡ Code Gán các giá trị của một Range là các phần tử của Mãng
Ví dụ: Tôi có các giá trị của Range("A1:A10"). Tôi muốn viết code để gán giá trị của các cells từ A1:A10 là các phần tử của Mãng Arr chẳn hạn.
Xin cảm ơn các anh chị
 
Tks bác nhiều. Nhưng gio em có 3 vấn đề gặp nữa.
1/ Giờ em muốn nếu nhập tiếp ngày thay mới của 1 xe nào đó ở dưới thì nó sẽ chỉ hiển thị Km mới của xe đó ở dưới và ở trên nó sẽ không hiển thị nữa thì có được không ?
2/ EM muốn thêm cả các mục thay Lốp, bảo dưỡng bốn bánh (em có bổ xung thêm vào File mới gửi kèm theo) LƯU Ý ở các mục mới sẽ có 2 điều kiện (1 là Km 2 la ngày đến hạn) nó sẽ báo vào cả 2 cột tương ứng (cột ngày nó sẽ đếm còn bao nhiêu ngày nữa sẽ đến so với ngày hiện tại)
3/ Nếu em muốn thêm vài mục khác nữa cần theo dõi nữa thì em phải thêm vòng lặp ở chỗ nào
Hôm trước em coppy code của bác vào và test kỹ thì không ổn. bởi vi.
1/ VD: Cùng 1 biển số xe Bên Sheet KTRA_DENHAN ngày thay dầu ngày 08-7 mà bên Sheet KmHangNgay có các ngày từ 1-6 đến 30-6 chưa có dữ liệu tháng 7 vậy mà bên Sheet KTRA_DENHAN vẫn tính Km từ trước đến giờ mà không căn cứ ngày thay dầu mới đây nhất của Sheet KTRA_DENHAN như vậy sẽ xảy ra sau 1 năm bao nhiêu lần thay dầu rồi nó vẫn cộng KM tất cả vào thì ko thể biết được đã đến kỳ thay dầu mới nhất.
 
Upvote 0
Như file đính kèm, ở sheet 1 em có RẤT NHIỀU BẢNG (em chỉ liệt kê 3 bảng nhưng thực ra có khoảng 20-30 bảng như vậy) chứa thông tin.
Ở sheet 2 em muốn nó sẽ tổng hợp tất cả thông tin theo từng MARK NO. (Như em đã tổng hợp sẵn nhưng nó tốn rất nhiều thời gian vì phải copy vs paste từng dòng rồi lại phải lọc MARK NO. đó có số lượng hay không) Như sheet 2, em phải lọc tất cả những item mà MARK NO. có số lượng, cụ thể lọc từ A1 đến A4 rồi tiếp tục từ X1 đến X6, C1 đến C3.... Rồi phải xoá những dòng có số lượng bằng 0.
Nhờ các bác giúp đỡ dùm.
 

File đính kèm

  • Test E-BOM.xlsx
    21.2 KB · Đọc: 13
Upvote 0
Như file đính kèm, ở sheet 1 em có RẤT NHIỀU BẢNG (em chỉ liệt kê 3 bảng nhưng thực ra có khoảng 20-30 bảng như vậy) chứa thông tin.
Ở sheet 2 em muốn nó sẽ tổng hợp tất cả thông tin theo từng MARK NO. (Như em đã tổng hợp sẵn nhưng nó tốn rất nhiều thời gian vì phải copy vs paste từng dòng rồi lại phải lọc MARK NO. đó có số lượng hay không) Như sheet 2, em phải lọc tất cả những item mà MARK NO. có số lượng, cụ thể lọc từ A1 đến A4 rồi tiếp tục từ X1 đến X6, C1 đến C3.... Rồi phải xoá những dòng có số lượng bằng 0.
Nhờ các bác giúp đỡ dùm.
Làm theo giải thích của bạn nhưng kết quả "trớt huớt" với kết quả mẫu.
Thấy sai nhưng không biết sửa, bạn tự chỉnh lại nhé.
 

File đính kèm

  • Test E-BOM.xlsb
    26.3 KB · Đọc: 22
Upvote 0
Làm theo giải thích của bạn nhưng kết quả "trớt huớt" với kết quả mẫu.
Thấy sai nhưng không biết sửa, bạn tự chỉnh lại nhé.


Kết quả của bạn là chính xác. Khác với mình là do mình bị sai sót khi nhập tay.
Chính vì vậy nên code của bạn đã giúp mình vừa nhanh vừa tránh những lỗi sai như vậy.
Thank bạn rất nhiều! Pro quá! 100 Like!
 
Upvote 0
Chào bạn Ba Tê!
Mong bạn giúp mình thêm lần nữa.

Như file đính kèm, bạn có thể nào tách cột M ra thành 3 cột khác nhau rồi tự động bỏ những ký tự khác số (O.D, t, MWT) rồi chèn dữ liệu qua sheet 2 như file trước không bạn?

Nếu bạn bận quá ko có thời gian thì có thể ghi chú thích ở sau mỗi dòng trong code trước được không? Mình hơi tối chỗ vòng lặp.

Mình cảm ơn!
Làm theo giải thích của bạn nhưng kết quả "trớt huớt" với kết quả mẫu.
Thấy sai nhưng không biết sửa, bạn tự chỉnh lại nhé.

Chào bạn Ba Tê!
Mong bạn giúp mình thêm lần nữa.

Như file đính kèm, bạn có thể nào tách cột M ra thành 3 cột khác nhau rồi tự động bỏ những ký tự khác số (O.D, t, MWT) rồi chèn dữ liệu qua sheet 2 như file trước không bạn?

Nếu bạn bận quá ko có thời gian thì có thể ghi chú thích ở sau mỗi dòng trong code trước được không? Mình hơi tối chỗ vòng lặp.

Mình cảm ơn!
 

File đính kèm

  • LIST BOM TEST VBA FOR E-BOM - Copy.xlsx
    41.7 KB · Đọc: 15
Upvote 0
Như file đính kèm, bạn có thể nào tách cột M ra thành 3 cột khác nhau rồi tự động bỏ những ký tự khác số (O.D, t, MWT) rồi chèn dữ liệu qua sheet 2 như file trước không bạn?
File này khác file trước, bạn không cho kết quả mẫu nên không biết như thế nào là đúng.
Bạn xem file nhé.
 

File đính kèm

  • LIST BOM TEST VBA FOR E-BOM - Copy.xlsb
    37 KB · Đọc: 10
Upvote 0
File này khác file trước, bạn không cho kết quả mẫu nên không biết như thế nào là đúng.
Bạn xem file nhé.

Cảm ơn anh rất nhiều.
Kết quả của anh là chính xác.
Duy còn 1 chút vấn đề nữa thôi ạ.

Trong file em gửi lại cho a. Những cột em bôi đỏ là những cột mình không sử dụng đến (vì nó xuất từ BOM gốc nên em vẫn phải để vậy). Còn 2 cột em bôi cam a có thể đổi giá trị cho nhau ko ạ? Và số lượng (quantity) thì sẽ được tính như sau:
Item "01" thuộc Mark No. "HAH12-BG050" = 6 x 1 (1 set là cố định cho item "HAH12-BG050")
Item "11" thuộc Mark No. "HAH12-BG050" = 2 x 1
............
Item "01" thuộc Mark No. "HAH12-BG055" = 6 x 14..........

Mong anh giúp đỡ!
 

File đính kèm

  • Copy of LIST BOM TEST VBA FOR E-BOM - 2.xlsb
    50.7 KB · Đọc: 7
Upvote 0
Cảm ơn anh rất nhiều.
Kết quả của anh là chính xác.
Duy còn 1 chút vấn đề nữa thôi ạ.

Trong file em gửi lại cho a. Những cột em bôi đỏ là những cột mình không sử dụng đến (vì nó xuất từ BOM gốc nên em vẫn phải để vậy). Còn 2 cột em bôi cam a có thể đổi giá trị cho nhau ko ạ? Và số lượng (quantity) thì sẽ được tính như sau:
Item "01" thuộc Mark No. "HAH12-BG050" = 6 x 1 (1 set là cố định cho item "HAH12-BG050")
Item "11" thuộc Mark No. "HAH12-BG050" = 2 x 1
............
Item "01" thuộc Mark No. "HAH12-BG055" = 6 x 14..........

Mong anh giúp đỡ!
Hiểu chết liền.
Bạn đưa file có kết quả khoảng 10 dòng, ghi chú từng cột bên sheet2 là tính cách nào, từ cột nào của sheet1 để ra kết quả như thế.
 
Upvote 0

File đính kèm

  • Copy of LIST BOM TEST VBA FOR E-BOM - 3.xlsb
    47.2 KB · Đọc: 12
Upvote 0
Anh chị cho mình hỏi, làm cách nào để redim một mảng với số dòng, số cột bằng kết quả sau khi xử lý không vậy (số dòng, cột có thể tăng, giảm so với mảng gốc)
 
Lần chỉnh sửa cuối:
Upvote 0
Anh chị cho mình hỏi, làm cách nào để redim một mảng với số dòng, số cột bằng kết quả sau khi xử lý không vậy (số dòng, cột có thể tăng, giảm so với mảng gốc)
Hãy giải thích đỏ đỏ. Tốt nhất lấy thêm ví dụ để mô tả

Mảng 2 chiều? Đừng bắt người khác đoán khi bạn có thể tự nói.

Mã:
Redim Arr(LBound(result) to UBound(result), LBound(result, 2) to UBound(result, 2))

Nếu mảng kết quả có các chỉ số bắt đầu từ 1 thì gõ ít chút
Mã:
Redim Arr(1 to UBound(result), 1 to UBound(result, 2))

Ý là thế???
 
Upvote 0
Em thì đoán như này:
Người ta chắc đang dùng một đoạn code nào đó, kết quả trả về là một mảng KQ (2 chiều, tạm gọi là hàng và cột như người ta mô tả). Tuy nhiên, nó xảy ra trường hợp số lượng kết quả (theo hàng, cột) nằm trong mảng KQ nhỏ hơn số hàng, cột của mảng KQ đã khai báo. Tức là trong mảng KQ đang dư các phần tử không có gì cả.
Và người ta cần làm gì đó (chưa biết ???) nên muốn "Redim" lại mảng KQ kia sao cho số hàng, cột của mảng KQ = số lượng kết quả thực tế trả về (theo hàng, cột), tất nhiên là vẫn giữ được các kết quả đã có trong mảng KQ.

Ví dụ:
Ban đầu có: KQ(1 to 5, 1 to 3)
Sau một đoạn code thì có:
KQ(1,1)=1
KQ(2,1)=2
KQ(3,1)=3
KQ(2,1)=4
KQ(2,2)=5
Kết quả mong muốn: KQ(1 to 3, 1 to 2) và vẫn giữ được các kết quả trong KQ đã có ở bước trên.
 
Upvote 0
Thì tôi không hiểu mà. Vì thế mới có "Ý là thế???"

Nếu là "redim mảng kết quả chỉ lấy n dòng và m cột (cùng với các giá trị) đầu, với n và m xác định" thì dễ hiểu hơn nhiều.

Nhưng lại là "redim một mảng với số dòng, số cột bằng kết quả". Chả biết nhà thơ nghĩ gì :D

Thực ra nếu mảng kết quả sau đó chỉ dùng để đập xuống sheet thì khỏi phải redim. Chỉ cần giới hạn vùng "được đập" trên sheet
Mã:
Sheet1.Range("C10").resize(n, m).value = ketqua
 
Upvote 0
Em thì đoán như này:
Người ta chắc đang dùng một đoạn code nào đó, kết quả trả về là một mảng KQ (2 chiều, tạm gọi là hàng và cột như người ta mô tả). Tuy nhiên, nó xảy ra trường hợp số lượng kết quả (theo hàng, cột) nằm trong mảng KQ nhỏ hơn số hàng, cột của mảng KQ đã khai báo. Tức là trong mảng KQ đang dư các phần tử không có gì cả.
Và người ta cần làm gì đó (chưa biết ???) nên muốn "Redim" lại mảng KQ kia sao cho số hàng, cột của mảng KQ = số lượng kết quả thực tế trả về (theo hàng, cột), tất nhiên là vẫn giữ được các kết quả đã có trong mảng KQ.

Ví dụ:
Ban đầu có: KQ(1 to 5, 1 to 3)
Sau một đoạn code thì có:
KQ(1,1)=1
KQ(2,1)=2
KQ(3,1)=3
KQ(2,1)=4
KQ(2,2)=5
Kết quả mong muốn: KQ(1 to 3, 1 to 2) và vẫn giữ được các kết quả trong KQ đã có ở bước trên.
Dạ đúng như anh nói. Kết quả sau khi xử lý số dòng ở mảng KQ nó sẽ lớn hơn số dòng ở mảng mình tạo ban đầu ban đầu.
Bài đã được tự động gộp:

Hãy giải thích đỏ đỏ. Tốt nhất lấy thêm ví dụ để mô tả

Mảng 2 chiều? Đừng bắt người khác đoán khi bạn có thể tự nói.

Mã:
Redim Arr(LBound(result) to UBound(result), LBound(result, 2) to UBound(result, 2))

Nếu mảng kết quả có các chỉ số bắt đầu từ 1 thì gõ ít chút
Mã:
Redim Arr(1 to UBound(result), 1 to UBound(result, 2))

Ý là thế???
Em xin trình bày thêm. Mảng ban đầu của em là có 5 dòng, 3 cột. Sau khi xử lý số liệu kết quả trả về số dòng có thể lớn hơn hoặc nhỏ hơn số dòng ở mảng ban đầu (không xác định được). Vậy cho em hỏi làm thế nào để redim mảng bằng số số dòng, số cột ở kết quả xử lý không? Vi dụ Mảng ban đầu BD(5 dòng, 3 cột). , kết quả KQ(7dòng, 3 cột). Mình Redim KQ như thến nào để xác định được (7 dòng, 3 cột)
 
Lần chỉnh sửa cuối:
Upvote 0
Sau khi xử lý số liệu kết quả trả về số dòng có thể lớn hơn... Vi dụ Mảng ban đầu BD(5 dòng, 3 cột), kết quả KQ(7dòng, 3 cột)
Kết quả cuối cùng không có chuyện lớn hơn đâu. Nếu có lớn hơn thì trong code đã xử lý để mảng KQ có kích thước đủ lớn chứa hết các kết quả rồi.
Dạ đúng như anh nói. Kết quả sau khi xử lý số dòng ở mảng KQ nó sẽ lớn hơn số dòng ở mảng mình tạo ban đầu ban đầu.
Hồi chưa biết gì mình dùng code có sẵn cũng bị dính y chang, rồi phải viết thêm hàm để lấy các phần tử trong mảng kết quả... Thấy hơi buồn cười nhưng tạm dùng đã.
Bạn gửi cái code đang dùng đó lên đây, sẽ có cách xử lý cho kết quả hợp lý nhất.
 
Upvote 0
Web KT
Back
Top Bottom