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ị
 
Cái này chắc phải duyệt vòng lặp thôi.Vì không có phương thức nào chọn vùng mảng để gán xuống sheets.
Mảng và vòng lặp cũng như dây lạt và bánh tét vậy. Người ta cho rằng dùng dây ấy cắt bánh thì trông quê mùa cho nên muốn thử dùng dao.
Vấn đề chỉ là dùng dao thì trông hiện đại nhưng rửa dao thì cực.
 
Upvote 0
Mảng và vòng lặp cũng như dây lạt và bánh tét vậy. Người ta cho rằng dùng dây ấy cắt bánh thì trông quê mùa cho nên muốn thử dùng dao.
Vấn đề chỉ là dùng dao thì trông hiện đại nhưng rửa dao thì cực.
Có người còn thích phải dùng đúng dao cắt bánh ngọt của tây mới hay
 
Upvote 0
Có người còn thích phải dùng đúng dao cắt bánh ngọt của tây mới hay
Có một con dao, mà rất lạ là cứ khi có "xung đột" thì thường nằm trong tầm tay, quơ quơ tay loạn xạ là đụng tới nó. Đó là dao gọt hoa quả. Cho dù ở bất kỳ đâu, trên xe Lexus (Vũ Thị Kim Anh), trong nhà bếp hay phòng khách, cứ lúc "nước sôi lửa bỏng" mà quờ quờ tay loạn xạ thì luôn vớ được con dao gọt hoa quả. :D
 
Upvote 0
Có một con dao, mà rất lạ là cứ khi có "xung đột" thì thường nằm trong tầm tay, quơ quơ tay loạn xạ là đụng tới nó. Đó là dao gọt hoa quả. Cho dù ở bất kỳ đâu, trên xe Lexus (Vũ Thị Kim Anh), trong nhà bếp hay phòng khách, cứ lúc "nước sôi lửa bỏng" mà quờ quờ tay loạn xạ thì luôn vớ được con dao gọt hoa quả. :D
Chuyện "dầu sôi lửa bỏng" có từ lâu rồi Bác ạ. Điển hình là truyện Đoạn Tuyệt của Nhất Linh mà hồi xưa nằm trong chương trình Giảng Văn bậc Trung Học.

Nói về con dao nhỏ thì người phụ nữ xưa thường mang theo con dao, gọi là dao bổ cau.
Dao con chó nó gắn liền với người VN cho đến cuối thập niên 60. Mãi về sau mới dần bị thay thế bởi dao Mỹ (hàng Quân Tiếp Vụ hoặc hàng lậu)
Bây giờ thì dao Thái phổ biến hơn. Cái con dao gọt quả bác nói đây chắc là dao Thái.
 
Upvote 0
Bây giờ thì dao Thái phổ biến hơn. Cái con dao gọt quả bác nói đây chắc là dao Thái.
Về dao bổ cau, dao phay, dao rựa hồi nhỏ sơ tán về quê tôi cũng thấy nghe nói. Còn dao Thái thì do không sống ở Việt Nam nên tôi không biết. Đọc báo mạng thấy nói nhiều về dao gọt hoa quả thôi.
 
Upvote 0
Vậy là đa số phụ nữ chơi dao
Nam thường chơi dao là tự cắt
?
 
Upvote 0
Mảng và vòng lặp cũng như dây lạt và bánh tét vậy. Người ta cho rằng dùng dây ấy cắt bánh thì trông quê mùa cho nên muốn thử dùng dao.
Vấn đề chỉ là dùng dao thì trông hiện đại nhưng rửa dao thì cực.

Trời, anh nói gì ghê quá, em út mới tập tành lập trình (nghiệp dư) và không biết mới đăng đàn tìm "sư huynh" chỉ bảo chứ có phải hỏi xoay đáp xoáy dao rựa kiếm búa gì đây đâu anh. Hic...

Mà em nghĩ cũng là để trao đổi tranh luận tìm giải pháp và cùng nhau tiến bộ hơn thôi ạ.
 
Upvote 0
...
Mà em nghĩ cũng là để trao đổi tranh luận tìm giải pháp và cùng nhau tiến bộ hơn thôi ạ.
Hổng dám cùng nhau đâu.
Trước mắt thì thấy chúng tôi chả tiến bộ chút nào về kỹ năng "đoán mò câu hỏi"
Và riêng bạn thì cần tiến bộ hơn về kỹ năng "trình bày câu hỏi".
 
Upvote 0
Đúng thế tiến bộ gì
Ngu người đi thì có, giống như nhàn rỗi làm vài đề bài cho mọi người chơi.
 
Upvote 0
Đúng thế tiến bộ gì
Ngu người đi thì có, giống như nhàn rỗi làm vài đề bài cho mọi người chơi.
Tôi thấy mọi người lạ thật.

Người ta có một vấn đề, mình tham gia hoặc không. Thế thôi

Rõ ràng bác VetMini đoán đúng. Bài #1346 là sự khẳng định điều đó. Thế mà sau bài #1346 nhiều người vẫn cứ kêu là khó hiểu. Thực ra xem đoạn tôi trích trong bài của mình thì những ai có thiện ý đều phải hiểu được ý tác giả.

