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,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ị
 
Như vậy là với bài tập trên của em ta không nhất thiết phải sử dụng Redim . Tuy nhiên em vẫn chưa thấy được tầm quan trọng của nó. Bây giờ mọi người có thể cho em 1 ví dụ nào đơn giản mà bắt buộc phải dùng đến Redim được không ạ để em thực sự thấy được sự cần thiết -phải có nó
 
Upvote 0
Như vậy là với bài tập trên của em ta không nhất thiết phải sử dụng Redim . Tuy nhiên em vẫn chưa thấy được tầm quan trọng của nó. Bây giờ mọi người có thể cho em 1 ví dụ nào đơn giản mà bắt buộc phải dùng đến Redim được không ạ để em thực sự thấy được sự cần thiết -phải có nó

Ví dụ:
ReDim arr(1 to n)
Với n là một biến mà bằng cách nào đó bạn phải tính toán mới có được (chẳng hạn n = rng.Rows.Count)
Vậy theo nguyên tắc thì bạn không thể Dim arr(1 to n) được mà BUỘC phải ReDim
Bởi quy định:
- Nếu n là con số "chết" cụ thể nào đó, chẳng hạn là 100 thì bạn được quyền Dim arr(1 to 100)
- Nếu n là biến mà bạn cố tình Dim arr(1 to n) thì Excel sẽ báo lỗi ngay lập tức
Anh Bill nói vậy!
 
Upvote 0
Ví dụ đơn giản:
Tôi cần một mảng để chứa n trị integer. Tôi chưa biết n là bao nhiêu.
Tôi có 2 cách code:
1. Mảng tĩnh: Tôi khai báo một mảng rất lớn - để chắc ăn là số phần tử nhiều hơn n. Và tôi phải luôn ghi nhớ rằng những phần tử sau n không dùng đến.
2. Mảng động: tôi khai báo tên mảng. Cần đến bao nhiêu, tôi lại redim đến đó.

Nhắc lại bài trước đây:
Dim a(1 to 100) là mảng tĩnh. Khai báo xong là xài được rồi. Kích cỡ (100 phần tử) và hình dáng (mảng 1 chiều) đã được cố định.
Dim a() là mảng động, chỉ có cái tên chứ chưa xài được. Chỉ sau khi Redim(...) thì mảng mới có thực chất. Lúc Redim là lúc bạn cho nó kích cỡ và hình dáng.

Chú thêm:
Dim là lệnh khai báo. Bạn dùng nó để khai báo cho trình dịch VBA biết rằng bạn sẽ sử dụng một biến như thế. Lúc khai báo bạn có quyền chọn là tĩnh hay động.
Redim là lệnh thi hành. Bạn dùng nó để ra lệnh VBA chuyển kích cỡ và hình dạng của mảng như bạn cần. Dĩ nhiên, VBA chỉ có thể chuyển dạng được mảng động.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ các thầy/cô/anh/chị và bạn giải thích giúp em trong CODE này tại sao er lại phải cộng thêm 1 trong khi vùng dữ liệu chỉ là từ A2:F21

(trong phần chú thích CODE em có ghi rõ câu hỏi rồi đó ạ. CODE này để tính tổng cho từng bộ phận). Em xin cám ơn !
 

File đính kèm

  • mang1.xls
    45 KB · Đọc: 36
Upvote 0
Nhờ các thầy/cô/anh/chị và bạn giải thích giúp em trong CODE này tại sao er lại phải cộng thêm 1 trong khi vùng dữ liệu chỉ là từ A2:F21

(trong phần chú thích CODE em có ghi rõ câu hỏi rồi đó ạ. CODE này để tính tổng cho từng bộ phận). Em xin cám ơn !
bạn không nên hỏi tại sao er lại phải cộng thêm 1 ? vì mỗi người có 1 cách suy nghĩ khác nhau nên mỗi người có một cách viết khác nhau theo lối suy nghĩ của người ta. Bạn nên hỏi là từ đầu vào này làm sao có được đầu ra thì mọi người sẽ tư duy giúp bạn, chứ bạn hỏi như vậy, tôi cá rằng rất rất ít người đọc lại đống code của bạn rồi trả lời cho bạn, làm biếng hiểu ý của người khác lắm.
 
