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ị
 
Để 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
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 :-=:-=

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


vậy thì xem đi, chỉ sửa theo code của bạn thui (còn code này còn nhiều điểm cần gọn hơn)

Mã:
Sub TaoTotal01()

Dim er&, i&, k&, ir&
Dim arr1, arr2

With Sheets("Data")
  er = .Cells(65000, 1).End(3).Row ' er = 21
  arr1 = .Range("A2:F" & er).Value  ' tai sao phai cong them 1 moi duoc ??????
End With

ReDim arr2(1 To UBound(arr1) * 2, 1 To 6) 'co the thay bang: arr2(1 to 26, 1 to 6)

Dim n&
Dim bo As Boolean
n = UBound(arr1)
s = 0: ir = 0 ' gan s =0 va ir = 0
For i = 1 To n  ' i chay tu 1 den 20
  s = s + 1
  ir = ir + 1
  arr2(s, 1) = ir ' phan tu dong s cot 1 cua mang 2 = ir
  
  For k = 2 To 6
    arr2(s, k) = arr1(i, k) 'phan tu dong s cot k cua mang 2 = pt dong i cot k mang 1
  Next k
  
  
  If i < n Then
        bo = arr1(i, 4) <> arr1(i + 1, 4)
  Else: bo = True:  End If
  
  If bo Then ' Neu pt dong i cot 4 <> pt dong i+1 cot 4
    s = s + 1
    arr2(s, 6) = "=SUbtotal(9,R[-1]C:R[-" & ir & "]C)"
    arr2(s, 3) = "Cong"
    ir = 0
  End If
  
Next i
arr2(s + 1, 3) = "Tong cong"
arr2(s + 1, 6) = "=SUbtotal(9,R[-" & s & "]C:R[-1]C)"

With Sheets("TH")
  .[A2].Resize(s + 1, 6).Value = arr2
End With

End Sub
 
Upvote 0
vậy thì xem đi, chỉ sửa theo code của bạn thui (còn code này còn nhiều điểm cần gọn hơn)

Mã:
Sub TaoTotal01()

Dim er&, i&, k&, ir&
Dim arr1, arr2

With Sheets("Data")
  er = .Cells(65000, 1).End(3).Row ' er = 21
  arr1 = .Range("A2:F" & er).Value  ' tai sao phai cong them 1 moi duoc ??????
End With

ReDim arr2(1 To UBound(arr1) * 2, 1 To 6) 'co the thay bang: arr2(1 to 26, 1 to 6)

