Cách so sánh 2 chuổi aray giống nhau năm 2024

Túm lại, mảng dọc bắt buộc là mảng 2 chiều. Mảng ngang thì tuỳ theo cách gán giá trị, gán bằng range trên sheet thì 2 chiều.

Thí dụ 2 sub sau:

PHP:

Sub Test1()
Dim Arr As Variant
ReDim Arr(1 To 10)
Arr = Range("A1:J1").Value
MsgBox Arr(4)
End Sub

PHP:

Sub Test2()
Dim Arr As Variant
ReDim Arr(1 To 10)
For i = 1 To 10
Arr(i) = Cells(1, i)
Next
MsgBox Arr(4)
End Sub

Test1 sẽ bị lỗi. Mà phải sửa thành MsgBox Arr(1, 4)

Lần chỉnh sửa cuối: 24/3/11

Cách so sánh 2 chuổi aray giống nhau năm 2024

  • 6

    Arr(i, j) là phần tử của mảng tại dòng i, cột j của mảng Do khai báo Dim Arr As variant và không khai báo chiều, nên mặc định Arr là mảng 2 chiều A1:A10 là mảng dọc, không có nghĩa là mảng 1 chiều, đó là mảng 10 dòng 1 cột.

Muốn khai báo mảng 1 chiều thì khai báo Dim Arr As variant Redim Arr(10) Nhưng lúc này mặc định mảng 1 chiều lại là mảng ngang.

Túm lại, mảng dọc bắt buộc là mảng 2 chiều.

Xin anh giải thích thêm 1. Thế trường hợp Mãng 1 chiều là mãng ngang với các phần tử là giá trị từ A1 đến A10 không được hả anh ? 2. Như trên anh khái báo

PHP:

Dim Arr As variant
Redim Arr(10)

Không khai báo luôn

Mà phải Redim ? Cảm ơn anh nhiều

Cách so sánh 2 chuổi aray giống nhau năm 2024

  • 7

    Xin anh giải thích thêm 1. Thế trường hợp Mãng 1 chiều là mãng ngang với các phần tử là giá trị từ A1 đến A10 không được hả anh ? 2. Không khai báo luôn Dim Arr(10)Mà phải Redim

1. Mảng ngang với các giá trị từ A1 đến A10: Được, gán từng giá trị một.:

Nhưng vẫn là ngang nhé, nên nếu gán ngược xuống sheet thì phải coi chừng quên.

PHP:

Sub Test3 ()
Dim Arr(1 to 10)
For i = 1 to 10
Arr(i) = Cells(i, 1)
Next
Range("B1:B10") = Arr
Range("C5:L5") = Arr
End Sub

Ta sẽ thấy B1:B10 cả 10 ô có cùng giá trị của A1. trong khi đó C5:L5 hiện đầy đủ theo hàng ngang.

2. Khai báo Arr(10) hay Khai báo Arr rồi ReDim Arr(10):

Tác dụng giống nhau. Nhưng Redim có cái lợi hơn vì cứ khai báo mảng khi kích thước mảng chưa biết. Sau đó tính toán kích thước xong mới ReDim lại.

3. Ghi chú: Mặc định phần tử đầu của mảng đánh số 0, nên Arr(10) sẽ có 11 phần tử từ 0 đến 10. Và khi gán Cell(i, j) cho phần tử, sẽ bị lỗi vì không có cells(0,j) hoặc cells(i, 0) Có 2 cách để cho Arr bắt đầu bằng 1:

- Dùng câu lệnh Option Base 1 trên đầu module - Khai báo Arr(1 to 10), hoặc Arr(1 to 10, 1 to 1)

Cách so sánh 2 chuổi aray giống nhau năm 2024

  • 8

    Xin anh giải thích thêm 1. Thế trường hợp Mãng 1 chiều là mãng ngang với các phần tử là giá trị từ A1 đến A10 không được hả anh ? 2. Như trên anh khái báo

PHP:

Dim Arr As variant Redim Arr(10)

Không khai báo luôn

Mà phải Redim ? Cảm ơn anh nhiều

