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,599
Được thích
2,908
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ị
 
Thanks bạn đã góp ý DẤT xây dựng, nhưng mình không muốn dùng filter trên sheet (và chưa có cách nào dùng được để giải quyết bài toán của mình).
Bài toán của mình ở đây là tính lãi chậm thanh toán bán hàng sản phẩm là căn hộ.
Dữ liệu đầu vào nằm trong 3 sheet, cụ thể như sau:
- Sheet 1: Lưu danh sách các căn hộ (mã căn hộ, các thông số căn hộ, số tiền bán, ngày bán)
- Sheet 2: Lưu tiến độ yêu cầu thanh toán của tất cả các căn hộ ((1) mã căn hộ, (2) ngày cần thanh toán, (3) số tiền cần thanh toán) (mỗi căn hộ có số lần yêu cầu thanh toán khác nhau nên bảng dữ liệu này chỉ gồm 3 cột)
- Sheet 3: Lưu dữ liệu thanh toán thực tế của tất cả các khách hàng ((1) mã căn hộ, (2) ngày thanh toán, (3) số tiền thanh toán), (mỗi căn hộ có số lần thanh toán khác nhau nên bảng dữ liệu này chỉ gồm 3 cột)

Mình đã viết code để xử lý theo kiểu For ... Next và đã xử lý được, cách xử lý như sau:
Để tính lãi chậm trả cho 1 mã sản phẩm
- Gán dữ liệu sheet 2 vào mảng (AR-1)
- Gán dữ liệu sheet 3 vào mảng (AR-2)
For (1) Quét các dữ liệu trong AR-1 (để lấy từng yêu cầu thanh toán của căn hộ cần tính) (dữ liệu cần quét hàng nghìn dòng)
For (2) Quét các dữ liệu trong AR-2 (để lấy từng đợt thanh toán thực tế của căn hộ cần tính) (dữ liệu cần quét hàng nghìn dòng)
Xử lý tính toán lãi chậm trả nếu thanh toán chậm so với yêu cầu
Next 2
Next 1
Cụ thể code mình đã viết ở đây:
https://www.giaiphapexcel.com/diendan/threads/hỗ-trợ-code-vba-tính-lãi-chậm-thanh-toán.157791/
Cách làm của mình đã giải quyết được nhưng mình thấy nó hơi chậm nên muốn nhờ ACE giúp đỡ xem có nhanh hơn được không.

Ở đây mình thấy có thể nhanh hơn nếu có cách copy các dữ liệu thỏa mãn điều kiện từ 1 mảng sang 1 mảng khác mà không phải duyệt từng dữ liệu, cụ thể như sau:
- Gán dữ liệu sheet 2 vào mảng (AR-1)
- Gán dữ liệu sheet 3 vào mảng (AR-2)
- Copy dữ liệu mảng AR-1 chỉ của mã căn hộ cẩn tính sang mảng AR1.1
- Copy dữ liệu mảng AR-2 chỉ của mã căn hộ cẩn tính sang mảng AR2.1

For (1) Quét các dữ liệu trong AR-1.1 (để lấy từng yêu cầu thanh toán) (khoảng 5 hàng)
For (2) Quét các dữ liệu trong AR-2.1 (để lấy từng đợt thanh toán thực tế) (khoảng 10 hàng)
Xử lý tính toán lãi chậm trả nếu thanh toán chậm so với yêu cầu
Next 2
Next 1

Sorry vì mình không đưa ra bài toán tổng thể ban đầu mà chỉ đề nghị hỗ trợ 1 việc cụ thể (là copy các dữ liệu thỏa mãn 1 điều kiện cụ thể sang 1 mảng khác mà không cần duyệt từng dữ liệu).
(Mình đã để ý đánh máy cẩn thận, nếu có gõ nhầm ACE thông cảm nhé)
Thanks các bác
Dùng dictionary lưu lại chỉ số dòng của các tên mục cần tra cứu có lẽ sẽ cải thiện được tốc độ tính toán
 
