Thắc mắc về code có liên quan đến xử lý mãng (Array)

Liên hệ QC

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,952
Tôi có đoạn code thế này:
PHP:
Option Base 1
Sub Test()
  Dim Arr(), ith As Long
  For ith = 1 To 5
    ReDim Preserve Arr(1, ith)
    Arr(1, ith) = Cells(ith, 1)
  Next ith
  Range("C1:G1").Value = Arr
End Sub
Code chạy không có vấn đề... nhưng nếu tôi sửa lại thành:
PHP:
Option Base 1
Sub Test()
  Dim Arr(), ith As Long
  For ith = 1 To 5
    ReDim Preserve Arr(ith, 1)
    Arr(ith, 1) = Cells(ith, 1)
  Next ith
  Range("C1:C5").Value = Arr
End Sub
thì báo lổi Subscript out of range
Ý tôi muốn thêm các phần tử vào 1 mãng dọc ---> Tại sao nó lại không làm việc được nhỉ, trong khi với mãng ngang nó làm việc bình thường
 
Đưa giá trị vào mảng từ 1 file khác

Chào các bạn , tôi muốn đưa dữ liệu từ file khác vào mảng . Ví dụ : đang ở book1 muốn lấy dữ liệu ở book2 , sheet1 , A1:A100 vào mảng arr(100,1) thì ghi code thế nào .
Nhờ các bạn chỉ giúp , cảm ơn
 
Upvote 0
Chào các bạn , tôi muốn đưa dữ liệu từ file khác vào mảng . Ví dụ : đang ở book1 muốn lấy dữ liệu ở book2 , sheet1 , A1:A100 vào mảng arr(100,1) thì ghi code thế nào .
Nhờ các bạn chỉ giúp , cảm ơn
Chủ đề lấy dữ liệu từ file khác đã bàn rất nhiều rồi:
- Mở file, lấy xong đóng lại
- Dùng ADO
Bạn tìm đi
 
Upvote 0
Chào các bạn , tôi muốn đưa dữ liệu từ file khác vào mảng . Ví dụ : đang ở book1 muốn lấy dữ liệu ở book2 , sheet1 , A1:A100 vào mảng arr(100,1) thì ghi code thế nào .
Nhờ các bạn chỉ giúp , cảm ơn

Bạn giải nén file thành thư mục trên máy tính rồi mở file PSinh.xls để test. Tham khảo cách rồi gán biến mảng.
 

File đính kèm

Upvote 0
Bạn giải nén file thành thư mục trên máy tính rồi mở file PSinh.xls để test. Tham khảo cách rồi gán biến mảng.
Anh ơi! Em thấy file ví dụ của anh đâu có giống như những gì tác giả yêu cầu
Theo em thì thế này:
PHP:
Public Arr
Sub GetArr()
  With Workbooks.Open(ThisWorkbook.Path & "\data.xls")
    Arr = .Sheets("Sheet1").Range("A1:A100")
    .Close (False)
  End With
End Sub
Muốn ứng dụng Array này vào việc gì đó, chỉ việc "gán" là xong!
Ví dụ:
PHP:
Sub Apdung()
  Range("C1:C100").Value = Arr
End Sub
Đương nhiên, trước khi chạy sub Apdung, phải chạy sub GetArr trước đó
 
Upvote 0
Hoàn toàn nhất trí, vì làm biếng sửa lại nên có nói bạn ấy tham khảo rồi gán mảng thôi. Mình nghĩ bạn ấy làm được vì đã lọ mọ trong code việc gán vùng vào mảng là chuyện đương nhiên.
 
Lần chỉnh sửa cuối:
Upvote 0
Giữ nguyên định dạng khi dùng mảng

Chào các bạn
Khi dữ liệu lấy từ mảng về , định dạng sẽ phụ thuộc vào định dạng của sheet đó . Nay tôi muốn giữ như định dạng ban đầu thì làm thế nào . Cảm ơn
 
Upvote 0
Chào các bạn
Khi dữ liệu lấy từ mảng về , định dạng sẽ phụ thuộc vào định dạng của sheet đó . Nay tôi muốn giữ như định dạng ban đầu thì làm thế nào . Cảm ơn
Đã đưa vào mảng rồi thì làm gì còn định dạng hả bạn?
Gợi ý bạn 3 cách:
- Dùng mảng, sau khi lấy dữ liệu xong, tự viết code để định dạng lại
- Mở file và copy dữ liệu nguồn paste vào file đích, xong, đóng file nguồn
- Dùng SpreadSheet (trường hợp này bắt buộc file nguồn phải được lưu ở định dạng xml)
 
Upvote 0
Xin mọi người giải thích dùm tôi từ khóa Preserve nó dùng trong trường hợp nào? Tác dụng của nó là gì thế?
 
Upvote 0
Xin mọi người giải thích dùm tôi từ khóa Preserve nó dùng trong trường hợp nào? Tác dụng của nó là gì thế?