Upvote 0
bạn không nên hỏi tại sao er lại phải cộng thêm 1 ? vì mỗi người có 1 cách suy nghĩ khác nhau nên mỗi người có một cách viết khác nhau theo lối suy nghĩ của người ta. Bạn nên hỏi là từ đầu vào này làm sao có được đầu ra thì mọi người sẽ tư duy giúp bạn, chứ bạn hỏi như vậy, tôi cá rằng rất rất ít người đọc lại đống code của bạn rồi trả lời cho bạn, làm biếng hiểu ý của người khác lắm.

Em cũng không biết phải diễn đạt bằng cách nào để mọi người dễ hiểu hơn nữa. Tuy nhiên để hiểu đc thắc mắc của em cũng không cần phải đọc hết CODE đâu anh. Dễ hiểu lắm mà anh. Vùng chứa dữ liệu chỉ là từ A2:F21 thôi thế mà trong đoạn CODE er đã bằng 21 rồi tại sao lại phải cộng thêm 1 thế hóa ra mảng arr1 gồm các giá trị trong vùng A2:F22 --->bị thừa ra 1 dòng là sao ạ ??? Mong anh và mọi người hiểu đc khúc mắc của em và giải thích dùm em với...
 
Lần chỉnh sửa cuối:
Upvote 0
Em cũng không biết phải diễn đạt bằng cách nào để mọi người dễ hiểu hơn nữa. Tuy nhiên để hiểu đc thắc mắc của em cũng không cần phải đọc hết CODE đâu anh. Dễ hiểu lắm mà anh. Vùng chứa dữ liệu chỉ là từ A2:F21 thôi thế mà trong đoạn CODE er đã bằng 21 rồi tại sao lại phải cộng thêm 1 thế hóa ra mảng arr1 gồm các giá trị trong vùng A2:F22 --->bị thừa ra 1 dòng là sao ạ ??? Mong anh và mọi người hiểu đc khúc mắc của em và giải thích dùm em với...

thử lại er+1 thành er+0 xem có sao không, khôgn sao cả, nên đó lệnh viết thừa

Nhưng toàn bộ code đó có thể bỏ đi, vì excel có chức năng subtotal rồi: Data / subtotal...
 
Upvote 0
Em cũng không biết phải diễn đạt bằng cách nào để mọi người dễ hiểu hơn nữa. Tuy nhiên để hiểu đc thắc mắc của em cũng không cần phải đọc hết CODE đâu anh. Dễ hiểu lắm mà anh. Vùng chứa dữ liệu chỉ là từ A2:F21 thôi thế mà trong đoạn CODE er đã bằng 21 rồi tại sao lại phải cộng thêm 1 thế hóa ra mảng arr1 gồm các giá trị trong vùng A2:F22 --->bị thừa ra 1 dòng là sao ạ ??? Mong anh và mọi người hiểu đc khúc mắc của em và giải thích dùm em với...

à mấy cái này cứ để chuyên gia ba xàm trả lời nè
là vì có dòng này
Mã:
If arr1(i, 4) <> arr1(i + 1, 4) Then
đây không phải là chuyện thích hay không thích mà là với cách viết IF như này thì bắt buộc phải lấy dư 1 dòng
bạn xóa thử +1 chỗ er + 1 thử xem sao ?
 
Upvote 0
Để bạn ấy tự bỏ cho hiểu hơn, lúc đó thì mới à à ... ra thế.
bạn đừng lảng sang chuyện của người khác . tôi nhắc lại
bạn nói rằng

thử lại er+1 thành er+0 xem có sao không, khôgn sao cả, nên đó lệnh viết thừa

Nhưng toàn bộ code đó có thể bỏ đi, vì excel có chức năng subtotal rồi: Data / subtotal...

xin bạn giải thích ý nghĩa dòng màu đỏ
 
Upvote 0
bạn đừng lảng sang chuyện của người khác . tôi nhắc lại
bạn nói rằng



xin bạn giải thích ý nghĩa dòng màu đỏ