Upvote 0
Thanks bạn, nhưng mình không muốn dùng filter trên sheet (và chưa có cách nào dùng được để giải quyết bài toán của mình).
Bài toán của mình ở đây là tính lãi chậm thanh toán bán hàng sản phẩm là căn hộ.
...
Đã nói không ưa chuyện moa toa luỹ ẻn mờ.
Thử như vầy xem có lộn ruột không:
Vê-uy-lê rơ-xơ-voa, mông-xưa-má-đàm, mê xà-luy-tế-sông đi-tinh-guy-ê
Đấy là nói lịch sự, chứ Tây bồi thì cứ pa đờ p-ró-lem.

Dùng dictionary lưu lại chỉ số dòng của các tên mục cần tra cứu có lẽ sẽ cải thiện được tốc độ tính toán
Người ta đã chê For... là chậm mờ. Đít sần của bạn có thoát đuợc For... hôn?

Toi đã mách cho cách dùng Adbanved Filter mà đâu có chịu tham khảo. Chỉ tự đoán lấy thôi.
Còn vàig cách khác, nhưngn tôi lười nói tiếng Tây quá nên để đó. Rừng còn nhiều củi. Tại người hỏi lười tra mấy bài ấy chứ cũng có vài người đã từng đưa cách không dùng For....
Kết luận chung là người này lười tra và xem xét. Chỉ muốn hỏi gì trả lời nấy thôi.
 
Lần chỉnh sửa cuối:
Upvote 0
3. muốn tôi chỉ gì thêm nữa thì sửa mấy từ tiếng Anh đi. Tôi không thích moa toa luỹ ẻn.
Thanks bạn đã góp ý
Cách làm của mình đã giải quyết được nhưng mình thấy nó hơi chậm nên muốn nhờ ACE giúp đỡ xem có nhanh hơn được không.
Sorry vì mình không đưa ra bài toán tổng thể ban đầu
(Mình đã để ý đánh máy cẩn thận, nếu có gõ nhầm ACE thông cảm nhé)
Thanks các bác
Đã được nhắc nhở vụ viết tắt và tiếng Anh rồi mà vẫn cố tình thì chịu thua.
 
Upvote 0
Đã nói không ưa chuyện moa toa luỹ ẻn mờ.
Thử như vầy xem có lộn ruột không:
Vê-uy-lê rơ-xơ-voa, mông-xưa-má-đàm, mê xà-luy-tế-sông đi-tinh-guy-ê
Đấy là nói lịch sự, chứ Tây bồi thì cứ pa đờ p-ró-lem.


Người ta đã chê For... là chậm mờ. Đít sần của bạn có thoát đuợc For hôn?

Toi đã mách cho cách dùng Adbanved Filkter mà đâu có chịu tham khảo. Chỉ tự đoán lấy thôi.
Còn vàig cách khác, nhưngn tôi lười nói tiếng Tây quá nên để đó. Rừng còn nhiều củi. Tại người hỏi lười tra mấy bài ấy chứ cũng có vài người đã từng đưa cách không dùng For....
Kết luận chung là người này lười tra và xem xét. Chỉ muón hỏi gì trả lời nấy thôi.
Dùng Advanced Filter thì tôi không biết cách xử lý hàng loạt được, muốn xử lý hàng loạt được thì phải kết hợp tiếp với macro và như thế cũng không cải thiện được tốc độ tính
 
Lần chỉnh sửa cuối:
Upvote 0
2 lỗi đánh nhanh chứ không phải 1. :p

@chủ bài #1473:
1. sao biết For...Next sẽ lâu?
2. chỉ cần lọc một mã sang sheet khác thì dùng Advanced Filter. Ở diễn đàn này có cả đống. Chỉ là về sau có mấy người khoái Đít sần cho nên cứ thấy từ "lọc, tổng" là tương đít sần vào. Muốn tìm các giải thuật khác thì chịu khó mò mấy bài cũ. Không có kiên nhẫn mò thì Record Macro.
3. muốn tôi chỉ gì thêm nữa thì sửa mấy từ tiếng Anh đi. Tôi không thích moa toa luỹ ẻn.
Trí tuệ không phải chỉ là cộng trừ nhân chia, thợ cộng trừ nhân chia tốt cũng đáng quý nhưng cũng chỉ là thợ cộng tốt thôi bạn nhé!
 
