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ị
 
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
Dạ code ra đúng ý em rồi ạ. Tuyệt vời ạ. 10 năm đèn sách không bằng 1 lần gặp đúng thầy, Cách nạp từng ô nhanh hơn hẳn.
Hôm qua em không làm được là định loay hoay chuyển hướng đi đường dài xa xôi, em định lưu điều kiện lọc hiện tại vào 1 biến, rồi tắt lọc, dán vào cột B, rồi lại lọc trở lại theo biến đã lưu (nếu làm vậy quá là cực khổ ạ).
 
Upvote 0
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 ạ
office 365 có hàm này
=FILTER($A$2:$A$400,A2:A400>5,"")
 
Upvote 0
Xin chào mọi người. mình mới tham gia diễn đàn và đang mày mò tự học VBA. Hiện mình đang có mấy vướng mắc nhờ những người có kinh nghiệm chỉ giúp
Hiện tại do phải xử lý số liệu nên mình set dữ liệu từ các cột ở Excel vào mảng ( 1 cột sẽ là 1 mảng 1 chiều) , tuy nhiên mình không biết ở thuộc tính mảng có thực hiện được các hàm SUM, SUMIF, Countif..... như bình thường đối với cột , hàng ở excel không ạ?
Nếu được xin cho vi dụ mình họa
Xin cảm ơn!
 
Upvote 0
Xin chào mọi người. mình mới tham gia diễn đàn và đang mày mò tự học VBA. Hiện mình đang có mấy vướng mắc nhờ những người có kinh nghiệm chỉ giúp
Hiện tại do phải xử lý số liệu nên mình set dữ liệu từ các cột ở Excel vào mảng ( 1 cột sẽ là 1 mảng 1 chiều) , tuy nhiên mình không biết ở thuộc tính mảng có thực hiện được các hàm SUM, SUMIF, Countif..... như bình thường đối với cột , hàng ở excel không ạ?
Nếu được xin cho vi dụ mình họa
Xin cảm ơn!
1 cột đưa vào mảng không phải là mảng 1 chiều mà là mảng 2 chiều nhưng có 1 cột, biểu thị là arr(x, 1). Mảng 1 chiều chỉ biểu thị bằng 1 tham số arr(x)

Những hàm Excel không có hiệu lực gì trong mảng cả.
 
Upvote 0
Xin chào mọi người. mình mới tham gia diễn đàn và đang mày mò tự học VBA. Hiện mình đang có mấy vướng mắc nhờ những người có kinh nghiệm chỉ giúp
Hiện tại do phải xử lý số liệu nên mình set dữ liệu từ các cột ở Excel vào mảng ( 1 cột sẽ là 1 mảng 1 chiều) , tuy nhiên mình không biết ở thuộc tính mảng có thực hiện được các hàm SUM, SUMIF, Countif..... như bình thường đối với cột , hàng ở excel không ạ?
Nếu được xin cho vi dụ mình họa
Xin cảm ơn!
Hàm khác thì chưa thử, hàm SUM() có vẻ là được.
Nhập số bất kỳ tại A1:A3 của sheet1 rồi chạy thử sub dưới đây
Mã:
Option Explicit

Sub test()
Dim Mang
Dim Kq
Mang = Sheet1.Range("A1:A3")
Kq = WorksheetFunction.Sum(Mang)
MsgBox Kq
End Sub
 
Upvote 0
Hàm khác thì chưa thử, hàm SUM() có vẻ là được.
Nhập số bất kỳ tại A1:A3 của sheet1 rồi chạy thử sub dưới đây
Mã:
Option Explicit

Sub test()
Dim Mang
Dim Kq
Mang = Sheet1.Range("A1:A3")
Kq = WorksheetFunction.Sum(Mang)
MsgBox Kq
End Sub
Cái này thì đơn giản và nhanh, tuy nhiên cẩn thận với dữ liệu số nhưng định dạng ở dạng chuỗi, nó sẽ không cộng vào đâu. Trước đó 15 năm về trước mình bị thằng đồng nghiệp chơi khăm, nó đặt dấu nháy trước số và định dạng nó về bên phải y chang như các số khác, thế là trong bản báo cáo của mình sếp kiểm tra lại mình bị sếp quở, sau này thì mình rất kỹ việc này, tự tạo hàm SUM VBA cho chắc ăn, dù cho số nó ở dạng gì.
 