Tôi trả lời cho người hỏi, không trả lời cho bạn,
Nếu bỏ đi có cách sửa , vì thực chất là nó thừa, Arr1 không chứa dữ liệu nào ở dòng 22 đó.
 
Upvote 0
Tôi trả lời cho người hỏi, không trả lời cho bạn,
Nếu bỏ đi có cách sửa , vì thực chất là nó thừa, Arr1 không chứa dữ liệu nào ở dòng 22 đó.
bạn trả lời cho người khác , nhưng đây là diễn đàn chung , bạn trả lời tầm bậy thì người khác phải lên tiếng
bạn nói rằng bỏ chỗ + 1 của er + 1 đi có sao không ? không sao cả , lệnh đó viết thừa
nhưng sau đó không hề nêu hướng sửa => 1000 người vào đọc thì bao nhiêu người hiểu là chỉ cần xóa chỗ + 1 thì code vẫn chạy đúng ? bạn trả lời xem ?
đây là đang thắc mắc về mảng trong VBA mà lại nêu sang hướng Data/subtotal ?
 
Upvote 0
bạn trả lời cho người khác , nhưng đây là diễn đàn chung , bạn trả lời tầm bậy thì người khác phải lên tiếng
bạn nói rằng bỏ chỗ + 1 của er + 1 đi có sao không ? không sao cả , lệnh đó viết thừa
nhưng sau đó không hề nêu hướng sửa => 1000 người vào đọc thì bao nhiêu người hiểu là chỉ cần xóa chỗ + 1 thì code vẫn chạy đúng ? bạn trả lời xem ?
đây là đang thắc mắc về mảng trong VBA mà lại nêu sang hướng Data/subtotal ?

Bạn đang spam quá nhiều đó, hãy để chủ nhân câu hỏi trả lời, khi người ta ngộ ra điều sai thì người ta mới thấy là sao nó cần và dễ nhớ hơn....

Còn thừa thì là thừa vì nó không cần thiết,... Toàn bộ đoạn code cũng không cần lắm, lời khuyên là dùng công cụ sẵn của Excel thì hay hơn.. ngay cả code thì nếu có công cụ thì code dụng công cụ excel luôn cũng hay hơn nhiều.
 
Upvote 0
Bạn đang spam quá nhiều đó, hãy để chủ nhân câu hỏi trả lời, khi người ta ngộ ra điều sai thì người ta mới thấy là sao nó cần và dễ nhớ hơn....

Còn thừa thì là thừa vì nó không cần thiết,... Toàn bộ đoạn code cũng không cần lắm, lời khuyên là dùng công cụ sẵn của Excel thì hay hơn.. ngay cả code thì nếu có công cụ thì code dụng công cụ excel luôn cũng hay hơn nhiều.
Spam ??? tôi đang nói về những điều nằm ngoài câu hỏi của KhuongVietPhong ????
trả lời tầm bậy rồi nói là đợi người hỏi ngộ ra cái sai ? chết cười với độ chơi lầy của vị "tiên sinh" này
ở đây là đang trau dồi kiến thức về mảng VBA thì lại lái sang vấn đề công cụ Excel ? tôi lại phải tiếp tục chào thua cái độ chơi lầy của vị "tiên sinh" này lần nữa ? =))
 
Upvote 0
Spam ??? tôi đang nói về những điều nằm ngoài câu hỏi của KhuongVietPhong ????
trả lời tầm bậy rồi nói là đợi người hỏi ngộ ra cái sai ? chết cười với độ chơi lầy của vị "tiên sinh" này
ở đây là đang trau dồi kiến thức về mảng VBA thì lại lái sang vấn đề công cụ Excel ? tôi lại phải tiếp tục chào thua cái độ chơi lầy của vị "tiên sinh" này lần nữa ? =))

Rõ là thừa vì không chứa dữ liệu, còn vẫn thích kiểu thừa thì cứ để thôi. Còn phán bài người khác là tầm bậy, thì bạn là trên cả tầm đó rôi - khỏi định nghĩa...
 