Lần chỉnh sửa cuối:
Upvote 0
Trí tuệ không phải chỉ là cộng trừ nhân chia, thợ cộng trừ nhân chia tốt cũng chỉ là thợ tốt thôi bạn nhé!
Có ai bảo dùng trí tuệ để giải quyết vấn đề này đâu? Chắc tại lo biểu diễn "trí tuệ" quá nên không thèm làm những chuyện "thợ tốt" như tra tìm những bài xưa (trong GPE)

Chú tâm vào vấn đề và chịu khó đọc thì cũng chả cần trí tuệ của các bậc cao cấp. Chỉ cẩn chuyên cần nhẫn nại của "thợ tốt" thôi.
Trích dẫn 1:
1633528300168.png
Trích dẫn 2:
1633528395601.png
 
Upvote 0
Có ai bảo dùng trí tuệ để giải quyết vấn đề này đâu? Chắc tại lo biểu diễn "trí tuệ" quá nên không thèm làm những chuyện "thợ tốt" như tra tìm những bài xưa (trong GPE)

Chú tâm vào vấn đề và chịu khó đọc thì cũng chả cần trí tuệ của các bậc cao cấp. Chỉ cẩn chuyên cần nhẫn nại của "thợ tốt" thôi.
Trích dẫn 1:
View attachment 267293
Trích dẫn 2:
View attachment 267294
Hôm nay mình mày mò thấy sử dụng SELECT SQL thì cải thiện tốc độ xử lý hơn một chút (từ khoảng 5 giây xuống còn khoảng dưới 4 giây cho 30.000 bản ghi với 2.000 vóng lặp), nhưng đổi lại thì phải dùng macro và trình bày bảng dữ liệu theo chuẩn chứ không linh hoạt nếu viết thành hàm.
Mình vẫn chưa hài lòng vì giải pháp chưa thấy hoàn chỉnh, đặc biệt là khi dữ liệu cần xử lý lớn hơn và module viết ra cần phải linh hoạt chứ không yêu cầu bắt buộc dữ liệu phải trình bày theo chuẩn để áp dụng macro.
Nói tóm lại, mình rất mong các bạn chỉ giáo có cách nào copy dữ liệu 1 mảng (2 chiều) thỏa mãn điều kiện sang 1 mảng khác trong VBA mà không phải dùng thủ công quét từng hàng trong mảng (như for .. next) nhé, đặc biệt là nhờ cao nhân thợ cộng VietMini chỉ giáo.
 
Lần chỉnh sửa cuối:
Upvote 0
Đã được nhắc nhở vụ viết tắt và tiếng Anh rồi mà vẫn cố tình thì chịu thua.
Thời sinh viên mình không phục mấy ông thầy và đến giờ rất chán mấy ông tưởng là quan lớn không biết góp ý gì, chỉ biết sửa đầu dòng phải viết hoa, thụt vào mấy ly …
 
Upvote 0
Thời sinh viên mình không phục mấy ông thầy và đến giờ rất chán mấy ông tưởng là quan lớn không biết góp ý gì, chỉ biết sửa đầu dòng phải viết hoa, thụt vào mấy ly …
Mỗi người mỗi tính, bạn không hiểu sao? Tôi không nói là không được viết tắt, không được dùng tiếng Anh. Tôi chỉ muốn nói về thực tế, sự thực dụng thôi.
Bạn không coi trọng chuyên viết tắt, bạn có quyền đó. Nhưng bạn cũng phải công nhận là người khác cũng có quyền không thích viết tắt. Bạn không thể đòi quyền tự do cho mình mà lại không cho người khác cái quyền đó. Bây giờ thế này. Bạn cần sự giúp đỡ, nhưng người có thể giúp bạn lại ra điều kiện: Không viết tắt và không dùng tiếng Anh thì tôi giúp, ngược lại tôi không giúp. Người ta có quyền ra điều kiện như thế. Bạn là con người tự do, sống ở một đất nước tự do, bạn có quyền chọn một trong hai. Nếu bạn chọn "ngược lại" thì tôi vẫn tôn trọng sự lựa chọn của bạn, nhưng lúc đó bạn sẽ không nhận được sự giúp đỡ. Bạn có quyền lờ yêu cầu của người ta, và người ta cũng có quyền từ chối giúp bạn. Không có chuyện bịt mồm và im lặng cầy hộ người khác đâu. "Chịu thua" là như thế. Nếu bạn không thỏa mãn yêu cầu của người không chấp nhận viết tắt thì chỉ còn cách là kiên nhẫn chờ những người "dễ tính" thôi. Không còn cách nào khác. Chúc may mắn.
 