Người ta đã có 1 mảng giá trị, sao cứ vặn vẹo, người ta lấy từ đâu, bằng cách nào?

Rõ ràng với mảng cụ thể A(1 to 15, 1 to 6) này, và cần nhập 6 dòng cuối (10 to 15) xuống sheet không dùng vòng lặp FOR, thì rõ ràng code của tôi LÀM ĐÚNG ĐIỀU ĐÓ. Thế mà có người viết là không thể làm được.

Rõ ràng dòng code dùng 2 hằng mảng thỏa mãn YÊU CẦU CỦA TÁC GIẢ. Thế mà tác giả bài đăng cũng lờ nó đi.
 
Lần chỉnh sửa cuối:
Upvote 0
Nhiều lúc cắt bánh (tét) bằng dây gói nó còn ngon hơn dao nữa cơ!
Cũng giống như đi xe 2 bánh tiện hơn khi tắt đường, so với xe 4 bánh

Chào xuân mới đem vui vẻ đến mọi người & mọi nhà!
 
Upvote 0
Tôi thấy mọi người lạ thật.

Người ta có một vấn đề, mình tham gia hoặc không. Thế thôi

Rõ ràng bác VetMini đoán đúng. Bài #1346 là sự khẳng định điều đó. Thế mà sau bài #1346 nhiều người vẫn cứ kêu là khó hiểu. Thực ra xem đoạn tôi trích trong bài của mình thì những ai có thiện ý đều phải hiểu được ý tác giả.

Người ta đã có 1 mảng giá trị, sao cứ vặn vẹo, người ta lấy từ đâu, bằng cách nào?

Rõ ràng với mảng cụ thể A(1 to 15, 1 to 6) này, và cần nhập 6 dòng cuối (10 to 15) xuống sheet không dùng vòng lặp FOR, thì rõ ràng code của tôi LÀM ĐÚNG ĐIỀU ĐÓ. Thế mà có người viết là không thể làm được.

Rõ ràng dòng code dùng 2 hằng mảng thỏa mãn YÊU CẦU CỦA TÁC GIẢ. Thế mà tác giả bài đăng cũng lờ nó đi.
Yêu cầu của tác giả, chính tác giả đưa ví dụ từ Range của Sheet để trả lời câu hỏi của bác SA, tác giả còn chẳng hiểu thì ai hiểu. Bài bác làm đúng mà tác giả câu hỏi có nhắc gì đến đâu, cứ tiếp tục cho ví dụ và đòi hỏi mọi người hiểu.
 
Upvote 0
Ngoài các cách của bác VetMini thì cũng có thể dùng hàm INDEX.

Mã:
Sub TestArray()
Dim A(1 To 15, 1 To 6) As Long
Dim r As Long, c As Long, k As Long
Dim arrRow(10 To 15, 1 To 1), arrCol(1 To 6)
'    mảng các chỉ số dòng
    For k = 10 To 15
        arrRow(k, 1) = k
    Next k
'    mảng các chỉ số  cột
    For k = 1 To 6
        arrCol(k) = k
    Next k
    k = 0
'    nhập giá trị vào mảng A
    For r = 1 To 15
        For c = 1 To 6
            k = k + 1
            A(r, c) = k
        Next c
    Next r
'    nhập mảng A xuống sheet để tiện theo dõi mảng 6 dòng
    Range("A1").Resize(15, 6) = A
'    nhập mảng có từ 6 dòng cuối của A xuống sheet, dùng các hằng số mảng
    Range("H1").Resize(6, 6) = Application.Index(A, [{10;11;12;13;14;15}], Array(1, 2, 3, 4, 5, 6))
'    nhập mảng có từ 6 dòng cuối của  A xuống sheet, dùng mảng các chỉ số dòng và mảng các chỉ số cột
    Range("H10").Resize(6, 6) = Application.Index(A, arrRow, arrCol)
  
'    Tương tự trên sheet: chọn vùng H1:M6 -> nhập công thức
'    =INDEX(A1:F15,{10,11,12,13,14,15},{1\2\3\4\5\6}) -> kết thúc bằng Ctrl + Shift + Enter.

'    Về dấu "\" có thể trên mỗi máy khác nhau. Ở đâu đó hãy nhập công thức
'    =SUM(A1:B2) -> trên thanh công thức bôi đen A1:B2 -> nhấn F9. Nhìn thấy
'    giữa 1 và 2 là dấu gì thì thay nó vào vị trí các dấu "\" trong trong công thức ở trên.
  
'    ---------------
'    Phần thưởng thêm, miễn phí
'    1. Nhập mảng các phần tử từ các dòng 7, 8, 11, 14, và từ các cột 1, 3, 5 - mảng các phần tử ở
'    các điểm giao của các dòng 7, 8, 11, 14 và các cột 1, 3, 5
    Range("A20").Resize(4, 3) = Application.Index(A, [{7;8;11;14}], Array(1, 3, 5))
  
