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ị
 
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
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.
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...
 
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
Đây là diễn đàn học hỏi. Bàn chuyện đúng sai thì nên nói rõ. Nói kiểu cộc lốc chả ai học được gì cả.

Tôi lập lại lời tôi đã nói ở bài trước: nếu nói theo quan niệm lập trình lý thuyết thì tạo thêm 1 dòng cho mảng để tránh lỗi cuối mảng là phương pháp gượng ép.

Với hầu hết các ngôn ngữ dạng "thấp" hơn, ngưởi ta có thể test cuối mảng và đọc dòng kế trong cùng một câu lô gic.
IF (cuối mảng HOẶC khác dòng kế tiếp)
Lô gic được đặt theo kiểu thông minh, nếu điều kiện cuối mảng thoả rồi thì nó không tiếp tục tính điều kiện kế. Vì vậy tránh được lỗi quá chỉ số.

Nhưng VBA không cho phép làm như vậy. Đối với VBA, tất cả các biểu thức con nằm trong biểu thức lô gic chính đều được tính. Vì vậy, cách thêm 1 dòng giả tuy hơi "nghịch đạo" 1 chút, nhưng lại là cách giản dị nhất.
 
Upvote 0
Chào mọi người ! Em có bài tập này cần tư vấn. Em đã giải được bằng đoạn CODE sau:
PHP:
Option Explicit
Sub dic2()
Dim dic, i, j, k, mang(1 To 6, 1 To 6)
Set dic = CreateObject("Scripting.Dictionary")
For i = 2 To 21
If Not dic.exists(Cells(i, 2).Value) Then
   j = j + 1
   mang(j, 1) = j
   dic.Add Cells(i, 2).Value, ""
   For k = 2 To 6
      mang(j, k) = Cells(i, k).Value
   Next k
End If
Next i
  Range("J9").Resize(dic.Count, 6) = mang
End Sub
Khi khai báo mảng , nếu thay vì viết như trên nếu em chỉ viết là : mang thì sẽ bị báo lỗi. Tuy nhiên cái khó nằm ở con số 6 kia nếu như ta không biết trước kết quả thì làm sao biết là viết số nào vào chổ ấy, với chiều cột thì mình còn đếm được là 6 chứ với chiều hàng thì mình biết đếm sao ???, hổng lẽ lại khai báo là mang( 1 to 21, 1 to 6) .

Vậy xin hỏi mọi người có cách nào để giải quyết được vấn đề trên không ạ. Em xin cảm ơn !
 

File đính kèm

  • Cauhoi4_Dic.xls
    38.5 KB · Đọc: 27
Lần chỉnh sửa cuối:
Upvote 0
Chào mọi người ! Em có bài tập này cần tư vấn. Em đã giải được bằng đoạn CODE sau:
PHP:
Option Explicit
Sub dic2()
Dim dic, i, j, k, mang(1 To 6, 1 To 6)
Set dic = CreateObject("Scripting.Dictionary")
For i = 2 To 21
If Not dic.exists(Cells(i, 2).Value) Then
   j = j + 1
   mang(j, 1) = j
   dic.Add Cells(i, 2).Value, ""
   For k = 2 To 6
      mang(j, k) = Cells(i, k).Value
   Next k
End If
Next i
  Range("J9").Resize(dic.Count, 6) = mang
End Sub
Khi khai báo mảng , nếu thay vì viết như trên nếu em chỉ viết là : mang thì sẽ bị báo lỗi. Tuy nhiên cái khó nằm ở con số 6 kia nếu như ta không biết trước kết quả thì làm sao biết là viết số nào vào chổ ấy, với chiều cột thì mình còn đếm được là 6 chứ với chiều hàng thì mình biết đếm sao ???, hổng lẽ lại khai báo là mang( 1 to 21, 1 to 6) .

Vậy xin hỏi mọi người có cách nào để giải quyết được vấn đề trên không ạ. Em xin cảm ơn !

Đi tìm bài về mảng động, sẽ thấy cách giải quyết. mangr động là loại mảng có số phần tử thay đổi được.

Đại khái là khi khai báo thì dùng hai dấu ngoặc trống, và khi cho kích thước thì dùng lệnh Redim:

Dim mang() ' dấu ngoặc trống, không có tham số, báo cho VBA biết biến này là loại mảng động
...
Dim lb1 As Long, ub1 As Long, lb2 As Long, ub2 As Long
lb1 = 1: ub1 = 21: lb2 = 1: ub2 = 6 ' có thể dùng biểu thức để gán trị cho các biến này
ReDim mang(lb1 To ub1, lb2 To ub2) ' kích thước mảng được định ở đây
 
Upvote 0
Dim lb1 As Long, ub1 As Long, lb2 As Long, ub2 As Long
lb1 = 1: ub1 = 21: lb2 = 1: ub2 = 6 ' có thể dùng biểu thức để gán trị cho các biến này
ReDim mang(lb1 To ub1, lb2 To ub2) ' kích thước mảng được định ở đây

Vấn đề của em là làm cách nào để biết được chiều dọc của mảng có 6 hàng mà không phải dùng đến số 21 í

hổng lẽ lại khai báo là mang( 1 to 21, 1 to 6) .

!

Và cho em xin hỏi thêm , em viết lại như vầy mà cũng không đúng là sao ạ:
PHP:
Option Explicit
Sub dic2()
Dim dic, i, j, k, mang()
Set dic = CreateObject("Scripting.Dictionary")
For i = 2 To 21
If Not dic.exists(Cells(i, 2).Value) Then
   j = j + 1
   mang(j, 1) = j
   dic.Add Cells(i, 2).Value, ""
   For k = 2 To 6
      mang(j, k) = Cells(i, k).Value
   Next k
