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ị
 
PHP:
  Dim sArray, Arr()
Cho em hỏi cách DIM như trên thì sArray là biến gì & Arr()??
tại sao sau Arr có () mà sArray không có?

Cách Dim như trên, sArray có thể là bất kỳ giá trị nào, đồng thời có thể là biến đơn hoặc biến mảng. Tuy nhiên, ngay sau khi gán giá trị 1 range vào, nó trở thành biến mảng. Khai báo trước là mảng cũng không sao.
Còn Dim Arr() tức là đã khai báo trước cho nó là mảng rồi. Mục đích khai báo trước nó là mảng, là để có thể ReDim. Biến chưa biết là mảng hay đơn thì không thể ReDim được.
 
Upvote 0
Biến chưa biết là mảng hay đơn thì không thể ReDim được.
Theo thí nghiệm dưới đây thì vẫn ReDim được sư phụ à:
PHP:
Sub Test()
  Dim Arr, i As Long
  ReDim Arr(1 To 10)
  For i = 1 To 10
    Arr(i) = i
  Next
  Range("A1").Resize(, 10).Value = Arr
End Sub
 
Upvote 0
Hic, vậy thì phải sửa lại:

Khai báo Dim sArray thì sArray có thể là biến đơn và cũng có thể là biến mảng
Khai báo Dim Arr() thì đã là khai báo biến mảng rồi.
 
Upvote 0
Bắt đầu học mảng: 1.Sự khác nhau giữa range và mảng hai chiều

Nếu trên diễn đàn đã có topic này rồi, MOD move giúp em về đúng chỗ quy định
Nếu chưa có, em xin tạo topic để tiện cho việc học mảng

Em bắt đầu với câu hỏi đầu tiên
Câu hỏi 1. Sự khác nhau giữa range & và mảng hai chiều là gì?
Câu hỏi 2. Có bao nhiêu loại mảng (ví dụ: mảng 1 chiều, mảng 2 chiều, mảng 3 chiều...)
Câu hỏi 3. Có phải từ mảng ngang & dọc là do thói quen tư duy của người dùng và không nhất thiết phải phân biệt ngang & dọc phải không?
 
Lần chỉnh sửa cuối:
Upvote 0
Nếu trên diễn đàn đã có topic này rồi, MOD move giúp em về đúng chỗ quy định
Nếu chưa có, em xin tạo topic để tiện cho việc học mảng

Em bắt đầu với câu hỏi đầu tiên
1. Sự khác nhau giữa range & và mảng hai chiều là gì?
Theo mình hiểu:
Range = mảng 1 chiều: Mảng 1 cột nhiều dòng hoặc 1 dòng nhiều cột
Array = mảng 2 chiều: Mảng nhiều cột nhiều dòng
 
