Các câu hỏi về mảng trong VBA (Array)

Blue Softs Liên hệ QC

viehoai

Thành viên gắn bó
Tham gia
22/5/09
Bài viết
2,602
Được thích
2,903
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ị
 

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia
4/11/07
Bài viết
11,620
Được thích
32,646
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
Tôi chưa tìm hiểu nhưng tôi có câu hỏi. Có thể chọn nhiều mục trong ListBox hay không? Đã có lúc có người đề nghị MultiSelect = TRUE nhưng không thấy bạn phản đối. Bây giờ tôi lại có cảm giác là bạn cho khả năng chọn nhiều trong ListBox.
File khác và câu hỏi trong file cũng khác rồi anh.
Chọn kiểm tra Từ ngày ... đến ngày ... mà không có dữ liệu (phát sinh) thì cho hiện ra bảng thông báo "Chua phat sinh"
Bạn đưa nhầm file à?
Câu hỏi trong file "Trich loc bao cao" bài 1419 xử lý như sau:
1. Cột K chưa được xoá nên chạy ghi đè lên lần chạy trước, đè không hết thì lòi đầu lòi đuôi ra
2. Không có dữ liệu thì sửa lại:
PHP:
    If k = 0 Then
        MsgBox "No data match"
        Exit Sub
    Else
    With Sheet2
         ....
        Range("E15").Offset(k + 3, 0).Value = "=tvnd(R[-2]C[5])"
        .....
    End With
    End If
 
Upvote 0

dinhduy

Thành viên chính thức
Tham gia
24/11/07
Bài viết
80
Được thích
9
Hãy mô tả cách thức hoạt động code trong Form cho người khác hiểu.

Tôi chưa tìm hiểu nhưng tôi có câu hỏi. Có thể chọn nhiều mục trong ListBox hay không? Đã có lúc có người đề nghị MultiSelect = TRUE nhưng không thấy bạn phản đối. Bây giờ tôi lại có cảm giác là bạn cho khả năng chọn nhiều trong ListBox.
Đoạn code này là chính là của Bác ndu96081631 đấy ah, do em bỏ sót đoạn code đó, và chỉnh lại xíu thôi.
Đúng là có thể chọn được nhiều đối tượng (em chưa bẫy được ah). Vì ở đây e chỉ chọn ra 1 khách hàng và lấy mã khách hàng thôi. Em rất cám ơn anh đã giúp đỡ. MultiSelect = TRUE thật sự em chưa biết là phải làm như thế nào, hix
Bài đã được tự động gộp:

File khác và câu hỏi trong file cũng khác rồi anh.

Bạn đưa nhầm file à?
Câu hỏi trong file "Trich loc bao cao" bài 1419 xử lý như sau:
1. Cột K chưa được xoá nên chạy ghi đè lên lần chạy trước, đè không hết thì lòi đầu lòi đuôi ra
2. Không có dữ liệu thì sửa lại:
PHP:
    If k = 0 Then
        MsgBox "No data match"
        Exit Sub
    Else
    With Sheet2
         ....
        Range("E15").Offset(k + 3, 0).Value = "=tvnd(R[-2]C[5])"
        .....
    End With
    End If
Em cám ơn bác rất nhiều ah, em làm được rồi.
Qua đây hy vọng bác giúp đỡ em bẫy chỗ form tìm kiếm này với :
- Khi nhấn đúp vào ô K2 (sheet DCCN tìm kiếm DMKH). Hiện form tự động tích vào dòng tiêu đề + 1 mã khách hàng.
+ Em muốn tắt tích chọn tự động này (lúc hiện lên).
+ Khi tích chọn khách hàng mới, tích trước tự bỏ dấu tích cũ (chỉ được chọn 1).
Em làm gì lỡ, mong các bác bỏ qua dùm, em mới tập tành (sưu tầm code về tự nghiên cứu, còn ngu muội lắm ah)
 

File đính kèm

  • tim ma khac hang.xlsb
    96 KB · Đọc: 4
Lần chỉnh sửa cuối:
Upvote 0

batman1