End If
Next i
  ReDim mang(1 To dic.Count, 1 To 6)
  Range("J9").Resize(dic.Count, 6) = mang()
End Sub
 
Upvote 0
Vấn đề của em là làm cách nào để biết được chiều dọc của mảng có 6 hàng mà không phải dùng đến số 21 í



Và cho em xin hỏi thêm , em viết lại như vầy mà cũng không đúng là sao ạ:

1/ Để biết được có 6 hàng thì bạn có thể làm như sau:

- B1: Add tất cả các phần tử vào Dic
- B2: ngay sau khi add Redim lại mảng theo số hàng là dic.Count


2/ Code của bạn sai vì bạn chưa khai báo ubound của mảng mà bạn đã add dữ liệu vào mảng. Bạn hãy làm như (1) để có kết quả đúng
 
Upvote 0
Bạn chưa biết số dòng dữ liệu của mảng sẽ là bao nhiêu. Như vậy bạn có 2 cách làm.

1. Như bài #696, nạp dic trước, Redim mang theo dic.count

2. Cứ làm theo code của bạn. Lúc ghi xuống thì dùng dic.count và resize để giới hạn vùng ghi.
Vì bạn không biết trước dic bao lớn trước khi xong vòng lặp cho nên dùng UBound tối đa là đúng rồi.
Để chỉnh code của bạn, chỉ cần nhét thêm dòng
Redim mang(1 to 21, 1 to 6) ngay trước khi bắt đầu sử dụng mảng, trong trường hợp này tức là trước vòng lặp.
Con số 21 có lẽ là giới hạn vùng dữ liệu input của bạn. Như vậy với trường hợp tổng quát, câu Redim bạn áp dụng vào lúc đã tính ra con số vùng dữ liệu.
vd
dim dongCuoi as Long
dongCuoi = công_thức_tính_dòng_cuối
Redim mang(1 to dongCuoi, 1 to 6)
hoặc là
Redim mang(1 to công_thức_tính_dòng_cuối, 1 to 6)
Con số 6 cũng vậy, bạn có thể thay nó bằng công thức tính cột cuối dữ liệu
 
Upvote 0
Vấn đề của em là làm cách nào để biết được chiều dọc của mảng có 6 hàng mà không phải dùng đến số 21 í
bạn có thể khai báo tới mảng tối đa có thể chứa được dữ liệu, trong bài này là 21, nó không chiếm bộ nhớ của bạn là bao.
nếu không thích cách này thì bạn lại tốn thêm thời gian nạp vào DIC và đếm, sau đó mới redim, tính ra thì cũng không lợi bao nhiêu, mà sau này muốn xem lại code phải đọc thêm phần DIC nữa, rất mất thời gian và mất công
 
Upvote 0
Em viết như vầy:
PHP:
Option Explicit
Sub dic2()
Dim dic, i, j, k, mang()
Set dic = CreateObject("Scripting.Dictionary")
For i = 2 To 21
If Not dic.exists(Cells(i, 2).Value) Then
   j = j + 1
   dic.Add Cells(i, 2).Value, ""
   ReDim mang(1 To dic.Count, 1 To 6)
   mang(j, 1) = j
   For k = 2 To 6
      mang(j, k) = Cells(i, k).Value
   Next k
End If
Next i
    Range("J9").Resize(dic.Count, 6) = mang()
End Sub

Thì nó chỉ ra kết quả hàng cuối cùng, khi em thêm từ khóa Preserve vào sau Redim thì lại bị bắt lỗi. Mọi người giúp em thêm lần nữa với ạ. :.,:.,
 
Upvote 0
Em viết như vầy:
PHP:
Option Explicit
Sub dic2()
Dim dic, i, j, k, mang()
Set dic = CreateObject("Scripting.Dictionary")
For i = 2 To 21
If Not dic.exists(Cells(i, 2).Value) Then
   j = j + 1
   dic.Add Cells(i, 2).Value, ""
   ReDim mang(1 To dic.Count, 1 To 6)
   mang(j, 1) = j
   For k = 2 To 6
      mang(j, k) = Cells(i, k).Value
   Next k
End If
Next i
    Range("J9").Resize(dic.Count, 6) = mang()
End Sub

Thì nó chỉ ra kết quả hàng cuối cùng, khi em thêm từ khóa Preserve vào sau Redim thì lại bị bắt lỗi. Mọi người giúp em thêm lần nữa với ạ. :.,:.,
Bạn làm như thế này
Mã:
Option Explicit
Sub dic2()
Dim dic, dicTMP, i, j, k, mang()
Set dic = CreateObject("Scripting.Dictionary")
'===============================================
Set dicTMP = CreateObject("Scripting.Dictionary")
For i = 2 To 21
    'Add du lieu vao Dic
    If Not dicTMP.exists(Cells(i, 2).Value) Then
        dicTMP.Add Cells(i, 2).Value, ""
    End If
Next
'Khai bao mang
ReDim mang(1 To dicTMP.Count, 1 To 6)
'================================================
'Dua du lieu vao mang - Code cua ban
For i = 2 To 21
    If Not dic.exists(Cells(i, 2).Value) Then
        j = j + 1
        mang(j, 1) = j
        dic.Add Cells(i, 2).Value, ""
        For k = 2 To 6
            mang(j, k) = Cells(i, k).Value
        Next k
    End If
Next i
Range("J9").Resize(UBound(mang, 1), 6) = mang()
End Sub
 
Upvote 0
Web KT
Back
Top Bottom