[COLOR=#ff0000][B]Dim n&
Dim bo As Boolean[/B][/COLOR]
n = UBound(arr1)
s = 0: ir = 0 ' gan s =0 va ir = 0
For i = 1 To n  ' i chay tu 1 den 20
  s = s + 1
  ir = ir + 1
  arr2(s, 1) = ir ' phan tu dong s cot 1 cua mang 2 = ir
  
  For k = 2 To 6
    arr2(s, k) = arr1(i, k) 'phan tu dong s cot k cua mang 2 = pt dong i cot k mang 1
  Next k
  
  
  [COLOR=#ff0000][B]If i < n Then
        bo = arr1(i, 4) <> arr1(i + 1, 4)
  Else: bo = True:  End If
  
  If bo Then[/B][/COLOR] ' Neu pt dong i cot 4 <> pt dong i+1 cot 4
    s = s + 1
    arr2(s, 6) = "=SUbtotal(9,R[-1]C:R[-" & ir & "]C)"
    arr2(s, 3) = "Cong"
    ir = 0
  End If
  
Next i
arr2(s + 1, 3) = "Tong cong"
arr2(s + 1, 6) = "=SUbtotal(9,R[-" & s & "]C:R[-1]C)"

With Sheets("TH")
  .[A2].Resize(s + 1, 6).Value = arr2
End With

End Sub

OK. Trước tiên rất cám ơn bạn vì đã tham gia tranh luận rất nhiệt tình. Tuy nhiên, đọc CODE của bạn mình cũng hiểu được thực chất bạn đã dùng thêm hàm IF để ngăn cho câu lệnh If arr1(i, 4) <> arr1(i + 1, 4) - khi i đạt đến giá trị 20 không xảy ra được nên CODE chạy ngon lành mà không báo lỗi gì. Nhưng như vậy mình thấy có khi cứ làm như ban đầu CODE của mình thì sẽ ngắn gọn hơn chút tất nhiên cách của bạn cũng là 1 ý tưởng hay và qua đó cũng thể hiện bạn có hiểu vấn đề rắc rối của mình.

Tuy nhiên ban đầu bạn lại nói là đoạn "er +1 trong CODE của mình thì +1 là thừa, có thể bỏ đi" (mình dẫn y nguyên câu nói của bạn không thêm không bớt) như vậy là vẫn SAI. Bởi nếu đã là thừa thì ta có quền vứt quách nó đi và không phải thêm bất cứ gì nữa mà vẫn chẳng ảnh hưởng gì đến CODE --> đó thì đó mới gọi là THỪA. Nhưng ở đây của bạn, bạn vứt bỏ nó đi tuy nhiên bạn lại phải viết thêm 1 đoạn CODE khác vào cho nó (đoạn bôi đỏ trong CODE của bạn) thì nó mới chạy được thì đó không gọi là THỪA được.Bởi bạn đã tác động vào nó làm cho nó không còn bản chất như ban đầu nữa...đúng không ?? Như vậy làm sao gọi là thừa được...đúng chưa bạn ??? Bạn phải công nhận điều này nhé.:-=:-=

Cảm ơn các anh/bạn đã tham gia trả lời vào câu hỏi này. Hi vọng anh em không vì 1 bài tập nhỏ này mà bất đồng quan điểm. Cuối cùng chúc mọi người vui vẻ :-=:-=
 
Lần chỉnh sửa cuối:
Upvote 0
Tuy nhiên ban đầu bạn lại nói là đoạn "er +1 trong CODE của mình thì +1 là thừa, có thể bỏ đi" (mình dẫn y nguyên câu nói của bạn không thêm không bớt) như vậy là vẫn SAI.

Cứ xem như cách hiểu vấn đề mỗi người mỗi khác. Đa số chúng ta nói THỪA đồng nghĩa là CÓ THỂ BỎ ĐI nhưng người khác hiểu THỪA là thứ gì đó... ai mà biết được
Nói chung cuối cùng bạn hiểu ra vấn đề là đủ rồi
--------------------------------
(Ba ông cộng lại, ai mà chịu nỗi --=0)
 
Upvote 0
Bài của bạn không hẳn là bài toán mảng thuần tuý. Có thể nói nó thuộc về bài "thuật toán tính tổng theo nhóm".

Lô gic của bài toán tính tổng là duyệt mảng, thấy hết nhóm thì tính tổng và bắt đầu nhóm mới. Vấn đề căn bản của bài toán này xoay quanh việc làm thế nào để nhận ra là đã đến cuối nhóm và bắt đầu nhóm mới.

Để thực hiện việc "nhận thức hết nhóm" bài của bạn dùng thuật toán "nhìn trước". Vì thuật toán này nhìn trước sử dụng phân tử i+1 cho nên sẽ bị error khi i là phần tử cuối mảng. Lý do đơn giản là phần tử cuối mảng không có phần tử kế tiếp nó.
Để khắc phục lỗi này, bạn đã dùng phương pháp giản dị là cộng thêm 1 phần tử giả, đi sau phần tử cuối cùng. Lưu ý tôi dùng từ "giản dị".

Cách của bạn không sai, và tôi có nhấn mạnh là nó rất đơn giản. Tuy nhiên, theo bình diện lập trình lý thuyết (lưu ý ở đây tôi dùng từ "lý thuyết") thì tạo phần tử giả là chuyện bất đắc dĩ mới phải dùng tới. Tôi nghĩ lý do bạn kia nói "thừa" là chỗ đó.

Tôi chỉ giải thích nghĩa của từ "thừa" thôi, không chủ ý bàn thêm về thuật toán tính tổng nhóm. Bởi vì ưu khuyết điểm của các thuật toán còn tuỳ thuuộc vào tình huống.

Chú: bạn có cách đặt tên biến hơi khó hiểu.
1. tên er thường thường giành cho lỗi. Đọc thấy er, tôi chới với không hiểu bạn muốn bắt lỗi chỗ nào.
2. trong trường hợp chạy 2 mảng song song như thế, bạn dùng chỉ số s và ir nó hơi khó hiểu và khó kiểm soát. Nếu bạn đã dùng arr1 và arr2 thì tại sao khong dùng i1 và i2, hay rw1 và rw2
3. thường thường k dùng để làm số đếm. Nếu cần chỉ số cột thì người ta dùng j hoặc cot, col
Tôi chỉ nói theo kinh nghiệm lập trình thôi. Đặt tên biến là quyền của bạn, cái nào VBA không giành làm từ khoá riêng thì bạn có quyền dùng. Bạn có quyền cọi cột là dòng và range là sh VBA cũng hiểu tuốt.
 
Upvote 0
Em xin cảm ơn và tiếp thu những góp ý của tác giả Vetmini, bài toán này thực chất em đã làm được bằng cách dùng For-Next nhưng vì em đang học về mảng nên muốn chuyển nó sang Array để thực hành luôn. Xin nói thêm, file trên và CODE trên là do em lượm được của tác giả ThuNghi về mổ xẻ ra để ngâm cứu. Thú thật là em cũng thấy không "hào hứng" lắm với cách đặt tên biến của tác giả nhưng vì CODE khá dài nên em chỉ đổi tên lại 2 biến sarr rarr của tác giả tương ứng thành arr1arr2 cho dễ hiểu còn mấy cái er, ir ,,.. thì thôi em ngại quá chẳng buồn chuyển nữa..Tóm lại là em cũng hổng quen với kiểu gọi tên biến thế này đâu.
 
Lần chỉnh sửa cuối:
Upvote 0
OK. Trước tiên rất cám ơn bạn vì đã tham gia tranh luận rất nhiệt tình. Tuy nhiên, đọc CODE của bạn mình cũng hiểu được thực chất bạn đã dùng thêm hàm IF để ngăn cho câu lệnh If arr1(i, 4) <> arr1(i + 1, 4) - khi i đạt đến giá trị 20 không xảy ra được nên CODE chạy ngon lành mà không báo lỗi gì. Nhưng như vậy mình thấy có khi cứ làm như ban đầu CODE của mình thì sẽ ngắn gọn hơn chút tất nhiên cách của bạn cũng là 1 ý tưởng hay và qua đó cũng thể hiện bạn có hiểu vấn đề rắc rối của mình.

Tuy nhiên ban đầu bạn lại nói là đoạn "er +1 trong CODE của mình thì +1 là thừa, có thể bỏ đi" (mình dẫn y nguyên câu nói của bạn không thêm không bớt) như vậy là vẫn SAI. Bởi nếu đã là thừa thì ta có quền vứt quách nó đi và không phải thêm bất cứ gì nữa mà vẫn chẳng ảnh hưởng gì đến CODE --> đó thì đó mới gọi là THỪA. Nhưng ở đây của bạn, bạn vứt bỏ nó đi tuy nhiên bạn lại phải viết thêm 1 đoạn CODE khác vào cho nó (đoạn bôi đỏ trong CODE của bạn) thì nó mới chạy được thì đó không gọi là THỪA được.Bởi bạn đã tác động vào nó làm cho nó không còn bản chất như ban đầu nữa...đúng không ?? Như vậy làm sao gọi là thừa được...đúng chưa bạn ??? Bạn phải công nhận điều này nhé.:-=:-=

Cảm ơn các anh/bạn đã tham gia trả lời vào câu hỏi này. Hi vọng anh em không vì 1 bài tập nhỏ này mà bất đồng quan điểm. Cuối cùng chúc mọi người vui vẻ :-=:-=

Tóm lại thừa là thừa , bạn không cần lý luận nhiều đừng theo kiểu các trẻ trâu ngoài đời kia; nâng tầm mình lên, tôi giúp người khác là cho họ cần câu không phải con cá đã rán. E rằng bạn còn cần tìm hiểu thêm nữa mới ngộ ra.

P/S: lần sau bạn trích code của ai thì cần ghi rõ nguồn và tên của tác giả đó, không phải 1 hồi rồi nói code của người khác còn nói không thích.
 
Lần chỉnh sửa cuối:
Upvote 0
Tóm lại thừa là thừa , bạn không cần lý luận nhiều đừng theo kiểu các trẻ trâu ngoài đời kia; nâng tầm mình lên, tôi giúp người khác là cho họ cần câu không phải con cá đã rán. E rằng bạn còn cần tìm hiểu thêm nữa mới ngộ ra.
Chỉ sợ là cần câu của bạn không có lưỡi câu, cho người ta người ta câu hoài không có cá thì thôi cho con cá còn tốt hơn.
 
Upvote 0
Chỉ sợ là cần câu của bạn không có lưỡi câu, cho người ta người ta câu hoài không có cá thì thôi cho con cá còn tốt hơn.

Cám ơn bạn. CÒn tùy thuộc người câu thế nào, và từ từ đầu tiên phải vót cần trước đừng nghĩ đến lưỡi vội. Như kiêu người bệnh phải uống thuốc từ từ, tránh sốc.
 
Upvote 0
Qua 1 số bài viết ở trên. Tôi e rằng bạn mới là ngừoi có lối trẻ trâu ấy. Mới cần tìm hiểu thêm...
thôi đừng nói về những chuyện không liên quan đến topic
cuộc sống muôn màu mà , trên trường lớp cũng đâu thiếu các giáo viên giảng bài vớ vẩn cho học trò về áp dụng vô làm bài tập ra kết quả sai bét , phụ huynh hỏi tại sao thì giáo viên giải thích đơn giản : tôi cố tình giảng sai để giúp các em nó tự ngộ ra chỗ sai , giúp nhớ bài lâu . Diễn đàn cũng vậy . Không nên phí thời gian tranh cãi đúng sai với những người này . Để tự có công luận phán xét
Đi giúp người khác mà trong lòng họ tự hứa với lòng lần sau thà không biết làm chứ không muốn nghe thêm lời nào của vị "chuyên gia" này thì đó cũng là cách sống , bạn không cấm được các "chuyên gia" này
 
Upvote 0
/-)ừng có bề trên, bố thí kiến thức theo kiểu bố thí nhỏ giọt cho kẻ ăn mày!

Chuyện này cũng có thể coi cho cần câu để câu cá ngừ đại dương trên biển hồ!
 
Upvote 0
Web KT

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

Back
Top Bottom