Upvote 0
à mấy cái này cứ để chuyên gia ba xàm trả lời nè
là vì có dòng này
Mã:
If arr1(i, 4) <> arr1(i + 1, 4) Then
đây không phải là chuyện thích hay không thích mà là với cách viết IF như này thì bắt buộc phải lấy dư 1 dòng
bạn xóa thử +1 chỗ er + 1 thử xem sao ?
Ý chà chà . Hóa ra nguyên nhân nó nằm tại chổ này If arr1(i, 4) <> arr1(i + 1, 4)...Anh DoveangRose siêu quá. Cảm ơn anh nhiều nghen :-=:-=
 
Upvote 0
thử lại er+1 thành er+0 xem có sao không, khôgn sao cả, nên đó lệnh viết thừa
Tất nhiên là mình đã thử rồi và không được thì mình mới hỏi diễn đàn bạn ạ vì thế chắc không phải thừa như bạn nói đâu.
Tuy nhiên nếu bạn vẫn bảo vệ ý kiến của bạn thì bạn phải chứng minh được cho mọi người thấy rằng nó đúng. Hiện tại mình vẫn chưa thấy bạn làm được điều này. Còn nếu chẳng may đã nhầm rồi thì ta nhận ta sai thôi chứ có gì to tát đâu.... bởi trong cuộc sống nhầm lẫn là chuyện hết sức bình thường mà bạn ....có nhầm lẫn thì bữa sau mới ngộ ra được nhiều điều :-=:-=
Nhưng toàn bộ code đó có thể bỏ đi, vì excel có chức năng subtotal rồi: Data / subtotal...
Mình biết, nhưng ở đây mình đang học về CODE nên muốn dùng CODE để giải quết vấn đề nếu không mình đã chẳng đăng vào box Lập trình với Excel

 
Lần chỉnh sửa cuối:
Upvote 0
Mình có ví dụ, có thể là vừa tầm với bạn đây:

Như vậy là với BT trên ta không nhất thiết phải sử dụng Redim.
Tuy nhiên em vẫn chưa thấy được tầm quan trọng của nó.
Bây giờ mọi người có thể cho em 1 ví dụ nào đơn giản mà bắt buộc phải dùng đến Redim được không ạ để em thực sự thấy được sự cần thiết -phải có nó

Giả dụ chúng ta có bảng đơn giá của các nhà cung cấp cho các mã mặt hàng như hình (Bảng dữ liệu có màu nền trong hình)
Giờ đây ta muốn lập bảng dữ liệu khác hơn, chỉ gồm 3 cột
Để làm việc này, mình đã viết 2 hàm người dùng như sau:

PHP:
Option Explicit
Dim Arr(), Dg As Long
Dim rDL As Range, rNCC As Range
Function XoayBang(DuLieu As Range, NCC As Range)
 Dim Cot As Byte, W As Byte, Tmp As Byte, J As Byte
  
 Dg = DuLieu.Rows.Count:                            Cot = NCC.Cells.Count
3 ReDim Arr(1 To Dg * Cot, 1 To 3)
 Set rDL = DuLieu:                                  Set rNCC = NCC
 For J = 1 To Cot
    Tmp = GPE((J - 1) * Dg + 1, J * Dg, J)
 Next J
8 XoayBang = Arr()
 Erase Arr():                                       Set rDL = Nothing
End Function
Mã:
[b]
Function GPE(BD As Byte, KT As Byte, STT As Byte)[/b]
 Dim J As Integer, Tmp As Long
 
 Tmp = Dg * (STT - 1)
 For J = BD To KT
4    Arr(J, 1) = rDL(1).Offset(J - BD).Value
    Arr(J, 2) = rDL(2).Offset(J - BD).Value
6    Arr(J, 3) = rNCC(STT).Value
 Next J
 GPE = J
[b]End Function [/b]

Ở đây mình fải khai báo biến mảng dùng chung Arr() (cho 2 hàm người dùng)
Bạn chỉ cần chú í các dòng lệnh có đánh số sẽ có thể rõ vấn đề hơn.

Những mong ít nhiều hỗ trợ được bạn fần nào & chúc vui!
 

File đính kèm

  • ChuyenVi.JPG
    ChuyenVi.JPG
    53.9 KB · Đọc: 65
Upvote 0
Web KT
Back
Top Bottom