Thành viên gạo cội
Tham gia
8/9/14
Bài viết
4,717
Được thích
7,745
Qua đây hy vọng bác giúp đỡ em bẫy chỗ form tìm kiếm này với :
- Khi nhấn đúp vào ô K2 (sheet DCCN tìm kiếm DMKH). Hiện form tự động tích vào dòng tiêu đề + 1 mã khách hàng.
+ Em muốn tắt tích chọn tự động này (lúc hiện lên).
Bạn đọc bài #1418 của tôi bạn không hiểu gì à? Vì trong bài đó tôi giải thích tại sao có "tự động tích vào dòng tiêu đề + 1 mã khách hàng". Và tôi đề nghị cách khắc phục. Tôi chỉ nhầm khi viết MultiSelect = True. Phải là False.

Nhắc lại. Để khắc phục tôi đã đề nghị:
1. Click ListBox để chọn -> trong cửa sổ Properties thiết lập MultiSelect = fmMultiSelectSingle. Xem hình.

1.jpg

2. Trong cửa sổ trong hình ở điểm 1 thiết lập ListStyle = fmListStylePlain

3. Do tôi không hiểu ý tưởng đúp chuột trong ô K2 nên tôi đề nghị dùng Button để hiện thị UserForm: trên ribbon chọn thẻ Developer -> nút Insert -> chọn Button

2.jpg

-> nhấn chuột trên sheet và kéo sang chỗ khác rồi nhả chuột để vẽ 1 hình chữ nhật nhỏ -> trong cửa sổ "Assign Macro" vừa nhẩy ra nhấn nút New -> sửa code vừa có thành
Mã:
Sub Button1_Click()
    frm_DMKH.Show
End Sub

4. Xóa code cũ: trong cửa sổ Project - VBAProject đúp chuột vào Sheet6 (DCCN) -> ở phần bên phải xóa hết từ Private Sub Worksheet_BeforeDoubleClick ... tới End Sub

Tôi hướng dẫn để tương lai bạn biết cách làm. Trong tập tin tôi đã làm cho bạn.
 

File đính kèm

  • tim ma khac hang.xlsb
    80.4 KB · Đọc: 13
Lần chỉnh sửa cuối:
Upvote 0

dinhduy

Thành viên chính thức
Tham gia
24/11/07
Bài viết
80
Được thích
9
Bạn đọc bài #1418 của tôi bạn không hiểu gì à? Vì trong bài đó tôi giải thích tại sao có "tự động tích vào dòng tiêu đề + 1 mã khách hàng". Và tôi đề nghị cách khắc phục. Tôi chỉ nhầm khi viết MultiSelect = True. Phải là False.

Nhắc lại. Để khắc phục tôi đã đề nghị:
1. Click ListBox để chọn -> trong cửa sổ Properties thiết lập MultiSelect = fmMultiSelectSingle. Xem hình.

View attachment 245900

2. Trong cửa sổ trong hình ở điểm 1 thiết lập ListStyle = fmListStylePlain

3. Do tôi không hiểu ý tưởng đúp chuột trong ô K2 nên tôi đề nghị dùng Button để hiện thị UserForm: trên ribbon chọn thẻ Developer -> nút Insert -> chọn Button

View attachment 245901

-> nhấn chuột trên sheet và kéo sang chỗ khác rồi nhả chuột để vẽ 1 hình chữ nhật nhỏ -> trong cửa sổ "Assign Macro" vừa nhẩy ra nhấn nút New -> sửa code vừa có thành
Mã:
Sub Button1_Click()
    frm_DMKH.Show
End Sub

4. Xóa code cũ: trong cửa sổ Project - VBAProject đúp chuột vào Sheet6 (DCCN) -> ở phần bên phải xóa hết từ Private Sub Worksheet_BeforeDoubleClick ... tới End Sub

Tôi hướng dẫn để tương lai bạn biết cách làm. Trong tập tin tôi đã làm cho bạn.
Em cám ơn bác rất nhiều nha!
Em nghiên cứu kết hợp chọn thành 1 cái form luôn
- Từ ngày ... đến ngày ...
- Mã khách hàng ... Tạo báo cáo
Có chỗ nào không hiểu mong bác chỉ giúp ah.
 
Upvote 0

dominic_cafein