Upvote 0
Cái này thì đơn giản và nhanh, tuy nhiên cẩn thận với dữ liệu số nhưng định dạng ở dạng chuỗi, nó sẽ không cộng vào đâu. Trước đó 15 năm về trước mình bị thằng đồng nghiệp chơi khăm, nó đặt dấu nháy trước số và định dạng nó về bên phải y chang như các số khác, thế là trong bản báo cáo của mình sếp kiểm tra lại mình bị sếp quở, sau này thì mình rất kỹ việc này, tự tạo hàm SUM VBA cho chắc ăn, dù cho số nó ở dạng gì.
Hướng dẫn giúp mình các gọi các model
SUB ten_ham()
Trong cá ngoăng cụ thể khai bao như thế nào để nó hiểu là biến truyền thông tin và biến nhận giá trị. XIn cảm ơn!
 
Upvote 0
Hướng dẫn giúp mình các gọi các model
SUB ten_ham()
Trong cá ngoăng cụ thể khai bao như thế nào để nó hiểu là biến truyền thông tin và biến nhận giá trị. XIn cảm ơn!
Bạn đang hỏi tôi về chủ đề nào vậy? Bạn phải trích bài đó vào đây, chứ hỏi như thế tôi biết đường đâu mà trả lời?
 
Upvote 1
Upvote 0
em mới học và mới đọc qua các bài đầu ở bài viết chủ đề về mảng này
các ACE và các thầy cho em hỏi em làm 1 đoạn này sai chỗ nào với
Mã:
Sub tinh()
    Dim gan, lrow2, lrow
    Dim i, j, k, dem As Integer
    Dim Arr, arr1
    lrow = Range("C" & Rows.Count).End(xlUp).Row
    
    ReDim lrow2(1 To lrow - 5, 1)
    lrow2 = Range("C6:D" & lrow)
    
    ReDim Arr(1 To UBound(lrow2), 1)
    ReDim gan(1 To UBound(lrow2), 1)
    ReDim arr1(1 To UBound(lrow2), 1)
    
    For i = 1 To UBound(lrow2)
        Arr(i, 1) = -1
    Next
    
    For i = 1 To UBound(lrow2)
        dem = 1
        For j = i + 1 To UBound(lrow2)
        
            If lrow2(j, 1) = lrow2(i, 1) Then
                dem = dem + 1
                Arr(j, 1) = 0
            End If
            
        Next
        
        If Arr(i, 1) <> 0 Then
            k = k + 1
            Arr(i, 1) = dem
            arr1(k, 1) = Arr(i, 1)
            gan(k, 1) = lrow2(i, 1)
        End If
    
    Next
    
        Range("M6:N" & lrow) = arr1
        Range("O6:P" & lrow) = gan
End Sub

hai range kết quả của em nó ko vào đúng ý của e
Range("M6:N" & lrow) = arr1 #kết quả lại hiện ở cột N
Range("O6:p" & lrow) = gan #kết quả lại hiện ở cột P
 
Lần chỉnh sửa cuối:
Upvote 0
em mới học và mới đọc qua các bài đầu ở bài viết chủ đề về mảng này
các ACE và các thầy cho em hỏi em làm 1 đoạn này sai chỗ nào với
Mã:
Sub tinh()
    Dim gan, lrow2, lrow
    Dim i, j, k, dem As Integer
    Dim Arr, arr1
    lrow = Range("C" & Rows.Count).End(xlUp).Row
    
    ReDim lrow2(1 To lrow - 5, 1)
    lrow2 = Range("C6:D" & lrow)
    
    ReDim Arr(1 To UBound(lrow2), 1)
    ReDim gan(1 To UBound(lrow2), 1)
    ReDim arr1(1 To UBound(lrow2), 1)
    
    For i = 1 To UBound(lrow2)
        Arr(i, 1) = -1
    Next
    
    For i = 1 To UBound(lrow2)
        dem = 1
        For j = i + 1 To UBound(lrow2)
        
            If lrow2(j, 1) = lrow2(i, 1) Then
                dem = dem + 1
                Arr(j, 1) = 0
            End If
            
        Next
        
        If Arr(i, 1) <> 0 Then
            k = k + 1
            Arr(i, 1) = dem
            arr1(k, 1) = Arr(i, 1)
            gan(k, 1) = lrow2(i, 1)
        End If
    
    Next
    
        Range("M6:N" & lrow) = arr1
        Range("O6:P" & lrow) = gan
End Sub

hai range kết quả của em nó ko vào đúng ý của e
Range("M6:N" & lrow) = arr1 #kết quả lại hiện ở cột N
Range("O6:p" & lrow) = gan #kết quả lại hiện ở cột P
Bạn phải khai báo ReDim Arr(1 To UBound(lrow2), 1 to 1)
Lưu ý 1 to 1 chứ không phải là 1
Số 1 đó được hiểu là 0 to 1 và theo đó số cột là 2 chứ không phải 1. Do vậy các kết quả ghi vào Arr(x, 1) sẽ nằm ở cột 2.
 
