Tach các cột tạo thành một mảng mới

Liên hệ QC

Yeuvoyeucon

Thành viên hoạt động
Tham gia
30/10/09
Bài viết
143
Được thích
23
Kính gửi anh chị và các bạn,

Giả sử em có bảng số liệu từ A đến cột G. Bình thường để add bảng dữ liệu này vào mảng thì ta dung lệnh sau

lr = .Range("A" & Rows.Count).End(xlUp).Row

arr = .Range("A2:G" & lr).Value

Bây giờ, em muốn tạo một mảng cũng trích từ bảng này nhưng chỉ lấy thứ tự theo các cột sau: Lấy cột A, Cột C, Cột G. Có cách viết như thế nào để viết chỗ này hay bắt buộc phải Redim từ mảng arr thành một mảng 3 chiều như ta vẫn thường làm ạ.
 

File đính kèm

  • Mang.xlsm
    9.6 KB · Đọc: 15
Mảng răng cưa là tên gọi phổ biến, chả có gì là phức tạp vấn đề ở đây, mảng trong mảng cũng vậy.
Làm gì có "mảng object, array hay bất kể loại dữ liệu nào", đọc thế này làm như phần tử mảng là cái nhà kho chắc.
 
Upvote 0
Đọc phải chuẩn chỉ từng ký tự thì mới hiểu biết được. Thêm mắm muối vào là lệch lạc ngay.
 
Upvote 0
Mảng răng cưa là tên gọi phổ biến, chả có gì là phức tạp vấn đề ở đây, mảng trong mảng cũng vậy.
Làm gì có "mảng object, array hay bất kể loại dữ liệu nào", đọc thế này làm như phần tử mảng là cái nhà kho chắc.

Mặt ngoài: chính xác, mỗi phần tử của mảng Aray là cái nhà kho. Nhà kho thì chứa cài gì xũng được. Nói theo tiếng xưa là "từ cây kim đến chiếc phi thuyền"

Bên trong: hơi phức tạp chút. Mảng đã xác phần tử kiểu đơn giản thì mỗi phần tử chứa trực tiếp trị số. Mảng có phần tử phức tạp thì mỗi phần tử chứa địa chỉ của chỗ chứa dữ liệu thực sự.
Ta có thể coi như kiểu một là dãy nhà kho san sát nhau, và kiểu thứ hai là một danh sách địa chỉ nhà kho. Đến với mảng 1 ta có thể đi thẳng vào nhà kho số n. Đến với mảng 2 là ta lấy cái địa chỉ nhà kho n và tìm đến nhà kho ấy.

Mảng răng cưa là phản ứng tiếp theo khi về sau này, người ta nhận ra là cách xếp mảng đơn giản không đáp ứng được một số trường hợp. Với VBA, mảng răng cưa có thể coi như "mảng trong mảng". Nhưng với các ngôn ngữ thì chưa chắc.
 
Upvote 0
Mặt ngoài: chính xác, mỗi phần tử của mảng Aray là cái nhà kho. Nhà kho thì chứa cài gì xũng được. Nói theo tiếng xưa là "từ cây kim đến chiếc phi thuyền"

Bên trong: hơi phức tạp chút. Mảng đã xác phần tử kiểu đơn giản thì mỗi phần tử chứa trực tiếp trị số. Mảng có phần tử phức tạp thì mỗi phần tử chứa địa chỉ của chỗ chứa dữ liệu thực sự.
Ta có thể coi như kiểu một là dãy nhà kho san sát nhau, và kiểu thứ hai là một danh sách địa chỉ nhà kho. Đến với mảng 1 ta có thể đi thẳng vào nhà kho số n. Đến với mảng 2 là ta lấy cái địa chỉ nhà kho n và tìm đến nhà kho ấy.
Về cái "danh sách địa chỉ" như bác nói thì đồng ý. Đã nói đến bản chất là phải rõ như vậy.
Không như cái bài trên có hiểu rõ như vậy đâu mà chém mảng object này nọ
 
Upvote 0
mỗi phần tử của mảng Aray là cái nhà kho
Họ luống cuống đọc vội sợ bị mất phần đó anh. Viết bài nữa mà vẫn tự suy diễn.

