Redim trong mảng

Liên hệ QC

vba_gpe

Thành viên thường trực
Tham gia
15/12/10
Bài viết
296
Được thích
44
Nghề nghiệp
Thất nghiệp
Em chào mọi người.

Em mới làm quen với mảng trong VBA. Em tìm trên diễn đàn mình nhiều ví dụ về mảng nhưng đến nay em vẫn chưa tiếp thu được nhiều kiến thức về mảng.
Em có tạo cho mình 1 bài toán để giải quyết bằng cách dùng mảng như sau.
Tính tổng hợp số xe từ 3 hãng Honda, Huyndai, Suzuki của từng đại lý (Như hình).
Theo logic của em qua nhiều bài đã đọc tham khảo từ nhìu bài viết trên diễn đàn?
- Bước 1: Gán mảng arr vùng cần duyệt.
- Bước 2: Duyệt từ trên xuống dưới các giá trị của arr. Nếu có điều kiện đại lý =>Kiểm tra 3 mảng trước đó (honda,suzuki,huyndai) đã có chưa = > Ghi dữ liệu trước đó (nếu có) => Xóa 3 mảng đó và khai báo lại mảng để bắt đầu thêm phần tử vào mảng. Dựa vào 2 từ bắt đầu của nhà sx (Ho,Su,Hu) để thêm các phần tử vào mảng tương ứng.

Em thử code như thế này mong nhận được góp ý của mọi người:

1.png

PHP:
Sub Vidu()
    Dim arr()
    Dim lr As Long
    lr = Range("B" & Rows.Count).End(xlUp).Row
    arr() = Range("A1:D" & lr).Value
    Dim arrHo(), arrHu(), arrSu()
    Dim i As Long
    For i = 1 To lr
        If arr(i, 1) <> "" Then  
            If isarray(arrHo())  Then Range("G" & Range("G65536").End(xlUp).Row + 1).Resize(UBound(arrHo()), 2).Value = arrHo
            If isarray(arrHu())  Then Range("G" & Range("G65536").End(xlUp).Row + 1).Resize(UBound(arrHu()), 2).Value = arrHu
            If isarray(arrSu())  Then Range("G" & Range("G65536").End(xlUp).Row + 1).Resize(UBound(arrSu()), 2).Value = arrSu
            'Reset lai tu dau cac mang??
            ReDim arrHo(1 To UBound(arr()), 1 To 2)
            ReDim arrHu(1 To UBound(arr()), 1 To 2)
            ReDim arrSu(1 To UBound(arr()), 1 To 2)
        Else
            Select Case UCase$(Left(arr(i, 3), 2))
                Case "HO"
                    Dim r1 As Long
                    r1 = r1 + 1
                    arrHo(r1, 1) = arr(i, 2)
                    arrHo(r1, 2) = arr(i, 4)
                Case "HU"
                    Dim r2 As Long
                    r2 = r2 + 1
                    arrHo(r2, 1) = arr(i, 2)
                    arrHo(r2, 2) = arr(i, 4)
                Case "SU"
                    Dim r3 As Long
                    r3 = r3 + 1
                    arrHo(r3, 1) = arr(i, 2)
                    arrHo(r3, 2) = arr(i, 4)
            End Select
        End If
    Next

     If isarray(arrHo())  Then Range("G" & Range("G65536").End(xlUp).Row + 1).Resize(UBound(arrHo()), 2).Value = arrHo
     If isarray(arrHu())  Then Range("G" & Range("G65536").End(xlUp).Row + 1).Resize(UBound(arrHu()), 2).Value = arrHu
     If isarray(arrSu())  Then Range("G" & Range("G65536").End(xlUp).Row + 1).Resize(UBound(arrSu()), 2).Value = arrSu
 
End Sub

Em cảm ơn mọi người.
 

File đính kèm

  • 1.png
    1.png
    11.8 KB · Đọc: 7
