Bị lỗi khi gán giá trị cho 1 mảng (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

nth09061985

Thành viên mới
Tham gia
19/7/13
Bài viết
49
Được thích
5
Tôi có code như sau:
Mã:
Option Explicit
Public Sub Test()
Dim Lr As Long
    Lr = Sheets("ViDu").Range("A65536").End(xlUp).Row
    MsgBox Lr
End Sub
Code này hoạt động tốt cho kết quả Lr=10
nhưng code sau thì lại báo lỗi mặc dù vẫn dùng Sheets("ViDu")
Mã:
Option Explicit

Public Sub Test()
Dim Data()
Dim Lr As Long
    Lr = Sheets("ViDu").Range("A65536").End(xlUp).Row
    Data = Sheets("ViDu").Range("A2:C" & Lr) 'Dong nay bao loi
    'Data = Sheet1.Range("A2:C" & Lr) 'Dong nay lai duoc
    MsgBox UBound(Data)
End Sub
Tóm lại tại sao tôi không thể gán giá trị cho mảng bằng lệnh: Data = Sheets("ViDu").Range("A2:C" & Lr).
 

File đính kèm

Lần chỉnh sửa cuối:
nhưng code sau thì lại báo lỗi mặc dù vẫn dùng Sheets("ViDu")
Mã:
Option Explicit

Public Sub Test()
[COLOR=#ff0000]Dim Data()[/COLOR]
Dim Lr As Long
    Lr = Sheets("ViDu").Range("A65536").End(xlUp).Row
    Data = [COLOR=#0000cd]Sheets("ViDu").Range("A2:C" & Lr)[/COLOR] 'Dong nay bao loi
    'Data = Sheet1.Range("A2:C" & Lr) 'Dong nay lai duoc
    MsgBox UBound(Data)
End Sub
Tóm lại tại sao tôi không thể gán giá trị cho mảng bằng lệnh: Data = Sheets("ViDu").Range("A2:C" & Lr).
Chỗ màu đỏ sửa thành Dim Data thử xem (bỏ 2 dấu ngoặc đi)
Hoặc nếu không bỏ đi cặp dấu ngoặc thì chỗ màu xanh sửa thành: Sheets("ViDu").Range("A2:C" & Lr).Value
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy lỗi này là gì vậy? Tôi vẫn thường khai báo mảng như vậy mà?

Mấy chuyện "cao siêu" tôi không biết đâu. Tôi cứ thí nghiệm: Cái này không được thì thử cái khác.. riết rồi tự đúc kết kinh nghiệm
(giống như chạy xe hết xăng thì biết đi đổ xăng chứ hổng phải đổ.. dầu. Ẹc.. Ẹc...)
 
Upvote 0
Nếu bạn cẩn thận trong việc học hỏi của mình thì lúc hỏi, nên cho biết "báo lỗi" có nghĩa là sao? Code không chấp nhận ngay từ đầu, hay lúc chạy mới bị lỗi.

Data được khai báo là mảng:
Đối với code trên, Sheet1 là một đối tượng đã được dựng. Loại đối tượng này có hàm ngầm để lấy Value của range chuyển thành mảng, vì vậy chuyển vô tư.
Sheets("ViDu") là một phần tử của tập hợp Sheets. Tuy nó cũng là loại WorkSheet, nhưng gọi qua kiểu này hàm ngầm chuyển Range bị che đi, bạn phải gọi tới thuộc tính Value của Range mới thấy.

Tôi chỉ nói về lý thuyết vậy thôi. Chứ ba cái mớ này nhớ mệt óc lắm. Theo chính sách của ndu96081631 #2: cứ pkhai báo theo Vẩint tuốt; và #6: cái này không được thì thay cái khác; là cách hữu hiệu nhất.
 
Upvote 0
Những cái dụ này nghĩ khi mình trỏ chưa tới hết các đối tượng thì VBA nó báo lỗi
ví dụ 1

Mã:
[INDENT]Sub abc()[/INDENT]
[INDENT]Dim Arr()[/INDENT]
[INDENT]Arr = [B]Sheet1.Range("A1:B10")[/B][/INDENT]
[INDENT]MsgBox Arr(1, 1)[/INDENT]
[INDENT]End Sub[/INDENT]
hoặc
Mã:
[INDENT]Sub abc()[/INDENT]
[INDENT]Dim Arr()[/INDENT]
[INDENT]Arr = [B]Sheet1.Range("A1:B10").Value[/B][/INDENT]
[INDENT]MsgBox Arr(1, 1)[/INDENT]
[INDENT]End Sub[/INDENT]

thì không vấn đề gì

nhưng cái này thì báo lỗi
Mã:
[INDENT]Sub abc()
Dim Arr()
[COLOR=#ff0000][B]Arr = Sheets("AB").Range("A1:B10")[/B][/COLOR]
MsgBox Arr(1, 1)
End Sub
[/INDENT]
trước kia em có tìm hiểu trên các trang web nước ngoài thì nó nói như thế này.
Nếu sử dụng tên sheet trong properties thì khi mình gõ VBA nó sẽ tự động hiện ra các thuộc tính, khi đó nó sẽ hiểu là mảng được lấy giá trị từ vùng range đó (vì mình lấy tường minh tên sheet mà nó đã biết chắc chắn)
Picture1.jpg
Còn khi mình lấy tên bên ngoài sheet thì nó sẽ không hiểu và không biết có sheet tên đó có tồn tại hay không gán chưa tường minh ( vì tên sheet là 1 chuỗi nằm trong dấu "" có thể không có sheet tên đó trong workbook) nên nó sẽ không hiểu đó là 1 kiểu dữ liệu, vì vậy khi mình gõ nó sẽ không ra gợi ý như hình trên
Picture2.jpg
nếu mình chỉ dừng tới range thì khi nó duyệt chưa tới thuộc tính đích thì nó sẽ la làng, đó là cách hiểu của em
nói tóm lại là cái nào nó biết chắc chắn có thì ok, còn không chắc chắn tồn tại thì nó sẽ báo lỗi
 
Lần chỉnh sửa cuối:
Upvote 0
trích

excel knows that the default property is .Value. However in other case, it doesn't know because Excel is not a mind reader or let's say intelligent enough to understand whether you want to use Worksheets("Sheet1").Range("A1:A10") as a Range or a Variant
Once you explicitly specify your object as a Range then Excel knows what you want. For example this works.
 
Upvote 0
trích

excel knows that the default property is .Value. However in other case, it doesn't know because Excel is not a mind reader or let's say intelligent enough to understand whether you want to use Worksheets("Sheet1").Range("A1:A10") as a Range or a Variant
Once you explicitly specify your object as a Range then Excel knows what you want. For example this works.
Chân thành cảm ơn bạn!!!
 
Upvote 0

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

Back
Top Bottom