Upvote 0
Thời sinh viên mình không phục mấy ông thầy và đến giờ rất chán mấy ông tưởng là quan lớn không biết góp ý gì, chỉ biết sửa đầu dòng phải viết hoa, thụt vào mấy ly …
Ngược lại, thời học sinh và sinh viên tôi rất trọng thầy trọng bạn. Có lẽ nhờ vậy mà tôi học được tính cần cù. Tôi hỏi được từ Thầy, xin được giúp đỡ từ bạn. Chứ đem "trí tuệ" ra thì chắc tôi dưới trung bình.

... nhờ cao nhân thợ cộng VietMini chỉ giáo.
Cuối cùng cũng lòi cái bản tính phân biệt dân thầy dân thợ.
Miệng thì phê làm phách "mấy ông tưởng là quan lớn", môi thì trề khinh thường "mấy cậu nhận làm dân thợ".
 
Upvote 0
Em chào các vị tiền bối.
Xin cho em hỏi một câu về mảng như sau ạ:
Em có vùng A1:A3 với A1 lưu số 1, B1 lưu số 2, A3 là công thức =A1+B1
Khi gán range("A1:C1") cho mảng Arr() để thực hiện một số câu lệnh, sau đó gán lại mảng Arr() vào range("A3:C3") thì C3 mất dữ liệu.
Vậy làm sao để C3 vẫn giữ được công thức như C1, cụ thể là C3 =A3+B3 ạ??

Em gửi file đính kèm, mọi người xem giúp em với.

1640330147160.png
 

File đính kèm

  • Gan Arr ve Range giu nguyen cong thuc.xlsm
    15 KB · Đọc: 7
Upvote 0
Em chào các vị tiền bối.
Xin cho em hỏi một câu về mảng như sau ạ:
Em có vùng A1:A3 với A1 lưu số 1, B1 lưu số 2, A3 là công thức =A1+B1
Khi gán range("A1:C1") cho mảng Arr() để thực hiện một số câu lệnh, sau đó gán lại mảng Arr() vào range("A3:C3") thì C3 mất dữ liệu.
Vậy làm sao để C3 vẫn giữ được công thức như C1, cụ thể là C3 =A3+B3 ạ??

Em gửi file đính kèm, mọi người xem giúp em với.
Bạn sửa lại code như sau:
Mã:
Sub test()
Dim Arr() As Variant
    Arr = Range("A1:C1").FormulaR1C1
    
    Range("A3:C3") = Arr

End Sub
 
Upvote 0
Khi gán range("A1:C1") cho mảng Arr() để thực hiện một số câu lệnh, sau đó gán lại mảng Arr() vào range("A3:C3") thì C3 mất dữ liệu.
Chỉ có thể mất công thức chứ làm gì có chuyện mất dữ liệu. Lấy lên 3 giá trị ô mà gán xuống chỉ 2 ô thì cái gì mà còn.

1640398107801.png
 
Upvote 0
Cho em hỏi câu nữa về mảng.
khi ô dữ liệu của em có dạng công thức, cụ thể là =204-4,
em tạo mảng để lưu trữ ô dữ liệu này, thì phần tử mảng có dạng arr(1,2) = "=204-4", arr(1,1) = "2"
vậy em phải xử lý như nào để có thể convert được nó sang double với giá trị arr(1,2) = 200 để có thể thực hiện các tính toán liên quan là arr(1,1)*arr(1,2) = 400 ạ?
 