Lần chỉnh sửa cuối:
Em chào mọi người.

Em mới làm quen với mảng trong VBA. Em tìm trên diễn đàn mình nhiều ví dụ về mảng nhưng đến nay em vẫn chưa tiếp thu được nhiều kiến thức về mảng.
Em có tạo cho mình 1 bài toán để giải quyết bằng cách dùng mảng như sau.
Tính tổng hợp số xe từ 3 hãng Honda, Huyndai, Suzuki của từng đại lý (Như hình).
Theo logic của em qua nhiều bài đã đọc tham khảo từ nhìu bài viết trên diễn đàn?
- Bước 1: Gán mảng arr vùng cần duyệt.
- Bước 2: Duyệt từ trên xuống dưới các giá trị của arr. Nếu có điều kiện đại lý =>Kiểm tra 3 mảng trước đó (honda,suzuki,huyndai) đã có chưa = > Ghi dữ liệu trước đó (nếu có) => Xóa 3 mảng đó và khai báo lại mảng để bắt đầu thêm phần tử vào mảng. Dựa vào 2 từ bắt đầu của nhà sx (Ho,Su,Hu) để thêm các phần tử vào mảng tương ứng.

Em thử code như thế này mong nhận được góp ý của mọi người:

View attachment 209097

PHP:
Sub Vidu()
    Dim arr()
    Dim lr As Long
    lr = Range("B" & Rows.Count).End(xlUp).Row
    arr() = Range("A1:D" & lr).Value
    Dim arrHo(), arrHu(), arrSu()
    Dim i As Long
    For i = 1 To lr
        If arr(i, 1) <> "" Then 
            If isarray(arrHo())  Then Range("G" & Range("G65536").End(xlUp).Row + 1).Resize(UBound(arrHo()), 2).Value = arrHo
            If isarray(arrHu())  Then Range("G" & Range("G65536").End(xlUp).Row + 1).Resize(UBound(arrHu()), 2).Value = arrHu
            If isarray(arrSu())  Then Range("G" & Range("G65536").End(xlUp).Row + 1).Resize(UBound(arrSu()), 2).Value = arrSu
            'Reset lai tu dau cac mang??
            ReDim arrHo(1 To UBound(arr()), 1 To 2)
            ReDim arrHu(1 To UBound(arr()), 1 To 2)
            ReDim arrSu(1 To UBound(arr()), 1 To 2)
        Else
            Select Case UCase$(Left(arr(i, 3), 2))
                Case "HO"
                    Dim r1 As Long
                    r1 = r1 + 1
                    arrHo(r1, 1) = arr(i, 2)
                    arrHo(r1, 2) = arr(i, 4)
                Case "HU"
                    Dim r2 As Long
                    r2 = r2 + 1
                    arrHo(r2, 1) = arr(i, 2)
                    arrHo(r2, 2) = arr(i, 4)
                Case "SU"
                    Dim r3 As Long
                    r3 = r3 + 1
                    arrHo(r3, 1) = arr(i, 2)
                    arrHo(r3, 2) = arr(i, 4)
            End Select
        End If
    Next

     If isarray(arrHo())  Then Range("G" & Range("G65536").End(xlUp).Row + 1).Resize(UBound(arrHo()), 2).Value = arrHo
     If isarray(arrHu())  Then Range("G" & Range("G65536").End(xlUp).Row + 1).Resize(UBound(arrHu()), 2).Value = arrHu
     If isarray(arrSu())  Then Range("G" & Range("G65536").End(xlUp).Row + 1).Resize(UBound(arrSu()), 2).Value = arrSu

End Sub

Em cảm ơn mọi người.
Mảng dữ liệu muốn hoạt động được thì dữ liệu của bạn không nên để thế kia.Mới viết mảng thì nên làm với mảng có csdl đầy đủ thì có vẻ đơn giản hơn.
 
