Đưa 1 phần của mảng xuống Cell không dùng vòng lặp (1 người xem)

  • Thread starter Thread starter dhn46
  • Ngày gửi Ngày gửi
Liên hệ QC

Người dùng đang xem chủ đề này

dhn46

Hướng tới tương lai
Tham gia
1/3/11
Bài viết
3,251
Được thích
3,870
Dhn46 có câu hỏi mong GPE giúp đỡ:

Dữ liệu Arr = [A1:C10]
- Làm cách nào để gán 1 phần Arr xuống cell (cụ thể là A5:C10 tương ứng Arr(từ row 5 tới 10, từ Column 1 tới 3) mà không dùng vòng lặp theo dạng
Mã:
[E1].resize(ubound(Arr,1),3) = Arr
Trân trọng!
 
Tôi chưa hiểu lắm nhưng không hiểu mô hình như thế này có được không:

Range.Offset.Resize ...
 
Upvote 0
Tôi chưa hiểu lắm nhưng không hiểu mô hình như thế này có được không:

Range.Offset.Resize ...
Em xin giải thích kỹ hơn yêu cầu.

Với mảng Arr bài #1 là mảng có 10 hàng, 3 cột.
Giờ em muốn gán xuống Sheet từ hàng thứ 5 trở đi theo dạng gán cả mảng và không dùng vòng lặp
Khi áp dụng 1 số bài toán e thấy có thể chỉ cần dùng 1 mảng rồi gom các điều kiện vào các nhóm hàng và cột liên tiếp theo quy luật, vấn đề là làm sao để lấy nhóm hàng cột đó xuống sheet mà không dùng vòng lặp.

Mong nhận được sự phản hồi từ các thành viên GPE!
 
Upvote 0
Code sơ bộ như thế này, bạn có thể dùng With ... End With để rút ngắn.

Mã:
Sub ResizeRange()
    Dim BaseRange As Range
    Dim Resize As Range
    
    Set BaseRange = Range("A1:C10")
    Set Resize = Range(Cells(BaseRange.Rows.Count - 5, 1), Cells(BaseRange.Rows.Count, BaseRange.Columns.Count))
    
    MsgBox Resize.Address
    
    Set BaseRange = Nothing
    Set Resize = Nothing
End Sub
 
Upvote 0
Rất cảm ơn bác đã quan tâm, nhưng yêu cầu của em phức tạp hơn ý tưởng bài #4
Em xin Post File và giải thích câu hỏi:
Dữ liệu trong File, để trích lọc duy nhất và tính tổng các giá trị em dùng Sub
Mã:
Sub Gpe()
Dim Arr, sArr, i As Long, k As Long
Arr = [A2:B10]


ReDim sArr(1 To UBound(Arr), 1 To 1)


With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(Arr, 1)
        If Not .exists(Arr(i, 1)) Then
           k = k + 1
           ReDim Preserve sArr(1 To UBound(Arr), 1 To k)
           .Add Arr(i, 1), k
           sArr(1, k) = Arr(i, 1)
           sArr(2, k) = Arr(i, 2)
        Else
           sArr(2, .Item(Arr(i, 1))) = sArr(2, .Item(Arr(i, 1))) + Arr(i, 2)
        End If
    Next
End With
[B][F1].Resize(UBound(sArr, 1), UBound(sArr, 2)) = sArr[/B]
End Sub

- Nếu yêu cầu là: trích các phần tử duy nhất, tính tổng cộng sau đó xuất vào các Cell liền nhau thì chỉ cần cho tất cả vào 1 Array rồi dùng phần code in đậm để xuất
- Nhưng nếu yêu cầu: mỗi mã 1 vùng dữ liệu, hoặc tách mỗi mà 1 sheet thì em sẽ phải xử lý Array, hoặc vòng lặp tương ứng với Key của Dic.
Em nhận thấy: Các phần tử mảng sArr tạo ra có các vùng tương đồng - cứ 1 phần tử hàng 1 + 1 phần tử hàng 2 => tách ra 1 mã (1 cột trong mảng)

*Vậy làm cách nào để gán các phần của sArr xuống Cell mà không dùng vòng lặp theo dạng
Mã:
[E1].resize(ubound(Arr,1),3) = sArr
 

File đính kèm

Upvote 0
Rất cảm ơn bác đã quan tâm, nhưng yêu cầu của em phức tạp hơn ý tưởng bài #4
Em xin Post File và giải thích câu hỏi:
Dữ liệu trong File, để trích lọc duy nhất và tính tổng các giá trị em dùng Sub
Mã:
Sub Gpe()
Dim Arr, sArr, i As Long, k As Long
Arr = [A2:B10]


ReDim sArr(1 To UBound(Arr), 1 To 1)


With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(Arr, 1)
        If Not .exists(Arr(i, 1)) Then
           k = k + 1
           ReDim Preserve sArr(1 To UBound(Arr), 1 To k)
           .Add Arr(i, 1), k
           sArr(1, k) = Arr(i, 1)
           sArr(2, k) = Arr(i, 2)
        Else
           sArr(2, .Item(Arr(i, 1))) = sArr(2, .Item(Arr(i, 1))) + Arr(i, 2)
        End If
    Next
End With
[B][F1].Resize(UBound(sArr, 1), UBound(sArr, 2)) = sArr[/B]
End Sub

- Nếu yêu cầu là: trích các phần tử duy nhất, tính tổng cộng sau đó xuất vào các Cell liền nhau thì chỉ cần cho tất cả vào 1 Array rồi dùng phần code in đậm để xuất
- Nhưng nếu yêu cầu: mỗi mã 1 vùng dữ liệu, hoặc tách mỗi mà 1 sheet thì em sẽ phải xử lý Array, hoặc vòng lặp tương ứng với Key của Dic.
Em nhận thấy: Các phần tử mảng sArr tạo ra có các vùng tương đồng - cứ 1 phần tử hàng 1 + 1 phần tử hàng 2 => tách ra 1 mã (1 cột trong mảng)

*Vậy làm cách nào để gán các phần của sArr xuống Cell mà không dùng vòng lặp theo dạng
Mã:
[E1].resize(ubound(Arr,1),3) = sArr

Dù bạn thêm 1 hay 2 vòng lập nữa thì việc xử lý trên mảng vẫn rất nhanh. Suy nghĩ chỉ đến chuyện "không thể" kia cho mệt
 
Upvote 0
Dù bạn thêm 1 hay 2 vòng lập nữa thì việc xử lý trên mảng vẫn rất nhanh. Suy nghĩ chỉ đến chuyện "không thể" kia cho mệt
- Thầy nói vậy chắc là e khỏi suy nghĩ nữa, cũng do "ý tưởng" mà thôi thầy ah, thấy nếu như suy nghĩ của em mà được chắc sẽ rất hữu ích. ;;;;;;;;;;;
- Và có lẽ "ý tưởng" Redim lại mảng theo kích thước định sẵn không làm mất dữ liệu kiểu Redim Preserver... nhưng theo 2 chiều và có thể tự quyết định số vị trí, lượng phần tử cũng trở nên => "không tưởng".

Cảm ơn GPE!
 
Upvote 0
- Thầy nói vậy chắc là e khỏi suy nghĩ nữa, cũng do "ý tưởng" mà thôi thầy ah, thấy nếu như suy nghĩ của em mà được chắc sẽ rất hữu ích. ;;;;;;;;;;;
- Và có lẽ "ý tưởng" Redim lại mảng theo kích thước định sẵn không làm mất dữ liệu kiểu Redim Preserver... nhưng theo 2 chiều và có thể tự quyết định số vị trí, lượng phần tử cũng trở nên => "không tưởng".

Cảm ơn GPE!

Thật ra vấn đề của bạn tôi cũng đã trăn trở nhiều, bởi dùng mảng gán xuống sheet rất nhanh vì nó có dạng Fill.

Nhưng cho hỏi lại rằng, tại sao khi gán 1 phần của mảng, bạn không xử lý nhỏ vùng cần lựa chọn, sau đó mới chuyển về dạng mảng thì không cần vòng lặp?

Ý tôi thế này, giả sử vùng "A1:C10" thay vì bạn nhận lấy giá trị mảng này thì bạn xử lý trước sau đó lấy vùng đã xử lý, chẳng hạn "A5:C8" làm vùng mảng rồi gán xuống vùng nào đó của sheet thì không phải dùng vòng lặp nữa.
 
Upvote 0
Rất cảm ơn bác đã quan tâm, nhưng yêu cầu của em phức tạp hơn ý tưởng bài #4
Em xin Post File và giải thích câu hỏi:
Dữ liệu trong File, để trích lọc duy nhất và tính tổng các giá trị em dùng Sub
Mã:
Sub Gpe()
Dim Arr, sArr, i As Long, k As Long
Arr = [A2:B10]


ReDim sArr(1 To UBound(Arr), 1 To 1)


With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(Arr, 1)
        If Not .exists(Arr(i, 1)) Then
           k = k + 1
           ReDim Preserve sArr(1 To UBound(Arr), 1 To k)
           .Add Arr(i, 1), k
           sArr(1, k) = Arr(i, 1)
           sArr(2, k) = Arr(i, 2)
        Else
           sArr(2, .Item(Arr(i, 1))) = sArr(2, .Item(Arr(i, 1))) + Arr(i, 2)
        End If
    Next
End With
[B][F1].Resize(UBound(sArr, 1), UBound(sArr, 2)) = sArr[/B]
End Sub

Code này tại sao mình phải Redim rồi lại phải Redim Preserve hén
Không biết loại bỏ phần Redim có ảnh hưởng gì không

PHP:
Sub Gpe()
Dim Arr, sArr(1 To 2, 1 To 100), i As Long, k As Long
Arr = [A2:B10]
With CreateObject("Scripting.Dictionary")
    For i = 1 To UBound(Arr, 1)
        If Not .exists(Arr(i, 1)) Then
           k = k + 1
           .Add Arr(i, 1), k
           sArr(1, k) = Arr(i, 1)
           sArr(2, k) = Arr(i, 2)
        Else
           sArr(2, .Item(Arr(i, 1))) = sArr(2, .Item(Arr(i, 1))) + Arr(i, 2)
        End If
    Next
End With
[F1].Resize(2, k) = sArr
End Sub
 
Upvote 0
Xin lỗi các anh, em cứ tưởng không có giải pháp cho ý tưởng của em nên không xem lại topic của mình. Giờ thấy chủ đề của anh Nghĩa: http://www.giaiphapexcel.com/forum/...hàng-bất-kỳ-mà-không-dùng-vòng-lặp-được-không đã có đáp án nên nhìn lại nghĩ không biết ý tưởng của em liệu có thể thực hiện được hay không? Mong các anh cho giải pháp.
Gửi anh Hải:
Code này tại sao mình phải Redim rồi lại phải Redim Preserve hén
Không biết loại bỏ phần Redim có ảnh hưởng gì không
Loại bỏ phần redim hoàn toàn được nhưng nếu anh không biết chính xác kích thước mảng theo chiều rộng là bao nhiêu thì việc sArr(1 To 2, 1 To 100) là 1 điều không chắc chắn. Em cũng có thắc mắc về số cột tối đa trong mảng là bao nhiêu, vì Code em viết trong bài #37 của topic: http://www.giaiphapexcel.com/forum/...e-VBA-ghép-nối-và-thống-kê-giữa-2-sheet/page4 báo lỗi.

Xin cảm ơn GPE!
 
Upvote 0

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

Back
Top Bottom