Ban chỉ cần nhớ điều này: - Range và mảng không giống nhau - 1 Range sau khi biến đổi thành mảng thì đó luôn là mảng 2 chiều - Muốn biến thành mảng 1 chiều phải thêm các công đoạn khác, chẳng hạn dùng For... Next hoặc hàm TRANSPOSE --- Hiểu thế là mọi chuyện êm xuôi

Cách so sánh 2 chuổi aray giống nhau năm 2024

  • 9

    Ban chỉ cần nhớ điều này: - Range và mảng không giống nhau - 1 Range sau khi biến đổi thành mảng thì đó luôn là mảng 2 chiều - Muốn biến thành mảng 1 chiều phải thêm các công đoạn khác, chẳng hạn dùng For... Next hoặc hàm TRANSPOSE --- Hiểu thế là mọi chuyện êm xuôi

3 ý trên em hiểu sâu được vấn đề hơn. Trường hợp "Muốn biến thành mảng 1 chiều phải thêm các công đoạn khác, chẳng hạn dùng For... Next hoặc hàm TRANSPOSE" em hiểu được nhưng cách làm theo Transpost thì chưa biết, xin Sư phụ cho ví dụ. Cảm ơn Sư phụ và Thầy Mỹ

Cách so sánh 2 chuổi aray giống nhau năm 2024

  • 10

    3 ý trên em hiểu sâu được vấn đề hơn. Trường hợp "Muốn biến thành mảng 1 chiều phải thêm các công đoạn khác, chẳng hạn dùng For... Next hoặc hàm TRANSPOSE" em hiểu được nhưng cách làm theo Transpost thì chưa biết, xin Sư phụ cho ví dụ. Cảm ơn Sư phụ và Thầy Mỹ

Ví dụ thế này: - Bạn có dữ liệu tại A1:A10 - Bạn muốn nối chuổi từ các cell ở vùng trên - Bạn nghĩ ra có thể dùng làm Join để làm điều này - Nhưng hàm Join chỉ làm việc với mảng 1 chiều - Vậy việc của bạn phải biến Range("A1:A10") thành 1 mảng và phải là mảng 1 chiều Ta làm như sau:

PHP:

Sub Test()
  Dim Arr
  Arr = Range("A1:A10").Value
  Arr = WorksheetFunction.Transpose(Arr)
  Range("B1") = Join(Arr, ", ")
End Sub

Rút gọn:

PHP:

Sub Test()
  Dim Arr
  Arr = WorksheetFunction.Transpose(Range("A1:A10"))
  Range("B1") = Join(Arr, ", ")
End Sub

Rút gọn tiếp:

PHP:

Sub Test()
  Range("B1") = Join(WorksheetFunction.Transpose(Range("A1:A10")), ", ")
End Sub

Tóm lại: - Với 1 Range là 1 vùng có nhiều dòng, 1 cột thì khi qua hàm TRANSPOSE nó sẽ biến thành mảng 1 chiều - Với 1 Range là 1 vùng có nhiều cột, 1 dòng thì khi qua hàm TRANSPOSE nó sẽ biến thành mảng 2 chiều (có thể mường tượng là mảng dọc) ---> Lại qua hàm TRANSPOSE tiếp lần nữa, nó sẽ biến thành mảng 1 chiều Ví dụ: Nối chuổi các cell trong vùng A1:J1

PHP:

Gán các giá trị của Cells từ A1 đến A10 vào 1 mảng Arr

0

Phải 2 lần TRANSPOSE mới có thể biến Range("A1:J1") thành mảng 1 chiều ----- Nói thêm: - Đã gọi là mảng 1 chiều thì không mường tượng nó là DỌC NGANG gì cả... đơn giàn là MẢNG 1 CHIỀU thôi - Mảng 1 chiều và 2 chiều có thể mường tượng chúng khác nhau như khi so sánh ĐƯỜNG THẰNG và MẶT PHẲNG vậy (đường thẳng chỉ có duy nhất chiều dài, còn mặt phẳng thì mới có 2 chiều DỌC, NGANG)

Lần chỉnh sửa cuối: 25/3/11

