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ị
 
Bài này có thể lấy 2 mảng dữ liệu rồi chạy 2 vòng For Next để so sánh. Không biết mình có hiểu sai hay không nhưng thấy cũng đơn giản mà. Bạn nhặt ở đâu cái đoạn code cao cấp quá vậy.
Chỉ cần so sánh

If sArr1(i,j) <> sArr2(i,j) Then
KQ(i,j)= "ABC"
End If

To tam888:

Chị này là vậy đó. Mấy anh chị mới học code thường vậy đó. Mình quen rồi nên nhìn là hiểu chị ấy muốn gì rồi
Học thì học, dữ liệu phải chỉnh chu, ví dụ thì phải như thật
Còn kiểu ẩu ẩu thế tự viết code, thử cũng dễ nhầm và sai... lại mất công hỏi lại
 
Upvote 0
Dữ liệu có gì so sánh đâu nhỉ, toàn thấy chữ data và linh tinh gì đó
Có post nhầm file không?

Xin chào tam888, cảm ơn bạn đã quan tâm.
Dạ mục đích để minh họa cho thấy được sự thay đổi dữ liệu giữa 2sheet thôi ạ, nên dữ liệu là gì hay mẫu ra sao cũng không quan trọng ạ.

Bài này có thể lấy 2 mảng dữ liệu rồi chạy 2 vòng For Next để so sánh. Không biết mình có hiểu sai hay không nhưng thấy cũng đơn giản mà. Bạn nhặt ở đâu cái đoạn code cao cấp quá vậy.
Chỉ cần so sánh

If sArr1(i,j) <> sArr2(i,j) Then
KQ(i,j)= "ABC"
End If

To tam888:

Chị này là vậy đó. Mấy anh chị mới học code thường vậy đó. Mình quen rồi nên nhìn là hiểu chị ấy muốn gì rồi

Dạ, OT xin cảm ơn anh quanghai1969 đã hỗ trợ :)
Anh quanghai1969 code lại cả đoạn trên với cách dùng mảng giúp OT với ạ.
OT nhặt nó ở đây ạ:
http://www.tuvantinhoc1088.com/excel/so-sanh-hai-worksheet-bang-vba-trong-microsoft-excel-13680
Xin lỗi BQT nếu OT có đưa sai link không đúng nội quy ạ.
 
Upvote 0
Xin chào tam888, cảm ơn bạn đã quan tâm.
Dạ mục đích để minh họa cho thấy được sự thay đổi dữ liệu giữa 2sheet thôi ạ, nên dữ liệu là gì hay mẫu ra sao cũng không quan trọng ạ.
.

Xem lại bài #1,081 trên
Gặp dữ liệu kiểu này mọi người nản thường bỏ qua
Vì học mà giả lập dữ liệu ẩu, thì test sẽ ẩu thôi, đôi khi tưởng đúng mà không đúng
Ví dụ dữ liệu toàn cell có giá trị giống nhau vậy (chứa "data") thì thuật toán đơn giản hơn nhiều so với các ô (cells) có giá trị ngẫu nhiên khác nhau --> vậy khi xem file giả lập đại thế người ta sẽ định dữ liệu thế nào mà lượng ra thuật toán đây???, theo cái giống hệt nhau thế thì lúc thật lại sai
Chưa kể chính bạn test cũng dễ sai
 
Upvote 0
Xem lại bài #1,081 trên
Gặp dữ liệu kiểu này mọi người nản thường bỏ qua
Vì học mà giả lập dữ liệu ẩu, thì test sẽ ẩu thôi, đôi khi tưởng đúng mà không đúng
Ví dụ dữ liệu toàn cell có giá trị giống nhau vậy (chứa "data") thì thuật toán đơn giản hơn nhiều so với các ô (cells) có giá trị ngẫu nhiên khác nhau

Dạ vâng, OT xin lưu ý lần sau sẽ minh họa kiểu dữ liệu tổng quát và đa dạng hơn ạ.
Cảm ơn bạn nhiều.
 