Upvote 0
Cho em hỏi câu nữa về mảng.
khi ô dữ liệu của em có dạng công thức, cụ thể là =204-4,
em tạo mảng để lưu trữ ô dữ liệu này, thì phần tử mảng có dạng arr(1,2) = "=204-4",
Thì khi gán vào mảng Arr phải dùng thuộc tính Value thôi.

Có ai đó dí súng vào đầu bắt dùng thuộc tính FormulaR1C1 à? Suy nghĩ chút đi.

Nguyên nhân sai ở bài 1489 đã được chỉ rõ ở bài 1492 chứ không phải do không dùng FormulaR1C1 như gợi ý ở bài 1490.

Chắc không thèm đọc bài 1492 nên mới ra cơ sự này.
 
Upvote 0
Thì khi gán vào mảng Arr phải dùng thuộc tính Value thôi.

Có ai đó dí súng vào đầu bắt dùng thuộc tính FormulaR1C1 à? Suy nghĩ chút đi.

Nguyên nhân sai ở bài 1489 đã được chỉ rõ ở bài 1492 chứ không phải do không dùng FormulaR1C1 như gợi ý ở bài 1490.

Chắc không thèm đọc bài 1492 nên mới ra cơ sự này.
các bước đi của em như này,
1 range có nhiều dòng khác nhau, dòng cuối cùng có công thức tính tổng của các dòng dữ liệu bên trên

Khi gán range cho 1 array, thực hiện tính toán các dòng khác nhau trong array, sau đó gán array trở lại range.
Nhưng ô cuối cùng trong range đó em muốn giữ nguyên công thức tổng các dòng trên nên phải dùng FormulaR1C1, lý do là vậy.
Nhưng các dòng chi tiết trong range thì em có sự giảm dần (tức là thực hiện phép tính = 204-4), và vì ô đó có sự giảm dần nên khi em tính toán cho lần gán range vào array tiếp theo mới gặp vấn đề khó khăn này.
Còn lại bài 1492 em đã đọc và biết lần trước em thiếu ở đâu rồi.

Các bác có cao kiến nào xử lý vấn đề trên chỉ giúp em.
 
Upvote 0
Nhưng ô cuối cùng trong range đó em muốn giữ nguyên công thức tổng các dòng trên nên phải dùng FormulaR1C1,
Ô có công thức, và không cần chỉnh sửa gì thì tại sao lại nhập vào mảng? Rỗi hơi chăng?

Mà vấn đề cụ thể ra sao thì phải đính kèm tập tin và giải thích cặn kẽ cần làm gì. Vài giọt nước bọt không đủ.

Còn lại bài 1492 em đã đọc và biết lần trước em thiếu ở đâu rồi.


Nếu đã đọc bài 1492 mà không muốn cám ơn thì cũng nên chọn "Chấp nhận" hoặc "Ngạc nhiên" để người khác biết mình cũng đã đọc.
 
Lần chỉnh sửa cuối:
Upvote 0
Ô có công thức, và không cần chỉnh sửa gì thì tại sao lại nhập vào mảng? Rỗi hơi chăng?
file của em có mấy chục bảng nhỏ, dòng cuối cùng của mỗi bảng nhỏ có ô tính tổng của các dòng của bảng nhỏ đó, nên em phải gán toàn bộ vùng có dữ liệu (gồm mấy chục bảng đó vào array) để xử lý 1 lần thôi cho toàn bộ chứ không thể tách riêng được, bác thông cảm.
 
Upvote 0
file của em có mấy chục bảng nhỏ, dòng cuối cùng của mỗi bảng nhỏ có ô tính tổng của các dòng của bảng nhỏ đó, nên em phải gán toàn bộ vùng có dữ liệu (gồm mấy chục bảng đó vào array) để xử lý 1 lần thôi cho toàn bộ chứ không thể tách riêng được, bác thông cảm.
Nếu cứ muốn thế thì

a = Evaluate(Arr(1, 2))
 
Upvote 0
Web KT

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

Back
Top Bottom