Cách so sánh 2 chuổi aray giống nhau năm 2024

  • 11

    Nói thêm: - Đã gọi là mảng 1 chiều thì không mường tượng nó là DỌC NGANG gì cả... đơn giàn là MẢNG 1 CHIỀU thôi - Mảng 1 chiều và 2 chiều có thể mường tượng chúng khác nhau như khi so sánh ĐƯỜNG THẰNG và MẶT PHẲNG vậy (đường thẳng chỉ có duy nhất chiều dài, còn mặt phẳng thì mới có 2 chiều DỌC, NGANG)

Dẫu rằng nói 1 chiều thì không có dọc ngang, tựa như đường thẳng, và khác với mặt phẳng. Nhưng đó là xét theo hệ quy chiếu là đứng trong không gian 1 chiều và đang chỉ nhận thức được 1 chiều.

Giả sử tồn tại 1 thế giới mà sinh vật ở đó chỉ nhận thức được 1 chiều trong không gian, thì khi 1 vật thể di chuyển dọc theo đường thẳng, anh ta sẽ trông thấy sự dịch chuyển. Nếu 1 sinh vật ở hành tinh khác đến và nhận thức được không gian 2 chiều, anh ta đi ra khỏi đường thẳng vào chiều thứ 2. Vậy sinh vật tại đó sẽ nghĩ gì? Nó cho rằng sinh vật lạ đã biến mất. Còn đối với sinh vật ở hành tinh khác đến, thì nghĩ: tao đâu có biến mất, mày chỉ đi được theo chiều X của tao, còn tao đi 2 hướng, vừa X vừa Y. (Suy luận tương tự giữa không gian 2 chiều, 3 chiều, và n chiều)

Và khi sinh vật lạ này kể cho đồng hương của nó nghe, nó sẽ kể: Tụi nó chỉ đi ngang hông à, hông có ra khỏi cái đường thẳng đó được.

Chữ ngang để làm chi? để vẽ ra cho đồng hương nó hiểu.

Tưởng tượng xong, quay về Array. Array 1 chiều mà gán xuống sheet (bảng 2 chiều), thì phải gán ngang. Gán dọc là sai.

Nên vẫn phải hình dung mảng 1 chiều là mảng ngang!

Vì ta là thành viên GPE, thế giới GPE là thế giới bảng tính có ít nhất 2 chiều, và ta là sinh vật nhận thức được n chiều. ​

Lần chỉnh sửa cuối: 26/3/11

Cách so sánh 2 chuổi aray giống nhau năm 2024

  • 12

    Chữ ngang để làm chi? để vẽ ra cho đồng hương nó hiểu. Tưởng tượng xong, quay về Array. Array 1 chiều mà gán xuống sheet (bảng 2 chiều), thì phải gán ngang. Gán dọc là sai.

Dạ, cái này em biết nhưng nhiều lúc em sợ rằng mường tượng nhiều quá sẽ dẫn đến ngộ nhận Giống như trường hợp Add List cho 1 ListBox - Em có dữ liệu tại A1:A3 - Muốn muốn Add dữ liệu này vào ListBox1 - Mường tượng rằng ListBox được xếp theo chiều dọc, mà thằng A1:A3 cũng đang dọc, vậy thì cứ Add thoải mái

PHP:

Gán các giá trị của Cells từ A1 đến A10 vào 1 mảng Arr

1

Test thử thấy OK Còn hơi nghi ngờ, Test thử bằng code thứ 2:

PHP:

Gán các giá trị của Cells từ A1 đến A10 vào 1 mảng Arr

2

Kết quả = TRUE??? Vậy là sao? Từ 1 mảng "dọc" (2 chiều) sau cho vào ListBox, lấy ra kiểm tra nó lại thành "ngang" (1 chiều) ??? Test tiếp 1 sub khác:

PHP:

Gán các giá trị của Cells từ A1 đến A10 vào 1 mảng Arr

3