Upvote 0
Dạ, OT xin cảm ơn anh quanghai1969 đã hỗ trợ :)
Anh quanghai1969 code lại cả đoạn trên với cách dùng mảng giúp OT với ạ.
Anh Quang Hải sẽ viết giống giống vầy:
PHP:
Public Sub SoSanh()
Dim Arr1(), Arr2(), Arr3()
Dim I As Long, J As Long, R As Long, Col As Long
Arr1 = Sheet1.Range("A1:N51").Value
Arr2 = Sheet2.Range("A1:N51").Value
R = UBound(Arr1): Col = UBound(Arr1, 2)
ReDim Arr3(1 To R, 1 To Col)
For I = 1 To R
    For J = 1 To Col
        If Arr1(I, J) <> Arr2(I, J) Then Arr3(I, J) = Arr1(I, J) & "<>" & Arr2(I, J)
    Next J
Next I
Sheet3.Range("A1").Resize(R, Col) = Arr3
End Sub
 
Upvote 0
Anh Quang Hải sẽ viết giống giống vầy:
PHP:
Public Sub SoSanh()
Dim Arr1(), Arr2(), Arr3()
Dim I As Long, J As Long, R As Long, Col As Long
Arr1 = Sheet1.Range("A1:N51").Value
Arr2 = Sheet2.Range("A1:N51").Value
R = UBound(Arr1): Col = UBound(Arr1, 2)
ReDim Arr3(1 To R, 1 To Col)
For I = 1 To R
    For J = 1 To Col
        If Arr1(I, J) <> Arr2(I, J) Then Arr3(I, J) = Arr1(I, J) & "<>" & Arr2(I, J)
    Next J
Next I
Sheet3.Range("A1").Resize(R, Col) = Arr3
End Sub
Lợi hại quá thầy ơi, con cảm ơn thầy nhiều ạ.
Code trước không so sánh được định dạng (value và text), nhưng code của thầy có thể phân biệt so sánh được.
Thật đơn giản mà hiệu quả,chắc chắn anh Quang Hải sẽ viết giống thầy rồi.Con nhớ ở bài viết nào đó anh Quanh Hải đã từng bị hỏi không kịp trở tay nên đã đọc thần chú "anh Ba Tê ơiii" ạ :D
 
Upvote 0
Code trước không so sánh được định dạng (value và text), nhưng code của thầy có thể phân biệt so sánh được.
Range.Value thì nhất định là Value (và chưa chắc là Text - nội dung hiển thị đã qua Format Cells).

Range.Text thì nhất định là Text (và có thể là Value).

Gọi tới thuộc tính Text của Range thì Range chỉ là một Cell, không thể gọi tới thuộc tính Text của nhiều Cells.

Ví dụ:
PHP:
Sub Text_cua_mot_Cell()
msgbox Range("A1").Text
End Sub
PHP:
Sub Text_cua_hai_Cell()
'// Như thế này sẽ lỗi.
msgbox Range("A1:A2").Text
End Sub

Đọc thêm mục 3.1 ở bài này: https://www.giaiphapexcel.com/diendan/threads/bài-6-range-cells.130603/
 
Upvote 0
Range.Value thì nhất định là Value (và chưa chắc là Text - nội dung hiển thị đã qua Format Cells).

Range.Text thì nhất định là Text (và có thể là Value).

Gọi tới thuộc tính Text của Range thì Range chỉ là một Cell, không thể gọi tới thuộc tính Text của nhiều Cells.

Ví dụ:
PHP:
Sub Text_cua_mot_Cell()
msgbox Range("A1").Text
End Sub
PHP:
Sub Text_cua_hai_Cell()
'// Như thế này sẽ lỗi.
msgbox Range("A1:A2").Text
End Sub

Đọc thêm mục 3.1 ở bài này: https://www.giaiphapexcel.com/diendan/threads/bài-6-range-cells.130603/

Cảm ơn befaint,OT thử thí nghiệm:
gõ số 1 vào một ô ví dụ G7 trong sheet1 với định dạng qua Format Cells là "General"
và gõ số 1 vào một ô G7 trong sheet2 với định dạng qua Format Cells là "@"
Kết quả code ở bài #1078 , không nhận đạng được sự khác nhau.
Nhưng code ở bài #1085 của thầy BaTê thì nhận dạng được sự khác nhau này ạ.