Upvote 1
Tôi nghĩ chỗ này nó cũng có vấn đề đó:
Mã:
    For i = 1 To UBound(lrow2)
        dem = 1
        For j = i + 1 To UBound(lrow2)
Tuy nó không lỗi nhưng vòng lặp cuối cùng dường như nó sẽ lặp không phải là con số UBound(lrow2)+1 mà chỉ lặp lại UBound(lrow2).
 
Upvote 1
Tôi nghĩ chỗ này nó cũng có vấn đề đó:
Mã:
    For i = 1 To UBound(lrow2)
        dem = 1
        For j = i + 1 To UBound(lrow2)
Tuy nó không lỗi nhưng vòng lặp cuối cùng dường như nó sẽ lặp không phải là con số UBound(lrow2)+1 mà chỉ lặp lại UBound(lrow2).
thầy có thể giải thích rõ giúp e ko,
nếu để tối đa i<ubound(lrow2), Max của i = Ubound(lrow2)-1
thì chắc đc đúng k thầy
 
Upvote 0
thầy có thể giải thích rõ giúp e ko,
nếu để tối đa i<ubound(lrow2), Max của i = Ubound(lrow2)-1
thì chắc đc đúng k thầy
Cái này đơn giản mà, i max có phải bằng ubound(lrow2) không? Mà j = i + 1, vậy thì lúc i max có nghĩa là j = ubound(lrow2) +1, trong khi j max cũng lại bằng ubound(lrow2) cho nên nó sẽ lặp lại 2 lần chỗ này thôi, không vượt qua được ubound(lrow2) +1
Bài đã được tự động gộp:

thầy có thể giải thích rõ giúp e ko,
nếu để tối đa i<ubound(lrow2), Max của i = Ubound(lrow2)-1
thì chắc đc đúng k thầy
Thử cái này là biết liền:
Mã:
Sub Macro1()
    Dim i As Byte, j As Byte, k As Byte
    k = 3
    For i = 1 To k
        For j = i + 1 To k
            MsgBox j
        Next
    Next
End Sub
 
Lần chỉnh sửa cuối:
Upvote 0
Cái này đơn giản mà, i max có phải bằng ubound(lrow2) không? Mà j = i + 1, vậy thì lúc i max có nghĩa là j = ubound(lrow2) +1, trong khi j max cũng lại bằng ubound(lrow2) cho nên nó sẽ lặp lại 2 lần chỗ này thôi, không vượt qua được ubound(lrow2) +1
- chắc do e đặt thêm điều kiện arr, cho nên biến cuối cùng khi so sánh lần 2 đáng ra phải tăng biến đếm nhưng của e chưa thấy tăng biến đếm
 
Upvote 0
- chắc do e đặt thêm điều kiện arr, cho nên biến cuối cùng khi so sánh lần 2 đáng ra phải tăng biến đếm nhưng của e chưa thấy tăng biến đếm
Mã:
Sub Macro1()
    Dim i As Byte, j As Byte, k As Byte
    k = 3
    For i = 1 To k
        For j = i + 1 To k
            MsgBox j
        Next
    Next
End Sub

Qua phần thí nghiệm này bạn sẽ thấy j chạy bỏ qua số 1 và không đạt tới k +1. Theo bạn, bạn muốn j như thế nào?
 
Upvote 0
Mã:
Sub Macro1()
    Dim i As Byte, j As Byte, k As Byte
    k = 3
    For i = 1 To k
        For j = i + 1 To k
            MsgBox j
        Next
    Next
End Sub

Qua phần thí nghiệm này bạn sẽ thấy j chạy bỏ qua số 1 và không đạt tới k +1. Theo bạn, bạn muốn j như thế nào?
của e là đếm số lần xuất hiện phần tử trong mảng, do đó j của e chạy từ 2 đến hết, đoạn cuối là e cũng tính Arr(j, 1) = 0
mà ở ngoài vòng lặp i có điều kiện Arr(j, 1) <> 0 từ đó lọc bỏ qua trường hợp lỗi cuối cùng @@
 
Upvote 0
của e là đếm số lần xuất hiện phần tử trong mảng, do đó j của e chạy từ 2 đến hết, đoạn cuối là e cũng tính Arr(j, 1) = 0
mà ở ngoài vòng lặp i có điều kiện Arr(j, 1) <> 0 từ đó lọc bỏ qua trường hợp lỗi cuối cùng @@
Chúng ta lại thử thí nghiệm 2, không cần 2 vòng lặp, bạn thấy thế nào?

Mã:
Sub Macro2()
    Dim i As Byte, j As Byte, k As Byte
    k = 3
    For i = 1 To k
        j = i + 1
        MsgBox j
    Next
End Sub
 
Upvote 0
Web KT
Back
Top Bottom