các anh chi giải thích dùm cách khai báo mảng như sau thì khác nhau ở chỗ nào (1 người xem)

Liên hệ QC

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

diemhuyenanh

Thành viên hoạt động
Tham gia
6/9/09
Bài viết
167
Được thích
58
chào các anh chị trong GPE!
Em cũng tự học VBA từ các anh trên diễn đàn lên không có hệ thống gì cả. Em có một thắc mắc mong các anh chị chỉ giáo: Đó là khi khai báo mạng
dim Rng()
Rng=sheet1.range("A1:C10).value
thì khác với cách khai báo như sau thế nào
dim Rng as range
set Rng = sheet1.range("A1A10")
mong nhận được sự giải thích của các anh chị
nếu dung vòng lập for I = 1 to ubuond(Rng,1)
next

cho cách khai báo thứ 2 sẽ báo lỗi
 
chào các anh chị trong GPE!
Em cũng tự học VBA từ các anh trên diễn đàn lên không có hệ thống gì cả.
...

Nên từ bỏ ý định học kiểu đó đi vì không hiệu quả cũng như dễ loạn (như hiện giờ bạn đang nhầm lẫn giữa Array (mảng) với đối tượng Range (vùng)), hãy kiếm sách hay trang web hướng dẫn VBA bài bản mà đọc học theo , vướng mắc đâu thì hỏi đúng lý thuyết đang học đang xem.

---------------------------
Cách 2 báo lỗi vì khi đó
Rng là đối tượng (object) Range nên không thể dùng Ubound được
 
Lần chỉnh sửa cuối:
Upvote 0
Nên từ bỏ ý định học kiểu đó đi vì không hiệu quả cũng như dễ loạn (như hiện giờ bạn đang nhầm lẫn giữa Array (mảng) với đối tượng Range (vùng)), hãy kiếm sách hay trang web hướng dẫn VBA bài bản mà đọc học theo , vướng mắc đâu thì hỏi đúng lý thuyết đang học đang xem.

---------------------------
Cách 2 báo lỗi vì khi đó
Rng là đối tượng (object) Range nên không thể dùng Ubound được

cảm ơn anh bác đã trả lời. như em đã nói là em chỉ học lỏm trên diễn đàn thôi. bác có trang web nào hay tài lieu cho em xin với
 
Upvote 0
/(hai báo
PHP:
dim Rng()
Rng=sheet1.range("A1:C10).value

Là cách khai bao lắp lững;
Nếu là mình thì là vầy:
Mã:
Dim Arr()
  Arr=sheet1.range("A1:C10).value
 
Upvote 0
/(hai báo
PHP:
dim Rng()
Rng=sheet1.range("A1:C10).value

Là cách khai bao lắp lững;
Nếu là mình thì là vầy:
Mã:
Dim Arr()
  Arr=sheet1.range("A1:C10).value

taị sao thay chữ Rng bằng chữ Arr thì gọi là hết lấp lửng nhỉ anh có thể chỉ điểm cho em đc mở mắt ko ?
 
Upvote 0
cảm ơn anh bác đã trả lời. như em đã nói là em chỉ học lỏm trên diễn đàn thôi. bác có trang web nào hay tài lieu cho em xin với

Thử học theo từng bước từ 1 trong 2 trang WEB này xem có hiệu quả không
http://www.excel-easy.com/vba.html
http://www.excel-pratique.com/en/vba.php

Dĩ nhiên bạn phải biết English chút chút (đủ đọc đủ dùng là được), tôi không thích các tài liệu tiếng việt dịch
 
Lần chỉnh sửa cuối:
Upvote 0
taị sao thay chữ Rng bằng chữ Arr thì gọi là hết lấp lửng nhỉ anh có thể chỉ điểm cho em đc mở mắt ko ?

Rng ngầm hiểu là "Range" trong tiếng Anh,
Còn Arr, hay sArr có thể ngầm hiểu là "array"

Tiếng Việt ta thịt chó có thể là thịt cầy, chứ không thể là thịt 'Nghé' được!

Đừng có bắt chước ai đó: Gọi "ăn cắp của dân" là hành vi "tiêu cực"!
 
Upvote 0
Tốt hơn hết là nên nghe theo bạn ở bài #2 mà học có cơ sở một chút.
Xin xác định rằng cũng có một số người ở đây học từng miếng một (tự nhận) mà vẫn rất giỏi (ít nhất là giỏi hơn tôi). Nhưng tôi có thể nói rằng những người này có bộ óc và khả năng đặc biệt. Nếu bạn cũng có khả năng siêu việt như vậy thì bạn đã mò được lý do rồi, không cần phải hỏi.

...
dim Rng()
Rng=sheet1.range("A1:C10).value
thì khác với cách khai báo như sau thế nào
dim Rng as range
set Rng = sheet1.range("A1A10")
...

Tôi trả lời theo lý thuyết:

Theo ngôn ngữ lập trình, "mảng" là array, được định nghĩa là một cách hoạch định vùng dữ liệu có tính chất giống nhau và kế liền nhau.
Riêng trong Excel, người ta còn dùng từ "mảng" để chỉ một loại cơ cấu khác, đó là một vùng Range của Excel worksheet.
Vì vậy đưa đến chỗ nhầm lần như trên của bạn.

Trong Excel VBA, toán tử gán (dấu =) có đặc tính ngầm chuyển dữ liệu, tức là nó có thể chuyển dữ liệu từ bên nguồn (source) sang bên đích (destination). Tuy nhiên, toán tử này không thể dùng trực tiếp cho dữ liệu loại object - mà Range là dữ liệu loại object.

Muốn sử dụng tính chất ngầm chuyển dữ liệu mà bên nguồn là range, bên đích phải là mảng.
Rng = Range("A1:A10").Value có nghĩa là chuyển tất cả giá trị từ range vào mảng. Mỗi phần tử của mảng copy lấy một giá trị của một cell trong range.

Nếu bên đích cũng là range thì toán tử gán không thể dùng trực tiếp. Toán tử này không có phần ngầm copy object. Ta chỉ có thể dùng gián tiếp bằng cách thêm từ khoá Set. Từ khoá này bảo lệnh gán "không copy dữ liệu, chỉ copy địa chỉ giữa hai bên mà thôi". Nói cách khác, sau khi lệnh này thực hiện xong, Rng không hề chứa dữ liệu trong Range, mà thực tế Rng chỉ trỏ vào vùng range được định nghĩa là nguồn thôi.

Giải thích thêm về lỗi:
Vì trong code thứ 2 của bạn, Rng là một Range chứ không phải là mảng dữ liệu cho nên bạn không thẻ dùng hàm UBound với nó.
(tuy nhiên, vì Range là một dạng nhóm/collection cho nên bạn có thể dùng for each để duyệt từng phần của nó)
 
Lần chỉnh sửa cuối:
Upvote 0
/(hai báo
PHP:
dim Rng()
Rng=sheet1.range("A1:C10).value

Là cách khai bao lắp lững;
Nếu là mình thì là vầy:
Mã:
Dim Arr()
  Arr=sheet1.range("A1:C10).value

Nếu xài vậy mập mờ với Bác Bill thì đổi kiểu không ai giống mình như sau cũng được mà

1/ Dim Rng() Thành Dim AA()

2/ Dim Arr() Thành Dim BB()
 
Lần chỉnh sửa cuối:
Upvote 0
Tốt hơn hết là nên nghe theo bạn ở bài #2 mà học có cơ sở một chút.
Xin xác định rằng cũng có một số người ở đây học từng miếng một (tự nhận) mà vẫn rất giỏi (ít nhất là giỏi hơn tôi). Nhưng tôi có thể nói rằng những người này có bộ óc và khả năng đặc biệt. Nếu bạn cũng có khả năng siêu việt như vậy thì bạn đã mò được lý do rồi, không cần phải hỏi.



Tôi trả lời theo lý thuyết:

Theo ngôn ngữ lập trình, "mảng" là array, được định nghĩa là một cách hoạch định vùng dữ liệu có tính chất giống nhau và kế liền nhau.
Riêng trong Excel, người ta còn dùng từ "mảng" để chỉ một loại cơ cấu khác, đó là một vùng Range của Excel worksheet.
Vì vậy đưa đến chỗ nhầm lần như trên của bạn.

Trong Excel VBA, toán tử gán (dấu =) có đặc tính ngầm chuyển dữ liệu, tức là nó có thể chuyển dữ liệu từ bên nguồn (source) sang bên đích (destination). Tuy nhiên, toán tử này không thể dùng trực tiếp cho dữ liệu loại object - mà Range là dữ liệu loại object.

Muốn sử dụng tính chất ngầm chuyển dữ liệu mà bên nguồn là range, bên đích phải là mảng.
Rng = Range("A1:A10").Value có nghĩa là chuyển tất cả giá trị từ range vào mảng. Mỗi phần tử của mảng copy lấy một giá trị của một cell trong range.

Nếu bên đích cũng là range thì toán tử gán không thể dùng trực tiếp. Toán tử này không có phần ngầm copy object. Ta chỉ có thể dùng gián tiếp bằng cách thêm từ khoá Set. Từ khoá này bảo lệnh gán "không copy dữ liệu, chỉ copy địa chỉ giữa hai bên mà thôi". Nói cách khác, sau khi lệnh này thực hiện xong, Rng không hề chứa dữ liệu trong Range, mà thực tế Rng chỉ trỏ vào vùng range được định nghĩa là nguồn thôi.

Giải thích thêm về lỗi:
Vì trong code thứ 2 của bạn, Rng là một Range chứ không phải là mảng dữ liệu cho nên bạn không thẻ dùng hàm UBound với nó.
(tuy nhiên, vì Range là một dạng nhóm/collection cho nên bạn có thể dùng for each để duyệt từng phần của nó)
cảm ơn bạn đã giải thích cho mình hiểu thế nào arry và range.
 
Upvote 0
Nếu xài vậy mập mờ với Bác Bill thì đổi kiểu không ai giống mình như sau cũng được mà

1/ Dim Rng() Thành Dim AA()

2/ Dim Arr() Thành Dim BB()

Tất nhiên không ai có thể cấm bạn được cả; Cũng như không ai có 2uyền cấm bạn dạo fố với 1 chân trên vĩa hè, 1 chân dưới lòng đường cả đâu!
 
Upvote 0

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

Back
Top Bottom