OT cũng thử kiểm tra theo gợi ý của befaint:
Range.Value thì nhất định là Value (và chưa chắc là Text - nội dung hiển thị đã qua Format Cells)
Mã:
Sub test()
    If Sheet1.Range("G7").Value = Sheet2.Range("G7").Value Then
        Sheet3.Range("G7").Value = True
    Else
        Sheet3.Range("G7").Value = False
    End If
End Sub
OT đang hiểu value là số (có thể tính toán được) còn text là dạng chuỗi (không thể tính toán được).
Hiểu như vậy có phải vậy có sai lầm không vậy befaint? Nếu không phiền nhờ bạn giải thích giúp OT thêm một chút nữa ạ.
Cảm ơn befaint.
 

File đính kèm

  • So sánh 2 bảng số liệu.xlsm
    81.1 KB · Đọc: 9
Upvote 0
OT đang hiểu value là số (có thể tính toán được) còn text là dạng chuỗi (không thể tính toán được).
Hiểu như vậy có phải vậy có sai lầm không vậy befaint? Nếu không phiền nhờ bạn giải thích giúp OT thêm một chút nữa ạ.
Mình không bàn luận các bài giải trên, mà chỉ trích dẫn một phần bài của bạn và nêu lý thuyết.
Tức là, bạn đã nêu "Code trước không so sánh được định dạng (value và text), nhưng code của thầy có thể phân biệt so sánh được."
Rồi mình xem code ở bài trên có
Mã:
Arr1=Range.Value
Arr2=Range.Value
đều gọi tới thuộc tính Value của Range, chứ không hề xét thuộc tính Text của Range nên mình nêu lý thuyết để bạn phân biệt được:
- Định dạng (tức là có Format Cells).
- Value
- Text
---------
"value là số (có thể tính toán được) "
Value là Value (dịch ra là giá trị), có thể là number, có thể là string. Number thì mới có thể tính toán +-*/, string thì không tính toán +-*/ được.

Giờ xét một Cell. Nội dung ta nhìn thấy trên Cell (ở bảng tính) có thể:
- nhập từ bàn phím, hay được sao chép ở nguồn khác vào;
- kết quả của công thức nào đó trong Cell đó;
- định dạng đối với Cell đó.
Rồi ta xét hai thuộc tính .Value và .Text của một Cell kia xem chúng khác nhau thế nào (xem ví dụ ở 3.1 đã dẫn ở bài trước).

=> Túm lại để bạn nắm được lý thuyết và gọi tên đúng thôi (chỗ chữ màu đỏ).
 
Upvote 0
Mình không bàn luận các bài giải trên, mà chỉ trích dẫn một phần bài của bạn và nêu lý thuyết.
Tức là, bạn đã nêu "Code trước không so sánh được định dạng (value và text), nhưng code của thầy có thể phân biệt so sánh được."
Rồi mình xem code ở bài trên có
Mã:
Arr1=Range.Value
Arr2=Range.Value
đều gọi tới thuộc tính Value của Range, chứ không hề xét thuộc tính Text của Range nên mình nêu lý thuyết để bạn phân biệt được:
- Định dạng (tức là có Format Cells).
- Value
- Text
---------
"value là số (có thể tính toán được) "
Value là Value (dịch ra là giá trị), có thể là number, có thể là string. Number thì mới có thể tính toán +-*/, string thì không tính toán +-*/ được.

Giờ xét một Cell. Nội dung ta nhìn thấy trên Cell (ở bảng tính) có thể:
- nhập từ bàn phím, hay được sao chép ở nguồn khác vào;
- kết quả của công thức nào đó trong Cell đó;
- định dạng đối với Cell đó.
Rồi ta xét hai thuộc tính .Value và .Text của một Cell kia xem chúng khác nhau thế nào (xem ví dụ ở 3.1 đã dẫn ở bài trước).

=> Túm lại để bạn nắm được lý thuyết và gọi tên đúng thôi (chỗ chữ màu đỏ).