Tên đầy đủ của nó là ReDim Preserve
Nó dùng để mở rộng kích thước của 1 mảng mà không làm mất dữ liệu trong nó (trong khi dùng ReDim thì toàn bộ các phần tử trong nó bị xóa hết)
Lưu ý: Tuy rằng ReDim Preserve dùng để mở rộng kích thước mảng nhưng nó cũng chỉ mở rộng được chiều cuối cùng mà thôi. Ví dụ:
- Ta có mảng Arr(1 to 5, 1 to 10)
Mã:
Sub Test()
  Dim Arr()
  ReDim Arr(1 To 5, 1 To 10)
End Sub
- Ta có thể mở rộng chiều thứ 2 thành 20 phần tử bằng cách dùng ReDim Preserve như sau:
Mã:
Sub Test()
  Dim Arr()
  ReDim Arr(1 To 5, [COLOR=#ff0000]1 To 10[/COLOR])
  ReDim Preserve Arr(1 To 5, [COLOR=#ff0000]1 To 20[/COLOR])
End Sub
- Nếu ReDim Preserve chiều thứ nhất (1 to 5) thì sẽ báo lỗi
 
Upvote 0
Ý thày Ndu trên kia, tôi hiểu:

- Nếu có 2 chiều>> ưu tiên chiều cuối (tức là theo chiều cột).
- Nếu mảng có 1 chiều thì mới mở rộng được chiều hàng.
 
Upvote 0
Vậy có nghĩa là trong mảng chỉ mở rộng ra được chiều "cột" chứ không được mở rộng chiều "hàng" phải vậy không Thầy?

Chưa chính xác


- Nếu mảng có 1 chiều thì mới mở rộng được chiều hàng.

Sai!

"ReDim Preserve dùng để mở rộng kích thước mảng nhưng nó cũng chỉ mở rộng được chiều cuối cùng mà thôi"

Nghĩa là:
- Nếu mảng 1 chiều, có thể Redim Preserve mở rộng chiều 1 (ta thường xem tương đương với số cột nhưng không chính xác và chẳng hề có số dòng)
- Nếu mảng 2 chiều, có thể Redim Preserve mở rộng chiều 2 (ta thường xem tương đương với số cột)
- Nếu mảng 3 chiều, có thể Redim Preserve mở rộng chiều 3 (không biết tương đương với cái gì luôn, vì chiều thứ 3 là ảo)
- Nếu mảng n chiều, có thể Redim Preserve mở rộng chiều n (....!)
 
Lần chỉnh sửa cuối:
Upvote 0

Chưa chính xác




Sai!

"ReDim Preserve dùng để mở rộng kích thước mảng nhưng nó cũng chỉ mở rộng được chiều cuối cùng mà thôi"

Nghĩa là:
- Nếu mảng 1 chiều, có thể Redim Preserve mở rộng chiều 1 (ta thường xem tương đương với số cột nhưng không chính xác và chẳng hề có số dòng)
- Nếu mảng 2 chiều, có thể Redim Preserve mở rộng chiều 2 (ta thường xem tương đương với số cột)
- Nếu mảng 3 chiều, có thể Redim Preserve mở rộng chiều 3 (không biết tương đương với cái gì luôn, vì chiều thứ 3 là ảo)
- Nếu mảng n chiều, có thể Redim Preserve mở rộng chiều n (....!)

Theo như trên, Vậy nó cũng chỉ là chiều "cột" (hàng ngang) thôi chứ có thấy nói gì về chiều "hàng" (hàng dọc) đâu ta?
 
Upvote 0
Ý thày Ndu trên kia, tôi hiểu:

- Nếu có 2 chiều>> ưu tiên chiều cuối (tức là theo chiều cột).
- Nếu mảng có 1 chiều thì mới mở rộng được chiều hàng.
Vậy có nghĩa là trong mảng chỉ mở rộng ra được chiều "cột" chứ không được mở rộng chiều "hàng" phải vậy không Thầy?

Nếu "mường tượng" mảng 2 chiều là 1 Range nhiều dòng nhiều cột thì có thể tạm hiểu như thế cũng không hề gì
Còn mảng 1 chiều thì ReDim Preserve thoải mái, có điều không thể mường tượng nó với Range (dù có thể gán nó vào range) vì nếu xem mảng 2 chiều là mặt phẳng thì mảng 1 chiều sẽ là đường thẳng, chẳng ăn nhậu gì nhau nên cũng không có hàng cột gì ráo
 
Lần chỉnh sửa cuối:
Upvote 0
Theo như trên, Vậy nó cũng chỉ là chiều "cột" (hàng ngang) thôi chứ có thấy nói gì về chiều "hàng" (hàng dọc) đâu ta?

Như ndu đã nói: "mảng 1 chiều không có hàng cột gì ráo", lão chết tiệt cũng nói: "ta thường xem tương đương với số cột nhưng không chính xác và chẳng hề có số dòng"

Ngoài ra, nếu như mảng 3 chiều trở lên, và giả sử hình dung chiều thứ 2 là cột, thì chiều thứ 2 có thay đổi được đâu? Hơn nữa, với mảng 3 chiều, ta có thể tưởng tượng và áp đặt các chiều là bất cứ thứ gì, không phải lúc nào cũng là hàng, cột.
 
Upvote 0
Web KT

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

Back
Top Bottom