Arr đương nhiên là mảng 1 chiều, và nó "ngang" theo cách nói của sư phụ, vậy mà vẫn Add vào ListBox được bình thường Đồng ý rằng có sự "biến đổi" gì đó trong quá trình Add List nhưng nếu ngay từ đầu mình quá tin vào cái vụ "ngang" này thì không khỏi có lúc bị lúng túng (em đã từng bị vậy) Cũng giống như trường hợp mảng 1 chiều khi gán vào Sheet thì phải gán theo chiều ngang, nhưng khi lấy dữ liệu "ngang" ấy từ sheet để biến nó thành mảng thì mảng ấy lại vẫn cứ... 2 chiều (chẳng làm cách nào cho nó "ngang" được nếu không thông qua quá trình biến đổi) Thôi thì ngay từ đầu khẳng định rằng mảng 1 chiều không "ngang, dọc" gì cả... Có "ngang" chăng là do ta tự mường tượng ra cho phù hợp với những suy luận của riêng ta mà thôi Ẹc... Ẹc... (Mong sư phụ đừng giận em phản biện, vì đàng nào thì mấy cái Array này cũng do sư phụ dạy em)

Lần chỉnh sửa cuối: 26/3/11

Cách so sánh 2 chuổi aray giống nhau năm 2024

  • 13

Ziận kí rì mà ziận. Có trao đổi mới cùng tiến bộ chứ. Vấn đề ở trong bài của ndu vừa viết, so với việc "gán xuống sheet phải gán ngang" đó là 2 sự tương tác khác nhau:

- Gán xuống sheet là sự tương tác giữa 2 thế giới 1 chiều và 2 chiều. - Xử lý Arr, xào nấu chế biến, mắm muối tương cà, đó là sự tương tác giữa thế giới 1 chiều với nhau.

Range của sheet, rõ ràng là 2 chiều. Array là sản phẩm của VBA, anh này thông minh, nên 1 chiều cũng lụm, 2 chiều cũng lụm. Nhưng hễ 1 chiều thì anh í thích "ngang" cơ. Nên lụm về là quất sang 1 chiều cho tụi dân bản địa nó xơi cho nhanh.

Còn khi gán vào Listbox, là sản phẩm của VBA (1 chiều hoặc 2 chiều), bản thân cái listbox là hàng xuất khẩu, đã thiết kế dọc cho người 2 chiều dùng, nên nó lại phải xoay dọc ra trước khi gán.

Code Test3 ở trên, nếu thêm 2 dòng lệnh này sẽ thấy:

PHP:

Gán các giá trị của Cells từ A1 đến A10 vào 1 mảng Arr

4

Arr vẫn cứ ngang, còn Listbox thì vẫn cứ dọc. Vì listbox dùng để tương tác với cư dân 2 chiều. Còn Arr để bọn nó xơi với nhau.

Cáng nói càng thấy khó xơi, nhưng nếu hiểu bản chất thì tốt hơn.

Thôi thì Nó dọc ngang gì kệ nó, nhưng nhớ khi gán xuống sheet thì nó ngang, muốn gán dọc thì transpose. Hoặc chẳng cần nhớ. Gán xuống thấy sai thì gán lại.

Cách so sánh 2 chuổi aray giống nhau năm 2024

  • 14

    Còn hơi nghi ngờ, Test thử bằng code thứ 2:

PHP:

Gán các giá trị của Cells từ A1 đến A10 vào 1 mảng Arr

5

</span> </span>

Kết quả = TRUE??? Vậy là sao? Từ 1 mảng "dọc" (2 chiều) sau cho vào ListBox, lấy ra kiểm tra nó lại thành "ngang" (1 chiều)

Khúc này ndu chưa test đúng cách. IsArray(Arr) = True đâu thể khẳng định nó 1 chiều, hay là ngang?

Phải Test thế này:

PHP:

Gán các giá trị của Cells từ A1 đến A10 vào 1 mảng Arr

6

Sẽ bị lỗi dòng cuối.

Nếu Arr là mảng ngang, sao gán xuống sheet hàng ngang bị sai? Nếu Arr là mảng 1 chiều, sao không truy xuất được Arr(1)?

Vậy mà thay câu cuối bằng MsgBox Arr(1, 0) thì OK. Vì Arr là 2 chiều, kính thưa toàn thể đại biểu! Vì Arr lấy giá trị từ Listbox, nên Listbox cũng 2 chiều, kính thưa toàn thể anh chị em quan viên hai họ!