'    2. Lấy vùng từ dòng 7 đến 10, cột từ 3 đến 5
    Range("E20").Resize(4, 3) = Application.Index(A, [{7;8;9;10}], Array(3, 4, 5))
'    Tương tự trên sheet: chọn E20:G23 -> nhập công thức
'    =INDEX(A1:F15, {7,8,9,10}, {3\4\5}) -> kết thúc bằng Ctrl + Shift + Enter.
End Sub

Cám ơn anh @batman1 đã hướng dẫn.
Đến giờ em mới có chút thời gian rảnh để nghiên cứu phần code của anh.
Em sẽ nghiên cứu thêm phần này xem có hiểu được tẹo nào nữa không,

Chúc anh mạnh khỏe!
 
Upvote 0
các cao thủ cho em hỏi nhờ tại sao đoạn code này bị báo lỗi về khai báo biến arrr.
Và có cách nào ứng dụng được mảng trong hàm sumif thay vì phải dùng range () không ạ
Em cảm ơn ạ

Sub thu12()
Dim sArray, arrr, Arr()
Dim i, j As Long
Sheet2.Select
sArray = Range("a1:a4296").Value
arrr = Range("d1:d4296").Value
ReDim Arr(1 To UBound(sArray), 1 To 1)
For i = 1 To UBound(sArray)

j = j + 1
Arr(j, 1) = arrr(i, 1) / Application.WorksheetFunction.SumIf(Range("a1:d4296"), sArray(i, 1), Range("d1:d4296"))

Next
Range("g1:g4296") = Arr
End Sub
 
Upvote 0
các cao thủ cho em hỏi nhờ tại sao đoạn code này bị báo lỗi về khai báo biến arrr.
Và có cách nào ứng dụng được mảng trong hàm sumif thay vì phải dùng range () không ạ
Em cảm ơn ạ

Sub thu12()
Dim sArray, arrr, Arr()
Dim i, j As Long
Sheet2.Select
sArray = Range("a1:a4296").Value
arrr = Range("d1:d4296").Value
ReDim Arr(1 To UBound(sArray), 1 To 1)
For i = 1 To UBound(sArray)

j = j + 1
Arr(j, 1) = arrr(i, 1) / Application.WorksheetFunction.SumIf(Range("a1:d4296"), sArray(i, 1), Range("d1:d4296"))

Next
Range("g1:g4296") = Arr
End Sub
Nếu là tôi không nên dùng hàm sumif.Vì làm thế này mỗi lần chạy vòng lặp.Nó phải tính 1 lần hàm.Mà bạn nên khai báo biến thì viết rõ ra nhé.
 
Upvote 0
Nếu là tôi không nên dùng hàm sumif.Vì làm thế này mỗi lần chạy vòng lặp.Nó phải tính 1 lần hàm.Mà bạn nên khai báo biến thì viết rõ ra nhé.
Ngừoi ta hỏi về lỗi mờ.

Hỏi "lỗi" mà không nói rõ ra lỗi gì thì chỉ có nước đoán đại:
Cứ nhìn con toán chia thì biết nếu không bị lỗi #DIV0 hiện giờ thì cũng bị trong tương lai.
 
Upvote 0
cảm ơn hai
Nếu là tôi không nên dùng hàm sumif.Vì làm thế này mỗi lần chạy vòng lặp.Nó phải tính 1 lần hàm.Mà bạn nên khai báo biến thì viết rõ ra nhé.
mình đang mò mẫm nên nếu có thể nhờ bạn chỉ giúp có thể thay sumif bằng cách nào khác được ạ. Cảm ơn bạn
Bài đã được tự động gộp:

Ngừoi ta hỏi về lỗi mờ.

Hỏi "lỗi" mà không nói rõ ra lỗi gì thì chỉ có nước đoán đại:
Cứ nhìn con toán chia thì biết nếu không bị lỗi #DIV0 hiện giờ thì cũng bị trong tương lai.
mình có nói là lỗi khai báo biến ạ. còn quá trình xử lý dữ liệu mình đã xử lý lỗi div0 rồi ạ. cảm ơn bạn
 
Upvote 0
cảm ơn hai

mình đang mò mẫm nên nếu có thể nhờ bạn chỉ giúp có thể thay sumif bằng cách nào khác được ạ. Cảm ơn bạn
Bài đã được tự động gộp:


mình có nói là lỗi khai báo biến ạ. còn quá trình xử lý dữ liệu mình đã xử lý lỗi div0 rồi ạ. cảm ơn bạn
Lỗi cái nào bạn chụp màn hình cái lỗi lên đây xem nào.
 
Upvote 0
Lỗi cái nào bạn chụp màn hình cái lỗi lên đây xem nào.
rất cảm ơn bạn đã quan tâm huớng dẫn giúp, mình đã mò ra lỗi rồi ạ. nếu có thể nhờ bạn huớng dẫn mình cách thay thế hàm sumif hoặc phương pháp nào nhanh hơn sử dụng hàm sumif để tăng tốc. Rất cảm ơn bạn
 
Upvote 0
Web KT
Back
Top Bottom