Cảm ơn befaint rất nhiều, OT đã hiểu ạ.
Sau một thời gian bọn trẻ thi học kỳ I. OT không nghĩ gì đến code, giờ lại bắt đầu thấy mông lung.Thi thoảng OT vẫn tìm đến các bài viết về vba của bạn để đọc. Hic mỗi lần tìm cũng hơi mất chút thời gian, sao không thấy BQT không ghim lại các bài viết tổng hợp của bạn lại để mọi người có thể tiện xem nhỉ.
Cũng may GPE còn có rất nhiều người sẵn sàng có thể chỉ dẫn tận tình như bạn.
Chúc bạn một mùa đông ấm áp.
 
Upvote 0
Lợi hại quá thầy ơi, con cảm ơn thầy nhiều ạ.
Code trước không so sánh được định dạng (value và text), nhưng code của thầy có thể phân biệt so sánh được.
Với một bài như thế này mà mọi người lao vào giải thì tôi cũng thấy lạ.

Muốn giải một bài Toán thì phải biết giả thiết của nó. Ngay cả những định lý Toán không phải bao giờ cũng đúng, hầu như không bao giờ đúng cho mọi trường hợp. Vì thế luôn có vd.: "Nếu hàm f(x) liên tục và có đạo hàm trong đoạn ... thì ...". Tức cái định lý đó chỉ đúng khi hàm f(x) liên tục và có đạo hàm trong đoạn ...
so sánh dữ liệu của 2 bảng tính tìm ra những ô khác nhau
Nhưng không có định nghĩa, thế nào là khác nhau, thế nào là như nhau.

Chưa biết khái niệm "khác nhau", "như nhau" mà đã lao vào giải thì hơi lạ. Tôi thường rất khó tính, phải cho tôi tiêu chuẩn thì tôi mới so sánh. Không có "thước đo" thì làm sao "đo" 2 "thực thể" để so sánh được?

Sau một loạt bài tôi hiểu là nếu sheet1!A1 = 1 (số), sheet1!A1 = 1 (ô được định dạng là text sau đó nhập 1) thì bạn coi là khác nhau vì bạn viết
Code trước không so sánh được định dạng (value và text), nhưng code của thầy có thể phân biệt so sánh được.

Bây giờ ta xét trường hợp:
- sheet1: A1 = 5
- sheet2: A1 =SUM(A2:A3), A2 = 3, A3 = 2

Code của Ba Tê trả về TRUE, tức 2 ô bạn cho là giống nhau? 1 (số) <> 1 (text) thì cho là 2 ô khác nhau mà trong trường hợp này 2 ô lại như nhau? Vì bản chất 2 ô khác nhau rất nhiều. Một ô chứa hằng sồ, còn ô kia giá trị có thể thay đổi. Sau một nháy mắt sheet2!A3 có thể <> 2 do người dùng thay đổi A3, hoặc vd. A3 chứa công thức tham chiếu tới vd. C2 và người dùng thay đổi C2. Lúc này cả 2 A1 không còn giống nhau mặc dù ta không thay đổi trực tiếp 2 A1.

Có lẽ chính vì để phát hiện trường hợp này mà người ta dùng FormulaLocal thay cho Value?

Nếu bạn muốn người ta làm chính xác với mong đợi của mình thì bạn phải định nghĩa khái niệm "giống nhau" hoặc "khác nhau". Trừ phi bạn chưa nghĩ thấu đáo, khi nào thì coi là như nhau và khi nào thì coi là khác nhau.
 
Upvote 0
Nếu bạn muốn người ta làm chính xác với mong đợi của mình thì bạn phải định nghĩa khái niệm "giống nhau" hoặc "khác nhau". Trừ phi bạn chưa nghĩ thấu đáo, khi nào thì coi là như nhau và khi nào thì coi là khác nhau.
Đúng là chưa thấu đáo anh ạ, bạn ấy đang học
 
Upvote 0
Với một bài như thế này mà mọi người lao vào giải thì tôi cũng thấy lạ.

Muốn giải một bài Toán thì phải biết giả thiết của nó. Ngay cả những định lý Toán không phải bao giờ cũng đúng, hầu như không bao giờ đúng cho mọi trường hợp. Vì thế luôn có vd.: "Nếu hàm f(x) liên tục và có đạo hàm trong đoạn ... thì ...". Tức cái định lý đó chỉ đúng khi hàm f(x) liên tục và có đạo hàm trong đoạn ...