Thành viên mới
Tham gia
16/10/18
Bài viết
5
Được thích
2
Chào mọi người. Ví dụ em có chuỗi giá trị từ 0 đến 9; nếu em gõ giá trị 1 và 9 vào 2 ô A1, B1, thì em muốn các ô còn lại sẽ tự động hiện lần lượt theo thứ tự từ bé đến lớn các giá trị còn lại trong tập số {0,9} nghĩa là sẽ hiển thị: 0 2 3 4 5 6 7 8 ở các ô còn lại. mọi người giúp em với ạ!
 
Upvote 0

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia
4/11/07
Bài viết
11,620
Được thích
32,646
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
Chào mọi người. Ví dụ em có chuỗi giá trị từ 0 đến 9; nếu em gõ giá trị 1 và 9 vào 2 ô A1, B1, thì em muốn các ô còn lại sẽ tự động hiện lần lượt theo thứ tự từ bé đến lớn các giá trị còn lại trong tập số {0,9} nghĩa là sẽ hiển thị: 0 2 3 4 5 6 7 8 ở các ô còn lại. mọi người giúp em với ạ!
Dùng 1 vòng lặp từ 0 đến 9 và 1 cái if nếu đã có trong A1, B1 thì bỏ qua, ngược lại thì bỏ vào "các ô còn lại"
 
Upvote 0

moihocvba

Thành viên hoạt động
Tham gia
16/8/20
Bài viết
102
Được thích
22
Cho em hỏi đưa 2 hoặc nhiều range vào 1 mảng để dùng vòng lặp cùng lúc thì làm như thế nào ạ?
Ví dụ đưa arr = range("A1:A10").value, rồi đưa tiếp arr = range("B1:B10").value nối tiếp phần trước thì làm như nào ạ?
Em cảm ơn!
 
Upvote 0

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia
4/11/07
Bài viết
11,620
Được thích
32,646
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
Cho em hỏi đưa 2 hoặc nhiều range vào 1 mảng để dùng vòng lặp cùng lúc thì làm như thế nào ạ?
Ví dụ đưa arr = range("A1:A10").value, rồi đưa tiếp arr = range("B1:B10").value nối tiếp phần trước thì làm như nào ạ?
Em cảm ơn!
Mỗi range 1 vòng lặp từ 1 đến dòng cuối mỗi range, mảng kết quả chỉ cần 1 mảng
 
Upvote 0

buiquangthuan

Thành viên tiêu biểu
Tham gia
17/12/10
Bài viết
759
Được thích
445
Giới tính
Nam
Chào các thầy cô ạ.
Cho em hỏi chút, Chẳng hạn khi chạy code xong. em có 1 mảng 2 chiều:
Res( 1 to 10, 1 to 5)
Nếu em muốn sort ngay trên mảng theo tiêu chí cột Res(1,1) từ A tới Z thì có cách nào không ạ?
Mong thầy cô giúp đỡ.
Em xin cám ơn nhiều ạ
 
Upvote 0

Maika8008

Thành viên gắn bó
Tham gia
12/6/20
Bài viết
2,550
Được thích
2,819
Donate (Momo)
Donate
Giới tính
Nam
Chào các thầy cô ạ.
Cho em hỏi chút, Chẳng hạn khi chạy code xong. em có 1 mảng 2 chiều:
Res( 1 to 10, 1 to 5)
Nếu em muốn sort ngay trên mảng theo tiêu chí cột Res(1,1) từ A tới Z thì có cách nào không ạ?
Mong thầy cô giúp đỡ.
Em xin cám ơn nhiều ạ
Tôi thấy việc dùng VBA chép mảng lên sheet, sort rồi đưa lại vào mảng cũng là giải pháp tốt mà.
 
Upvote 0

buiquangthuan

Thành viên tiêu biểu
Tham gia
17/12/10
Bài viết
759
Được thích
445
Giới tính
Nam
Tôi thấy việc dùng VBA chép mảng lên sheet, sort rồi đưa lại vào mảng cũng là giải pháp tốt mà.
Em cũng làm như vậy. Nhưng không hiểu sao. Cứ mỗi lần sort. Nó bị treo excell luôn. Cảm giác rất là đơ máy ạ. Nên mới nghĩ sort ngay trên mảng kết quả ạ
 
Upvote 0

tigertiger