Upvote 0
Mảng dữ liệu muốn hoạt động được thì dữ liệu của bạn không nên để thế kia.Mới viết mảng thì nên làm với mảng có csdl đầy đủ thì có vẻ đơn giản hơn.
Hôm trước em có đọc bài của Anh kia và thấy mảng và Range là hoàn toàn khác nhau. Nhưng hình ảnh của Chủ Topic vẫn là mảng là mảng mừ Anh. Quan trọng là người ta làm gì với cái đó thôi
 
Upvote 0
Theo mình bạn nên tạo lại CSDL có các trường như vầy:
([STT]), [Loại xe], [Hãng], [Mã ĐLý], [Số lượng]

Nếu cần thống kê sau này, ta nhất thiết có trường [Ngày-Tháng] (nên có trước ngay sau ([STT])
 
Upvote 0
Mảng dữ liệu muốn hoạt động được thì dữ liệu của bạn không nên để thế kia.Mới viết mảng thì nên làm với mảng có csdl đầy đủ thì có vẻ đơn giản hơn.
Cảm ơn anh.
Hiện cũng tập tành từ một số bài viết của anh hay giải đáp cho các bạn.
Em chỉ chưa hiểu là, ví như cũng ví dụ trên: Em có 1 mãng đã có giá trị rồi (Mảng đó có 3 cột). Sau khi em xử lý, ghi xong giá trị của mảng vào Excel. Bây giờ em muốn refresh lại mảng đó (nghĩa là ko có giá trị dòng) nhưng mà vẫn có 3 cột như trước thì mình dùng lệnh gì ạ?
Có thể em viết anh chị không hiểu hay thế nào cứ chỉnh để em sửa nhé.
Em cảm ơn.
 
Upvote 0
... Bây giờ em muốn refresh lại mảng đó (nghĩa là ko có giá trị dòng) nhưng mà vẫn có 3 cột như trước thì mình dùng lệnh gì ạ?
....
Hỏi về mảng sao không vào chuyên mục mảng mà hỏi.

"Refresh" còn tuỳ theo cái ngữ cảnh. Trước hết bạn cần phải biết mảng động và mảng tĩnh là gì.

Lệnh Erase xoá mảng.
- Nếu mảng tĩnh thì nó đưa về trạng thái ban đầu, lúc chưa có dữ liệu
- Nếu mảng động thì nó giải phóng luôn bộ nhớ. Phải Redim lại. Nhiều người bảo rằng mảng động chỉ cần redim thì nó xoá luôn dữ liệu, khong cần phải erase. Nhưng tài liệu về chỗ này không rõ ràng. Vì vậy, người ta khuyên rằng nên erase ròi redim cho chắc ăn.

chieu1 = UBound(mang, 1)
chieu2 = UBound(mang, 2)
chieu3...
Erase mang
Redim mang(chieu1, chieu2, ...)
' nếu cần LBound thì tự uyển chuyển lấy.
 
Upvote 0
Cảm ơn anh.
Hiện cũng tập tành từ một số bài viết của anh hay giải đáp cho các bạn.
Em chỉ chưa hiểu là, ví như cũng ví dụ trên: Em có 1 mãng đã có giá trị rồi (Mảng đó có 3 cột). Sau khi em xử lý, ghi xong giá trị của mảng vào Excel. Bây giờ em muốn refresh lại mảng đó (nghĩa là ko có giá trị dòng) nhưng mà vẫn có 3 cột như trước thì mình dùng lệnh gì ạ?
Có thể em viết anh chị không hiểu hay thế nào cứ chỉnh để em sửa nhé.
Em cảm ơn.
Câu trả lời cho câu hỏi của bạn (in đậm) là không có mảng nào như vậy cả.

Code ở bài 1 của bạn có một số lỗi sau:
Khi bạn khai báo Mang() thì nó đã là mảng rồi (mảng động - Dynamic Array)nên kiểm tra bằng IsArray() là sai. Cụ thể code của bạn sẽ dẫn đến lỗi do gán mảng rỗng xuống sheet. Bạn có thể tự kiểm tra bằng hàm sau:
Mã:
Function Mang() As Boolean
Dim Arr()
Mang = IsArray(Arr)
End Function
Khai báo bên trong vòng lặp (Dim r1 As Long) là một lỗi sai cơ bản. Các biến chỉ khai báo 1 lần (thường ở đầu Sub cho dễ quản lý).

Do bạn kiểm tra bằng hàm IsArray() nên mới có câu hỏi bên trên. Với dữ liệu và code ở bài 1 của bạn thì sau khi gán dữ liệu xuống sheet chỉ cần xóa giá trị của các phần tử của mảng là được (Nếu viết đúng thì không xóa kết quả cũng đúng nhưng không nên, xóa mảng sẽ giúp code rõ ràng hơn). Việc kiểm tra sẽ dựa vào các biến r1, r2, r3.
Mã:
Sub Vidu()
    Dim arr()
    Dim lr As Long, r1 As Long, r2 As Long, r3 As Long, NextRow As Long
    lr = Range("B" & Rows.Count).End(xlUp).Row
    arr() = Range("A1:D" & lr).Value
    Dim arrHo(), arrHu(), arrSu()
    Dim i As Long
    NextRow = 1
    ReDim arrHo(1 To UBound(arr()), 1 To 2)
    ReDim arrHu(1 To UBound(arr()), 1 To 2)
    ReDim arrSu(1 To UBound(arr()), 1 To 2)
    For i = 1 To lr
        If arr(i, 1) <> "" Then
            If r1 > 0 Then
                Cells(NextRow, "G").Resize(r1, 2).Value = arrHo
                NextRow = NextRow + r1
                r1 = 0
                ReDim arrHo(1 To UBound(arr()), 1 To 2)
            End If
            If r2 > 0 Then
                Cells(NextRow, "G").Resize(r2, 2).Value = arrHu
                NextRow = NextRow + r2
                r2 = 0
                ReDim arrHu(1 To UBound(arr()), 1 To 2)
            End If
            If r3 > 0 Then
                Cells(NextRow, "G").Resize(r3, 2).Value = arrSu
                NextRow = NextRow + r3
                r3 = 0
                ReDim arrSu(1 To UBound(arr()), 1 To 2)
            End If
        Else
            Select Case UCase$(Left(arr(i, 3), 2))
                Case "HO"
                    r1 = r1 + 1
                    arrHo(r1, 1) = arr(i, 2)
                    arrHo(r1, 2) = arr(i, 4)
                Case "HU"
                    r2 = r2 + 1
                    arrHo(r2, 1) = arr(i, 2)
                    arrHo(r2, 2) = arr(i, 4)
                Case "SU"
                    r3 = r3 + 1
                    arrHo(r3, 1) = arr(i, 2)
                    arrHo(r3, 2) = arr(i, 4)
            End Select
        End If
    Next
    If r1 > 0 Then
        Cells(NextRow, "G").Resize(r1, 2).Value = arrHo
        NextRow = NextRow + r1
    End If
    If r2 > 0 Then
        Cells(NextRow, "G").Resize(r2, 2).Value = arrHu
        NextRow = NextRow + r2
    End If
    If r3 > 0 Then
        Cells(NextRow, "G").Resize(r3, 2).Value = arrSu
        NextRow = NextRow + r3
    End If
End Sub
 
Upvote 0
Câu trả lời cho câu hỏi của bạn (in đậm) là không có mảng nào như vậy cả.

Code ở bài 1 của bạn có một số lỗi sau:
Khi bạn khai báo Mang() thì nó đã là mảng rồi (mảng động - Dynamic Array)nên kiểm tra bằng IsArray() là sai. Cụ thể code của bạn sẽ dẫn đến lỗi do gán mảng rỗng xuống sheet. Bạn có thể tự kiểm tra bằng hàm sau:
Mã:
Function Mang() As Boolean
Dim Arr()
Mang = IsArray(Arr)
End Function
Khai báo bên trong vòng lặp (Dim r1 As Long) là một lỗi sai cơ bản. Các biến chỉ khai báo 1 lần (thường ở đầu Sub cho dễ quản lý).

Do bạn kiểm tra bằng hàm IsArray() nên mới có câu hỏi bên trên. Với dữ liệu và code ở bài 1 của bạn thì sau khi gán dữ liệu xuống sheet chỉ cần xóa giá trị của các phần tử của mảng là được (Nếu viết đúng thì không xóa kết quả cũng đúng nhưng không nên, xóa mảng sẽ giúp code rõ ràng hơn). Việc kiểm tra sẽ dựa vào các biến r1, r2, r3.
Mã:
Sub Vidu()
    Dim arr()
    Dim lr As Long, r1 As Long, r2 As Long, r3 As Long, NextRow As Long
    lr = Range("B" & Rows.Count).End(xlUp).Row
    arr() = Range("A1:D" & lr).Value
    Dim arrHo(), arrHu(), arrSu()
    Dim i As Long
    NextRow = 1
    ReDim arrHo(1 To UBound(arr()), 1 To 2)
    ReDim arrHu(1 To UBound(arr()), 1 To 2)
    ReDim arrSu(1 To UBound(arr()), 1 To 2)
    For i = 1 To lr
        If arr(i, 1) <> "" Then
            If r1 > 0 Then
                Cells(NextRow, "G").Resize(r1, 2).Value = arrHo
                NextRow = NextRow + r1
                r1 = 0
                ReDim arrHo(1 To UBound(arr()), 1 To 2)
            End If
            If r2 > 0 Then
                Cells(NextRow, "G").Resize(r2, 2).Value = arrHu
                NextRow = NextRow + r2
                r2 = 0
                ReDim arrHu(1 To UBound(arr()), 1 To 2)
            End If
            If r3 > 0 Then
                Cells(NextRow, "G").Resize(r3, 2).Value = arrSu
                NextRow = NextRow + r3
                r3 = 0
                ReDim arrSu(1 To UBound(arr()), 1 To 2)
            End If
        Else
            Select Case UCase$(Left(arr(i, 3), 2))
                Case "HO"
                    r1 = r1 + 1
                    arrHo(r1, 1) = arr(i, 2)
                    arrHo(r1, 2) = arr(i, 4)
                Case "HU"
                    r2 = r2 + 1
                    arrHo(r2, 1) = arr(i, 2)
                    arrHo(r2, 2) = arr(i, 4)
                Case "SU"
                    r3 = r3 + 1
                    arrHo(r3, 1) = arr(i, 2)
                    arrHo(r3, 2) = arr(i, 4)
            End Select
        End If
    Next
    If r1 > 0 Then
        Cells(NextRow, "G").Resize(r1, 2).Value = arrHo
        NextRow = NextRow + r1
    End If
    If r2 > 0 Then
        Cells(NextRow, "G").Resize(r2, 2).Value = arrHu
        NextRow = NextRow + r2
    End If
    If r3 > 0 Then
        Cells(NextRow, "G").Resize(r3, 2).Value = arrSu
        NextRow = NextRow + r3
    End If
End Sub
Cảm ơn thầy huuthang_bd rất nhiều. :) <3
Bài đã được tự động gộp:

Hỏi về mảng sao không vào chuyên mục mảng mà hỏi.
Dạ. Thầy VetMini, em không biết phải post vào đâu ạ? :( thầy chỉ em với. Lần sau em sẽ lưu ý chỗ này.
cảm ơn thầy.
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
...
            Select Case UCase$(Left(arr(i, 3), 2))
                Case "HO"
                    r1 = r1 + 1
                    arrHo(r1, 1) = arr(i, 2)
                    arrHo(r1, 2) = arr(i, 4)
                Case "HU"
                    r2 = r2 + 1
                    arrHo(r2, 1) = arr(i, 2)
                    arrHo(r2, 2) = arr(i, 4)
                Case "SU"
                    r3 = r3 + 1
                    arrHo(r3, 1) = arr(i, 2)
                    arrHo(r3, 2) = arr(i, 4)
            End Select
...
Ba đoạn code làm việc gần như nhau.
Thường thì nếu dài người ta viết một sub gọi, và cho tham số. Nếu ngắn thì dùng array.
Dim r(1 to 3)
...
ri = (InStr("HOHUSU", UCase$(Left(arr(i, 3), 2))) + 1) / 2 ' hoặc hàm gì đó, cốt là lấy 1, 2, hoặc 3
r(ri) = r(ri) + 1
arrHo(r(ri), 1) = arr(i, 2)
arrHo(r(ri), 2) = arr(i, 4)

Tôi chỉ nói đại khái về cách code thôi. Chứ thật ra thì code nguyên bản nó đã không hiểu nổi ở chỗ chỉ có mảng arrHo làm việc và hai mảng arrHu, arrSU ở không. Đó chính là cái nguy hiểm của việc lặp lại code: copy/paste mà quên chỉnh.

Đúng ra là phải chơi luôn mảng của mảng.

...
Hi thầy VetMini, em không biết phải post vào đâu ạ? :( thầy chỉ em với. Lần sau em sẽ lưu ý chỗ này.
cảm ơn thầy.
Chớ có hai ba gì tôi. Tôi kỵ nấy tiếng tôi lắm.
 
Upvote 0
Đúng ra là phải chơi luôn mảng của mảng.
Thầy có bài ví dụ mẫu nào trong diễn đàn ví dụ về tình huống này không ạ? Mong thầy có thể chia sẽ giúp em một bài để em học hỏi.
Em cảm ơn thầy nhìu ạ.

Chớ có hai ba gì tôi. Tôi kỵ nấy tiếng tôi lắm.
Cảm ơn thầy. Lần sau em sẽ để ý câu từ ạ. :)
 
Upvote 0
Ba đoạn code làm việc gần như nhau.
Thường thì nếu dài người ta viết một sub gọi, và cho tham số. Nếu ngắn thì dùng array.
Dim r(1 to 3)
...
ri = (InStr("HOHUSU", UCase$(Left(arr(i, 3), 2))) + 1) / 2 ' hoặc hàm gì đó, cốt là lấy 1, 2, hoặc 3
r(ri) = r(ri) + 1
arrHo(r(ri), 1) = arr(i, 2)
arrHo(r(ri), 2) = arr(i, 4)

Tôi chỉ nói đại khái về cách code thôi. Chứ thật ra thì code nguyên bản nó đã không hiểu nổi ở chỗ chỉ có mảng arrHo làm việc và hai mảng arrHu, arrSU ở không. Đó chính là cái nguy hiểm của việc lặp lại code: copy/paste mà quên chỉnh.

Đúng ra là phải chơi luôn mảng của mảng.


Chớ có hai ba gì tôi. Tôi kỵ nấy tiếng tôi lắm.
Do code chỉ mang tính hướng dẫn và không có dữ liệu để chạy thử nên lỗi kỹ thuật phần copy paste :D (ô nhưng mà cái này nguyên bản của chủ thớt cơ mà :p)
Thầy có bài ví dụ mẫu nào trong diễn đàn ví dụ về tình huống này không ạ? Mong thầy có thể chia sẽ giúp em một bài để em học hỏi.
Đi từng bước cho vững đã bạn.
 
Lần chỉnh sửa cuối:
Upvote 0
Ba đoạn code làm việc gần như nhau.
Thường thì nếu dài người ta viết một sub gọi, và cho tham số. Nếu ngắn thì dùng array.
Dim r(1 to 3)
...
ri = (InStr("HOHUSU", UCase$(Left(arr(i, 3), 2))) + 1) / 2 ' hoặc hàm gì đó, cốt là lấy 1, 2, hoặc 3
r(ri) = r(ri) + 1
arrHo(r(ri), 1) = arr(i, 2)
arrHo(r(ri), 2) = arr(i, 4)

Tôi chỉ nói đại khái về cách code thôi. Chứ thật ra thì code nguyên bản nó đã không hiểu nổi ở chỗ chỉ có mảng arrHo làm việc và hai mảng arrHu, arrSU ở không. Đó chính là cái nguy hiểm của việc lặp lại code: copy/paste mà quên chỉnh.

Đúng ra là phải chơi luôn mảng của mảng.


Chớ có hai ba gì tôi. Tôi kỵ nấy tiếng tôi lắm.
Do code chỉ mang tính hướng dẫn và không có dữ liệu để chạy thử nên lỗi kỹ thuật phần copy paste :D (ô nhưng mà cái này nguyên bản của chủ thớt cơ mà :p)

Đi từng bước cho vững đã bạn.
Cảm ơn thầy huuthang_bd
 
Upvote 0
Đi từng bước cho vững đã bạn.
Kính gửi thầy Huuthang_bd
Em có một mảng từ A1: D5
Em khai báo mảng này arr() = range("A1: D5").value
Bây giờ em muốn ghi ra excel Ô E1 giá trị vùng số 4444 (Vùng D1:D5 tương ứng trong bảng excel).
Em nghĩ nó sẽ thế này, nhưng excel báo lỗi. Em kính nhờ thầy và mọi người giúp em ạ.
Em cảm ơn .

1.png
PHP:
Sub AA
Dim arr()
arr = range("A1:D5").value
range("E1").Resize(ubound(arr()), 1).value = arr(1 to ubound(arr()),4 to 4)
End sub
 
Upvote 0
Kính gửi thầy Huuthang_bd
Em có một mảng từ A1: D5
Em khai báo mảng này arr() = range("A1: D5").value
Bây giờ em muốn ghi ra excel Ô E1 giá trị vùng số 4444 (Vùng D1:D5 tương ứng trong bảng excel).
Em nghĩ nó sẽ thế này, nhưng excel báo lỗi. Em kính nhờ thầy và mọi người giúp em ạ.
Em cảm ơn .

View attachment 209326
PHP:
Sub AA
Dim arr()
arr = range("A1:D5").value
range("E1").Resize(ubound(arr()), 1).value = arr(1 to ubound(arr()),4 to 4)
End sub
thấy tên nick của bạn nghĩ là VBA kha khá rồi,
Nhưng thế này thì nên tìm hiểu
- Thế nào là khai báo mảng (cái này là khai báo arr(1 to ubound(arr()),4 to 4) - phải đặt sau Dim)
- Thế nào là truy xuất mảng (thường truy xuất qua phần tử mảng)
- Khi cho ví dụ số liệu thử CODE, thì phải số ngẫu nhiên gần sát thực tế, không thể 1 2 3 4, các hàng giống nhau - nếu thế là lười gõ đại, không thử code chính xác được...

Tạm thế đi
 
Lần chỉnh sửa cuối:
Upvote 0
Kính gửi thầy Huuthang_bd
Em có một mảng từ A1: D5
Em khai báo mảng này arr() = range("A1: D5").value
Bây giờ em muốn ghi ra excel Ô E1 giá trị vùng số 4444 (Vùng D1:D5 tương ứng trong bảng excel).
Em nghĩ nó sẽ thế này, nhưng excel báo lỗi. Em kính nhờ thầy và mọi người giúp em ạ.
Em cảm ơn .

View attachment 209326
PHP:
Sub AA
Dim arr()
arr = range("A1:D5").value
range("E1").Resize(ubound(arr()), 1).value = arr(1 to ubound(arr()),4 to 4)
End sub
Vậy bạn sửa thành thế này
Mã:
Sub AA
Dim arr()
arr = range("A1:D5").value
range("E1").value = arr(1,4) 'câu lệnh này có nghĩa là bạn gán giá trị trong mảng dòng thứ 1 cột số 4 bằng E1 đó
End sub
 
Upvote 0
range("E1").value = arr(1,4) 'câu lệnh này có nghĩa là bạn gán giá trị trong mảng dòng thứ 1 cột số 4 bằng E1 đó
Tình hình căng này. Đọc tài liệu nào ở đâu viết vậy đó?

Giờ cho ví dụ này thì gọi như nào nhé.

PHP:
Sub vidu()
Dim arr(1 to 2, 1 to 2, 1 to 3)
arr(1,2,3) = 10
Range("E1").Value = arr(1,2,3) '==> Gọi arr(1,2,3) như nào? đâu là dòng, đâu là cột?
End Sub
 
Upvote 0
Bài #15:

For dong = 1 to 5
Range("E" & dong).Value = arr(dong, 4)
Next dong

' dài hơn, nhưng dễ sửa hơn
For dong = 1 to 5
Range("E1").Cells(dong).Value = arr(dong, 4)
Next dong

' rắc rối hơn, nhưng nhanh hơn
Set oDauTien = Range("E1)
For dong = 1 to 5
oDauTien.Cells(dong).Value = arr(dong, 4)
Next dong
 
Upvote 0
thấy tên nick của bạn nghĩ là VBA kha khá rồi,
Nhưng thế này thì nên tìm hiểu
Ngại quá ạ, Em gia nhập GPE hồi 2010, nhờ sự chỉ giáo của các thầy trong diễn đàn nên code kiết chẹt chẹt được mấy cái nhỏ nhỏ phục vụ cho công việc của mình. Sau chuyển nghề sang thi công giám sát công trình lại không đụng nữa. Nay lại về văn phòng ngồi nên mới có thời gian đụng lại. Có gì bạn chỉ giáo thêm nhé. :)

Bài #15:

For dong = 1 to 5
Range("E" & dong).Value = arr(dong, 4)
Next dong

' dài hơn, nhưng dễ sửa hơn
For dong = 1 to 5
Range("E1").Cells(dong).Value = arr(dong, 4)
Next dong

' rắc rối hơn, nhưng nhanh hơn
Set oDauTien = Range("E1)
For dong = 1 to 5
oDauTien.Cells(dong).Value = arr(dong, 4)
Next dong
Dạ cảm ơn thầy và tất cả mọi người đã góp ý và nhắc nhở.
Thầy cho em hỏi thêm, ngoài cách duyệt qua từng dòng trong mảng của cột cần lấy, duyệt tới đâu ghi excel tới đó, mình không còn cách nào khác lấy nguyên 1 lúc cả cột được ạ?
 
Lần chỉnh sửa cuối:
Upvote 0
Ngại quá ạ, Em gia nhập GPE hồi 2010, nhờ sự chỉ giáo của các thầy trong diễn đàn nên code kiết chẹt chẹt được mấy cái nhỏ nhỏ phục vụ cho công việc của mình. Sau chuyển nghề sang thi công giám sát công trình lại không đụng nữa. Nay lại về văn phòng ngồi nên mới có thời gian đụng lại. Có gì bạn chỉ giáo thêm nhé. :)


Dạ cảm ơn thầy và tất cả mọi người đã góp ý và nhắc nhở.
Thầy cho em hỏi thêm, ngoài cách duyệt qua từng dòng trong mảng của cột cần lấy, duyệt tới đâu ghi excel tới đó, mình không còn cách nào khác lấy nguyên 1 lúc cả cột được ạ?
Bạn có thể ghi sang 1 mảng khác.Rồi gán vào excel cũng được.
 
Upvote 0
Web KT

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

Back
Top Bottom