Upvote 0
Cám ơn bạn, theo mình tìm đọc trên GPE (nên mình mới hỏi câu "sự khác nhau giữa range & mảng 2 chiều" vì mình đọc thấy câu này
1. Range luôn là mảng 2 chiều
Ví dụ: vì Join chỉ làm việc với mảng 1 chiều nên
bạn không thể dùng hàm Join để nối một Range mà phải qua 2 lần transpose
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Thoat
With Target
   If .Column < 5 And .Value <> "" Then
        Range("F" & .Row) = Join(WorksheetFunction.Transpose( _
        WorksheetFunction.Transpose(Range("A" & .Row & ":E" & .Row))), "")
    End If
End With
    
Thoat:
End Sub

2. Nhưng.....range là range mà Mảng là mảng

Chính vì thế mình hỏi lại để hiểu cặn kẽ hơn về mảng
 
Lần chỉnh sửa cuối:
Upvote 0
Câu hỏi 4.
4. Mục đích của việc chuyển dữ liệu từ range thành mảng --> chủ yêu để tăng tốc xử lý
Vậy ngoài mục đích trên thì mảng còn ý nghĩa nào khác?
 
Upvote 0
Câu hỏi 3. Có phải từ mảng ngang & dọc là do thói quen tư duy của người dùng và không nhất thiết phải phân biệt ngang & dọc phải không?
Đọc lại bài 11 topic này, nhưng tốt nhất lá đọc hết từ đầu

Dẫu rằng nói 1 chiều thì không có dọc ngang, tựa như đường thẳng, và khác với mặt phẳng. Nhưng đó là xét theo hệ quy chiếu là đứng trong không gian 1 chiều và đang chỉ nhận thức được 1 chiều.

Giả sử tồn tại 1 thế giới mà sinh vật ở đó chỉ nhận thức được 1 chiều trong không gian, thì khi 1 vật thể di chuyển dọc theo đường thẳng, anh ta sẽ trông thấy sự dịch chuyển. Nếu 1 sinh vật ở hành tinh khác đến và nhận thức được không gian 2 chiều, anh ta đi ra khỏi đường thẳng vào chiều thứ 2. Vậy sinh vật tại đó sẽ nghĩ gì? Nó cho rằng sinh vật lạ đã biến mất.
Còn đối với sinh vật ở hành tinh khác đến, thì nghĩ: tao đâu có biến mất, mày chỉ đi được theo chiều X của tao, còn tao đi 2 hướng, vừa X vừa Y.
(Suy luận tương tự giữa không gian 2 chiều, 3 chiều, và n chiều)

Và khi sinh vật lạ này kể cho đồng hương của nó nghe, nó sẽ kể: Tụi nó chỉ đi ngang hông à, hông có ra khỏi cái đường thẳng đó được.

Chữ ngang để làm chi? để vẽ ra cho đồng hương nó hiểu.

Tưởng tượng xong, quay về Array. Array 1 chiều mà gán xuống sheet (bảng 2 chiều), thì phải gán ngang. Gán dọc là sai.
Nên
vẫn phải
hình dung
mảng 1 chiều

mảng
ngang!

Vì ta là thành viên GPE, thế giới GPE là thế giới bảng tính có ít nhất 2 chiều, và ta là sinh vật nhận thức được n chiều.
 
Lần chỉnh sửa cuối:
Upvote 0
Đọc câu này của bạn thấy hơi kỳ kỳ! Vậy mảng {A1;A2;...;An} gọi là gì ạ? Theo mình nó cũng là mảng 1 chiều, và là mảng dọc.
Có lẽ bạn cần đọc lại từ đầu topic này (tôi mới gộp vào topic cũ). Tôi nói hình dung mảng 1 chiều là mảng ngang

Nhắc lại 1 ý chính:
{A1;A2;...;An} tức là Range A1:A5, đó không phải mảng, mà là Range. Range là Range, mà mảng là mảng.
Range luôn là 2 chiều.
Mảng có thể từ 1 chiều đến n chiều.

Tôi nói hình dung mảng 1 chiều là mảng ngang, chứ không nói range A1:A5 là mảng ngang.
 
Upvote 0
Mình xin đính chính lại:
Range: có thể là 1 ô, 1 khối ô (1 hoặc 2 chiều)
Array: 2 ô trở lên
Bạn vẫn cần phải đọc lại:
Range có thể là 1 ô hoặc nhiều ô, nhưng khi gán vào mảng luôn luôn là 2 chiều.
Array (mảng VBA), có thể có 1 chiều hoặc n chiều.
Array không bao gồm ô, Array bao gồm các phần tử.
Array có thể có 1 phần tử như thường.
 
Upvote 0
hỏi 2 lần transpose

Em xin được hỏi lại thuật toán khi mình dùng 2 hàm Transpose lồng vào nhau.
Quá trình nó xảy ra như nào để biến Range thành mảng 1 chiều

Cám ơn Anh/Chị
 
Upvote 0
Em xin được hỏi lại thuật toán khi mình dùng 2 hàm Transpose lồng vào nhau.
Quá trình nó xảy ra như nào để biến Range thành mảng 1 chiều

Cám ơn Anh/Chị
Lấy ví dụ cho dễ hiểu:
- 1 Range nhiều dòng, 1 cột, qua hàm TRANSPOSE luôn trở thành mảng 1 chiều
- Các trường hợp còn lại của Range (trừ trường hợp 1 cell), qua hàm TRANSPOSE luôn trở thành mảng 2 chiều
- TRANSPOSE cũng biểu hiện tương tự như thế khi làm việc với Array
------------
Về lý thuyết thì đúng ra hàm TRANSPOSE chỉ xoay dữ liệu 90 độ và giữ nguyên số chiều, ngoại trừ trường hợp đăc biệt ở trên (nó bỏ luôn chiều thứ nhất khiến mảng kết quả trở thành mảng 1 chiều)
 
Upvote 0
Tại sheet1.range("A1:A10") có dữ liệu.
Tại sheet1, em insert 1 listbox1
Tại module em cho 1 sub như sau
PHP:
 Sub test()
    Sheet1.listbox1.List() = Sheet1.Range("A1:A10").Value
 End Sub

Không hiểu sau khi chạy sub em không thấy dữ liệu từ A1:A10 sheet1 nạp vào list box1?
Nó báo lỗi và bôi vàng tại chữ Listbox1

Xin chỉ giúp
 
Lần chỉnh sửa cuối:
Upvote 0
Tại sheet1.range("A1:A10") có dữ liệu.
Tại sheet1, em insert 1 listbox1
Tại module em cho 1 sub như sau
PHP:
 Sub test()
    Sheet1.listbox1.List() = Sheet1.Range("A1:A10").Value
 End Sub

Không hiểu sau khi chạy sub em không thấy dữ liệu từ A1:A10 sheet1 nạp vào list box1?
Nó báo lỗi và bôi vàng tại chữ Listbox1

Xin chỉ giúp
Code này đúng ra không có vấn đề. Tuy nhiên, nếu bạn test bị lỗi thì có thể đưa nguyên file lên đây để tìm nguyên nhân (có thể sai chổ nào đó mà bạn chưa biết, chẳng hạn sai tên sheet hoặc giả cái ListBox mà bạn chèn không phải thuộc nhóm ActiveX....)
 
Upvote 0
Code này đúng ra không có vấn đề. Tuy nhiên, nếu bạn test bị lỗi thì có thể đưa nguyên file lên đây để tìm nguyên nhân (có thể sai chổ nào đó mà bạn chưa biết, chẳng hạn sai tên sheet hoặc giả cái ListBox mà bạn chèn không phải thuộc nhóm ActiveX....)

Em kiểm tra lại, đúng như anh NDU nói, Listbox em đang dùng không thuộc ActiveX Control mà thuộc Form Controll

Vậy khi nào mình dùng
ActiveX Control và khi nào dùng
Form Controll
 
Upvote 0
Em kiểm tra lại, đúng như anh NDU nói, Listbox em đang dùng không thuộc ActiveX Control mà thuộc Form Controll

Vậy khi nào mình dùng
ActiveX Control và khi nào dùng
Form Controll
Bạn dùng cái gì cũng được cả, miễn sao cảm thấy hợp lý về mặt sử dụng
Code đương nhiên cũng phải được viết hợp lý cho từng loại object
 
Upvote 0
PHP:
 ReDim Arr(1 To UBound(sArray), 1 To UBound(sArray, 2))


Trong đoạn code trên tại sao mình không dùng là
1 to 2
mà phải là
1 To UBound(sArray, 2)


 
Upvote 0
Web KT
Back
Top Bottom