Coming back ...
Tham gia
25/1/07
Bài viết
1,839
Được thích
1,746
Chào các thầy cô ạ.
Cho em hỏi chút, Chẳng hạn khi chạy code xong. em có 1 mảng 2 chiều:
Res( 1 to 10, 1 to 5)
Nếu em muốn sort ngay trên mảng theo tiêu chí cột Res(1,1) từ A tới Z thì có cách nào không ạ?
Mong thầy cô giúp đỡ.
Em xin cám ơn nhiều ạ
Có cách tìm kiếm thuật toán sort mảng, ngay GPE cũng nhiều, các từ khóa tìm sau sẽ có kết quả:
Quick sort, Bubble sort
array list sort
 
Upvote 0

ptm0412

Bad Excel Member
Thành viên BQT
Super Moderator
Tham gia
4/11/07
Bài viết
11,620
Được thích
32,646
Donate (Momo)
Donate
Giới tính
Nam
Nghề nghiệp
Consultant
Nếu cho vòng lặp chạy vậy thì nó chậm ko ạ? còn cách nào khác ko chú ?
Mỗi dòng dữ liệu dù ở range nào cũng bắt buộc duyệt qua 1 lần, thì thuật toán bắt buộc phải nhiều vòng lặp như thế. Còn thủ thuật thì dùng mảng nhanh hơn dùng Cell và Range
 
Upvote 0

moihocvba

Thành viên hoạt động
Tham gia
16/8/20
Bài viết
102
Được thích
22
Mỗi dòng dữ liệu dù ở range nào cũng bắt buộc duyệt qua 1 lần, thì thuật toán bắt buộc phải nhiều vòng lặp như thế. Còn thủ thuật thì dùng mảng nhanh hơn dùng Cell và Range
Con vẫn chưa hiểu chú ơi, con lấy ví dụ ở đây, chú giúp con viết một code đưa dữ liệu ở cột A và cột B vào mảng arr giúp con, mục đích là để chọn chạy vòng lặp trong mảng để lấy ra giá trị ko trùng dán vào cột I.

1618717095111.png

Ở đây con ví dụ phần dữ liệu này ở một sheet chứ thật ra bài toán thực tế nó nằm ở nhiều sheet khác nhau, và nhiều cột hơn thế.
Chú viết giúp con một cái code cho con dễ hình dung nhé! Cám ơn chú!
 
Upvote 0

Excel my love_1

Thành viên thường trực
Tham gia
12/11/19
Bài viết
280
Được thích
167
Em chào các thầy cô ạ.
Em muốn dùng cách nạp và dán mảng xuống bảng tính để đưa tất cả dữ liệu vùng Filter A1:A22 (bao gồm cả các ô đang bị lọc và các ô hiển thị theo điều kiện lọc) sang cột B (mục đích là copy toàn bộ dữ liệu cột A sang cột B nhưng vẫn để ở chế độ lọc ấy ạ)
Nhưng kết quả lại ra tùm lum
Em gửi file đính kèm Mong thầy cô giúp đỡ.
Em xin cám ơn nhiều ạ
 

File đính kèm

  • Dan mang Filter.xlsb
    24.1 KB · Đọc: 18
Upvote 0

HieuCD

Chuyên gia GPE
Tham gia
14/9/10
Bài viết
8,494
Được thích
17,834
Em chào các thầy cô ạ.
Em muốn dùng cách nạp và dán mảng xuống bảng tính để đưa tất cả dữ liệu vùng Filter A1:A22 (bao gồm cả các ô đang bị lọc và các ô hiển thị theo điều kiện lọc) sang cột B (mục đích là copy toàn bộ dữ liệu cột A sang cột B nhưng vẫn để ở chế độ lọc ấy ạ)
Nhưng kết quả lại ra tùm lum
Em gửi file đính kèm Mong thầy cô giúp đỡ.
Em xin cám ơn nhiều ạ
Nạp từng ô
Mã:
Sub RoundedRectangle1_Click()
Dim arr(), i&, lr1&
 
With ActiveSheet
  lr1 = Val(Split(ActiveSheet.AutoFilter.Range.Address, "$")(4)) 'tim dong cuoi cua vung dang loc
  arr = .Range("A2:A" & lr1).Value ' gan gia tri vung A vao mang arr()
  For i = 1 To UBound(arr) ' nap mang arr xuong vung cot B
    .Range("B" & i + 1).Value = arr(i, 1)
  Next i
End With
End Sub
 
Upvote 0
Top Bottom