---------
"mảng trong mảng" chỉ là con kiến thôi.
PHP:
Option Explicit

Sub vidu()
    Dim data As Variant, mang(1 To 3) As Variant, mang2 As Variant, mang3 As Variant, obj As Object
    Set obj = CreateObject("System.Collections.Hashtable")
    Range("A1").Value = "hello world!"
    data = Range("A1:D10").Value2
    obj.Add "skey1", "item1"
    obj.Add "skey2", data
    ReDim mang2(1 To 2)
    ReDim mang3(1 To 2)
    mang2(1) = "string"
    Set mang2(2) = obj
    mang3(1) = VBA.Array(1, 2, "abc")
    mang3(2) = mang2
   
    mang(1) = 1
    mang(2) = mang3
    Set mang(3) = ThisWorkbook
       
    MsgBox mang(2)(2)(2).Item("skey2")(1, 1)
    MsgBox mang(3).Worksheets(1).Range("A1").Value
End Sub
 
Upvote 0
Luống với chả cuống, bản chất mảng có thể chứa giá trị hoặc địa chỉ như bài 23 nói thôi ông ơi
 
Upvote 0
Ở bài #11 tôi có đề cập đến kiến thức "cao" và "sâu". Nhưng có lẽ tôi không giải thích hai từ ngữ này cho nên có bạn hiểu lầm.

Kiến thức sâu có nghĩa là hiểu rõ công cụ ấy làm việc như thế nào. Khi áp dụng tránh được sai lầm về ngữ pháp (lỗi VBA không chấp nhận code) và dữ liệu được truy xuất, xào nấu không bị sai sót (VBA chạy vo vo nhưng kết quả là một dấu chấm hỏi tổ bố).
Điển hình: biết rõ Evaluate chỉ hoạt động với biểu thức kiểu string, và parse cái string in hệt như hàm trên bảng tính thì mới áp dụng được ngữ pháp. Biết được [ ] là cái gì thì càng tốt. Nhiều người viết [a1] coi như là tiết kiệm 7 ký tự nhưng không hề biết [ ] là cái gì.

Kiến thức cao có nghĩa là biết rõ tính chất về hiệu quả của công cụ. Tức là biết lợi dụng tính chất để viết code dùng ít nguyên liệu (bộ nhớ và tốc độ).
Điển hình: biết mảng xếp các phần tử sát nhau thì biết rằng phương pháp lọc bằng chỉ số tuy giới hạn hơn container (như Dic...) nhưng dùng chỉ số (indice/indexes) nhanh hơn bảng băm (keys) một bậc.
 
Upvote 0
Mình thì không có khả năng moi xem trong VBE7.DLL cái array hoạt động như nào.
Còn thử nghiệm thực tế xem cái PHẦN TỬ mảng chứa cái gì... thì rất đơn giản: Xem RAM hoạt động thế nào.
- Nếu phần tử mảng là giá trị đơn thì khỏi bàn.
- Xét trường hợp object, Array.

Theo đồ thị RAM có 4 cái răng cưa.
Cái răng 0 là chép dữ liệu vào biến a.
Răng cưa 1-3 là chép a vào phần tử mảng b(i=1,2,3): Nó chép cả tảng a to tướng vào b(i) đó thôi.
Nói chung đọc cái gì thì cứ ---- đọc ---- chậm ---- từng ---- chữ ---- thôi.

1634635853387.png
 
Upvote 0
Không phải lúc nào cũng chép cả mớ hổ lốn tổ bố ấy vào được đâu, khi nào trình dịch chốt là inline thì mới như vậy.
Về bộ nhớ phải hỏi cái bác bài 27 ấy.

Chào nhé.
 
Upvote 0
Trước khì bảo không, giờ thì lại nói có.

Tưởng thế nào..

-0-0-0--0-0-0-
 
Upvote 0
Tưởng thế nào là "cái mảng chứa object" ấy ông ợ. Đọc kỹ lại cái bài 23 của cái bác @VetMini đi rồi hẵng chém.

Rách việc.
Nghỉ hẳn.
 
Upvote 0
Tới bài #29 là đủ hiểu rồi. Miễn thanh minh và níu kéo.

-0-0-0-
 
Upvote 0
Web KT

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

Back
Top Bottom