Cách so sánh 2 chuổi aray giống nhau năm 2024

  • 15

    Nếu Arr là mảng ngang, sao gán xuống sheet hàng ngang bị sai? Nếu Arr là mảng 1 chiều, sao không truy xuất được Arr(1)?
Vậy mà thay câu cuối bằng MsgBox Arr(1, 0) thì OK. Vì Arr là 2 chiều, kính thưa toàn thể đại biểu! Vì Arr lấy giá trị từ Listbox, nên Listbox cũng 2 chiều, kính thưa toàn thể anh chị em quan viên hai họ!

Vâng, em sơ suất chổ này nhưng sư phụ test như vậy cũng nói lên rằng: Mảng 1 chiều (mà sư phụ cho là ngang ấy) sau khi đưa vào ListBox thì nó lại biến thành dọc ( 2 chiều) giống y chang trường hợp gán mảng vào Range

Ý em muốn nói rằng

: Nếu ta nhìn vào Range trên sheet thì sau khi thí nghiệm ta sẽ cảm giác "Thì ra mảng 1 chiều nó hơi... ngang ngang"... Nhưng nếu lấy ListBox làm thí nghiệm thì ta lại nghĩ ngược lại: "Thì ra mảng 1 chiều nó hơi.. dọc dọc" Khi nghiên cứu sâu hơn về mảng thì cái thuật ngữ "dọc, ngang" đôi lúc sẽ khiến ta bị rối Ẹc... Ẹc... (Ý em chỉ nới về sự mường tượng, sợ rằng "chấp nhận" sẽ khiến ta "ngộ nhận" chứ không phải em không đồng ý với các ý kiến của sư phụ) ------ Nói thêm 1 điều theo kinh nghiệm của em:Để biết mảng có phải 1 chiều hay không, em thường dùng hàm Join để test -> Nếu báo lỗi thì đấy không phải là mảng 1 chiều ------ Cuối cùng em kết nhất chổ này:

Thôi thì Nó dọc ngang gì kệ nó, nhưng nhớ khi gán xuống sheet thì nó ngang, muốn gán dọc thì transpose. Hoặc chẳng cần nhớ. Gán xuống thấy sai thì gán lại.

Vì khi viết code em cũng từng làm thế

Lần chỉnh sửa cuối: 26/3/11

Cách so sánh 2 chuổi aray giống nhau năm 2024

  • 16

    (Ý em chỉ nới về sự mường tượng, sợ rằng "chấp nhận" sẽ khiến ta "ngộ nhận" chứ không phải em không đồng ý với các ý kiến của sư phụ)

Vậy mường tượng thêm 1 điều, Listbox và những cái tương tự là đồ xuất khẩu cho cư dân 2 chiều xài. Thì dân 1 chiều phải chế tác cho phù hợp con mắt 2 chiều mới bán được.

Còn cứ lấy sản phẩm 1 chiều của nó về xài, thì tự mình phải chế lại.

Lần chỉnh sửa cuối: 26/3/11

Cách so sánh 2 chuổi aray giống nhau năm 2024

  • 17

    Vậy mường tượng thêm 1 điều, Listbox và những cái tương tự là đồ xuất khẩu cho cư dân 2 chiều xài. Thì dân 1 chiều phải chế tác cho phù hợp con mắt 2 chiều mới bán được. Còn cứ lấy sản phẩm 1 chiều của nó về xài, thì tự mình phải chế lại.

Cảm ơn sư phụ... Để tài rất thú vị! Vậy sư phụ có dự định viết 1 bài về Array (1 chiều và 2 chiều) không nhỉ? Cũng cơ bản về dễ hiểu giống như bài viết về For.. Next ấy (Em đã từng nhở bài viết ấy mà nên người)

Cách so sánh 2 chuổi aray giống nhau năm 2024

  • 18

Hy vọng rằng đây chính là topic đó. Theo cách là ai có thắc mắc cứ vào đây hỏi, ai biết thì cứ trả lời. Mình sẽ sẵn sàng tham gia. Mà đã tham gia rồi đấy thôi? Nói kiểu không gian 1 chiều, 2 chiều, và sinh vật ngoài hành tinh cũng đâu có khó hiểu lắm nhỉ?