Nhưng không có định nghĩa, thế nào là khác nhau, thế nào là như nhau.

Chưa biết khái niệm "khác nhau", "như nhau" mà đã lao vào giải thì hơi lạ. Tôi thường rất khó tính, phải cho tôi tiêu chuẩn thì tôi mới so sánh. Không có "thước đo" thì làm sao "đo" 2 "thực thể" để so sánh được?

Sau một loạt bài tôi hiểu là nếu sheet1!A1 = 1 (số), sheet1!A1 = 1 (ô được định dạng là text sau đó nhập 1) thì bạn coi là khác nhau vì bạn viết


Bây giờ ta xét trường hợp:
- sheet1: A1 = 5
- sheet2: A1 =SUM(A2:A3), A2 = 3, A3 = 2

Code của Ba Tê trả về TRUE, tức 2 ô bạn cho là giống nhau? 1 (số) <> 1 (text) thì cho là 2 ô khác nhau mà trong trường hợp này 2 ô lại như nhau? Vì bản chất 2 ô khác nhau rất nhiều. Một ô chứa hằng sồ, còn ô kia giá trị có thể thay đổi. Sau một nháy mắt sheet2!A3 có thể <> 2 do người dùng thay đổi A3, hoặc vd. A3 chứa công thức tham chiếu tới vd. C2 và người dùng thay đổi C2. Lúc này cả 2 A1 không còn giống nhau mặc dù ta không thay đổi trực tiếp 2 A1.

Có lẽ chính vì để phát hiện trường hợp này mà người ta dùng FormulaLocal thay cho Value?

Nếu bạn muốn người ta làm chính xác với mong đợi của mình thì bạn phải định nghĩa khái niệm "giống nhau" hoặc "khác nhau". Trừ phi bạn chưa nghĩ thấu đáo, khi nào thì coi là như nhau và khi nào thì coi là khác nhau.

Con chào bác Siwtom,
Dạ vâng, đúng là ngay từ đầu khi đưa code lên con chỉ nghĩ đến việc chuyển code đó sang mảng sẽ nhanh hơn,mà không nghĩ đến việc code đó phân tích cụ thể về các trường hợp khác nhau như thế nào, sau khi được thầy Ba Tê giúp đỡ con mới thử tò mò so sánh kiểm tra các trường hợp, đúng là con chưa thử trường hợp này:
Bây giờ ta xét trường hợp:
- sheet1: A1 = 5
- sheet2: A1 =SUM(A2:A3), A2 = 3, A3 = 2
Code của Ba Tê trả về TRUE, tức 2 ô bạn cho là giống nhau? 1 (số) <> 1 (text) thì cho là 2 ô khác nhau mà trong trường hợp này 2 ô lại như nhau? Vì bản chất 2 ô khác nhau rất nhiều. Một ô chứa hằng sồ, còn ô kia giá trị có thể thay đổi.
Sau khi con thử nghiệm thấy đúng thế ạ,híc cách nào cũng có ưu điểm và nhược điểm,tùy thuộc vào kiểu dữ liệu để áp dụng dùng trường hợp nào,nếu dữ liệu không có công thức thì dùng theo cách của thầy Ba Tê đưa hết vào mảng để so sánh, dùng mảng tốc độ sẽ nhanh phân biệt được text và number, còn với code con đưa lên sử dụng FormulaLocal so sánh được ô chứa công thức nhưng cũng không so sánh được với ô có Format Cells khác nhau (như ví dụ con đã đưa)...
Và con vừa mới tham khảo thêm ở đây để hiểu thêm nhưng dường như chủ đề cũng chưa đi đến kết quả cuối cùng:
https://www.giaiphapexcel.com/diendan/threads/so-sánh-2-range-giúp-mình-với.1716/

Có lẽ chính vì để phát hiện trường hợp này mà người ta dùng FormulaLocal thay cho Value?
Trước đó khi được bạn @befaint hỗ trợ phân tích,con cũng định hỏi bạn ấy về thuộc tính FormulaLocal nhưng con nghĩ có lẽ con sẽ không dùng đến nên con đã không hỏi.

Con cảm ơn bác,
Chúc bác một năm tới sức khỏe ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
@Nguyễn Hoàng Oanh Thơ
"Phụ nữ học VBA thì ai sẽ nội trợ"

Góp phần cho đàn ông thành "bà nội trợ":
Học VBA "siêu tốc hành" 1 , 2 , 3 , 4 ( Suy nghĩ lại chưa muộn )

Phụ nữ nên học VBA viết công thức "Nấu ăn ngon"
Cảm ơn HeSanbi,
Công việc của OT nếu không có sự trợ giúp của GPE thì không biết đến giờ sẽ kinh khủng như thế nào ạ.
Học VBA thì mới có thời gian để nội trợ ạ (không phải ôm việc về nhà làm) :)

Đúng là chưa thấu đáo anh ạ, bạn ấy đang học
Cháu cảm ơn chú Mỹ đã nói đỡ, đúng là do cháu suy nghĩ chưa thấu đáo. Cháu cũng đọc nhiều bài viết về vba và các tài liệu của chú, nhưng hình như đã lâu rồi chú không viết bài ạ?
 
Upvote 0
Cháu cảm ơn chú Mỹ đã nói đỡ, đúng là do cháu suy nghĩ chưa thấu đáo. Cháu cũng đọc nhiều bài viết về vba và các tài liệu của chú, nhưng hình như đã lâu rồi chú không viết bài ạ?
Độ rày tôi cũng bận rộn quá, nhưng vẫn theo dõi diễn đàn và biết rằng GPE bây giờ nhiều người giỏi (nhiều hơn xưa) (befaint chẳng hạn).
Nói nhỏ:
Trừ con ếch xanh, code ào ào mà lý luận không đủ cơ sở, tính logic không đủ, căn bản không đạt
Bác Sa_DQ thì code vững nhưng ít giải thích và phân tích
TB:
- Mà bạn đọc bài số 1089 của befaint rồi mà vẫn còn nói "text và value" và "định dạng" theo cách của bạn?
- Topic nào của befaint mà bạn muốn "dán lên", cho tôi cái link tôi làm ngay.
 
Upvote 0
Độ rày tôi cũng bận rộn quá, nhưng vẫn theo dõi diễn đàn và biết rằng GPE bây giờ nhiều người giỏi (nhiều hơn xưa) (befaint chẳng hạn).
Nói nhỏ:
Trừ con ếch xanh, code ào ào mà lý luận không đủ cơ sở, tính logic không đủ, căn bản không đạt
Bác Sa_DQ thì code vững nhưng ít giải thích và phân tích
TB:
- Mà bạn đọc bài số 1089 của befaint rồi mà vẫn còn nói "text và value" và "định dạng" theo cách của bạn?
- Topic nào của befaint mà bạn muốn "dán lên", cho tôi cái link tôi làm ngay.

Xin chào chú ptm0412,
Cháu cảm ơn chú Mỹ đã thông tin lại ạ, GPE đúng là rất tuyệt vời ạ (rất nhiều người giỏi và tận tình ạ).
- Mà bạn đọc bài số 1089 của befaint rồi mà vẫn còn nói "text và value" và "định dạng" theo cách của bạn?
Híc, đúng là cháu có đọc và hiểu nhưng do thói quen nên cháu chưa sửa được, cháu đã sửa lại và bôi đỏ chỗ đó ạ.

- Topic nào của befaint mà bạn muốn "dán lên", cho tôi cái link tôi làm ngay.
Nếu có thể được nhờ chú Mỹ giúp cháu ghim bài viết này trong box lập trình để khi cần cháu và những người như cháu có thể tìm thấy ngay được ạ.
https://www.giaiphapexcel.com/diendan/threads/index-các-bài-viết-về-vba.129388/#post-811415

Cháu cảm ơn chú Mỹ nhiều ạ
Chúc những ngày nghỉ lễ vui khỏe ạ.
Oanh Thơ
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Nói về text, value, format, formula thì nên tự tìm hiểu, sau đây là 1 cách tự tìm hiểu:

1546320241021.png
 
Upvote 0
Web KT
Back
Top Bottom