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ị
 
Mã:
Sub Doc_Ngang()
Dim sArr(), dArr(), i As Long, j&
sArr = Sheets("Sheet1").Range("B7:D99").Value
ReDim dArr(1 To UBound(sArr, 2), 1 To UBound(sArr))
For i = 1 To UBound(sArr)
   For j = 1 To UBound(sArr, 2)
      dArr(j, i) = sArr(i, j)
   Next
Next
Sheets("sheet2").[E10].Resize(UBound(dArr), UBound(dArr, 2)) = dArr
End Sub
Em mới thử làm đơn giản vầy nó cũng ra đó Anh
Mã:
Sub TransposeArr()
    Dim Arr(), lRow As Long, lCols  As Long
    Arr = Range("B7:D99").Value
    lRow = UBound(Arr, 1)
    lCols = UBound(Arr, 2)
    Range("E10").Resize(lCols, lRow).Value = Application.WorksheetFunction.Transpose(Arr)
End Sub
 
Upvote 0
Em mới thử làm đơn giản vầy nó cũng ra đó Anh
Mã:
Sub TransposeArr()
    Dim Arr(), lRow As Long, lCols  As Long
    Arr = Range("B7:D99").Value
    lRow = UBound(Arr, 1)
    lCols = UBound(Arr, 2)
    Range("E10").Resize(lCols, lRow).Value = Application.WorksheetFunction.Transpose(Arr)
End Sub
Hàm WorksheetFunction nó có giới hạn của nó:
1. Text chỉ được khoảng 255 ký tự
2. Chỉ được khoảng 500 dòng
Các con số trên, tôi có thể sai một chút. Nhưng chuyện giới hạn là chuyện thực tế.
Thử vài ô với text dài xem.
 
Upvote 0
Mã:
Sub Doc_Ngang()
Dim sArr(), dArr(), i As Long, j&
sArr = Sheets("Sheet1").Range("B7:D99").Value
ReDim dArr(1 To UBound(sArr, 2), 1 To UBound(sArr))
For i = 1 To UBound(sArr)
   For j = 1 To UBound(sArr, 2)
      dArr(j, i) = sArr(i, j)
   Next
Next
Sheets("sheet2").[E10].Resize(UBound(dArr), UBound(dArr, 2)) = dArr
End Sub

Cảm ơn anh @quanghai1969 và các bạn đã hỗ trợ,
Nhờ các bạn giúp Oanh Thơ trường hợp đưa dữ liệu của vùng màu vàng trong cột C sang vùng màu vàng trong cột G, cũng sử dụng mảng với ạ:
Untitled.png
 
Upvote 0
Upvote 0
vậy bạn dùng vòng lặp là được mà.gán cái vùng ở cột c vào mảng rồi duyệt mảng chuyển qua mảng khác gắn vào cái cột G là được à

Cảm ơn bạn đã gợi ý, theo gợi ý của bạn @befaint ,Oanh Thơ đang thử sửa theo code bài này của thầy @Ba Tê trong bài viết:
https://www.giaiphapexcel.com/diendan/threads/làm-sao-để-insert-dòng-trong-vba-nhỉ.764/#post-864043
hihi, đang lỗi tùm lum hết cả.
 
Upvote 0
Cảm ơn bạn đã gợi ý, theo gợi ý của bạn @befaint ,Oanh Thơ đang thử sửa theo code bài này của thầy @Ba Tê trong bài viết:
https://www.giaiphapexcel.com/diendan/threads/làm-sao-để-insert-dòng-trong-vba-nhỉ.764/#post-864043
hihi, đang lỗi tùm lum hết cả.
đây bạn xem code này được không nhé
Mã:
Sub chuyendulieu()
Dim arr, arr1
Dim i As Long, a As Long
arr = Sheet1.Range("c3:c7").Value
ReDim arr1(1 To UBound(arr, 1) * 5, 1 To 1)
a = 1
  For i = 1 To UBound(arr, 1)
      arr1(a, 1) = arr(i, 1)
      a = a + 5
  Next i
    Sheet1.Range("h3").Resize(a, 1).Value = arr1
End Sub
 
Upvote 0
đây bạn xem code này được không nhé
Mã:
Sub chuyendulieu()
Dim arr, arr1
Dim i As Long, a As Long
arr = Sheet1.Range("c3:c7").Value
ReDim arr1(1 To UBound(arr, 1) * 5, 1 To 1)
a = 1
  For i = 1 To UBound(arr, 1)
      arr1(a, 1) = arr(i, 1)
      a = a + 5
  Next i
    Sheet1.Range("h3").Resize(a, 1).Value = arr1
End Sub

Cảm ơn bạn đã hỗ trợ, Oanh Thơ (OT) loay hoay mãi mà vẫn chưa ra.
Híc xem code của bạn không thấy dễ như Oanh nghĩ chút nào thì ra phải dùng ReDim và dùng 2 mảng mới xong.
Code của bạn chay đúng rồi, còn ô cuối cùng của trong cột G bị lỗi #NA ạ.
 
Upvote 0
Cảm ơn bạn đã hỗ trợ, Oanh Thơ (OT) loay hoay mãi mà vẫn chưa ra.
Híc xem code của bạn không thấy dễ như Oanh nghĩ chút nào thì ra phải dùng ReDim và dùng 2 mảng mới xong.
Code của bạn chay đúng rồi, còn ô cuối cùng của trong cột G bị lỗi #NA ạ.
Cảm ơn bạn đã hỗ trợ, Oanh Thơ (OT) loay hoay mãi mà vẫn chưa ra.
Híc xem code của bạn không thấy dễ như Oanh nghĩ chút nào thì ra phải dùng ReDim và dùng 2 mảng mới xong.
Code của bạn chay đúng rồi, còn ô cuối cùng của trong cột G bị lỗi #NA ạ.
vậy bạn sửa cho Riseze là a-1 là được nhé
 
Upvote 0
Cảm ơn bạn đã hỗ trợ, Oanh Thơ (OT) loay hoay mãi mà vẫn chưa ra.
Híc xem code của bạn không thấy dễ như Oanh nghĩ chút nào thì ra phải dùng ReDim và dùng 2 mảng mới xong.
Code của bạn chay đúng rồi, còn ô cuối cùng của trong cột G bị lỗi #NA ạ.
Code trên đếm a dư 1.
Đếm như vầy mới đúng:
a = 0
For i = 1 To UBound(arr, 1)
a = a + 1
arr1(a, 1) = arr(i, 1)
a = a + 4
Next i
Nhưng mà nó luộm thuộm lắm. Tính luôn chỉ số cho nó gọn:
For i = 1 To UBound(arr1, 1) Step
arr1((i - 1) * 5 + 1, 1) = arr(i, 1)
Next i
 
Upvote 0
Xin chào các bạn,
Oanh Thơ sử dụng code của snow25, để chuyển dữ liệu từ cột C:D sang cột K:L
Cách chuyển cứ mỗi 1 dòng tại cột C:D thì tạo thành 5 dòng liên tục giống nhau tại cột K:L như ảnh kèm.
Mã:
Sub Chuyen_DL()
    Dim i As Long, j As Long, a As Long, LastRow As Long
    Dim sh As Worksheet, arr As Variant, arr1 As Variant
    Set sh = ThisWorkbook.Worksheets("Sheet1")
    LastRow = sh.Cells(sh.Rows.Count, "C").End(xlUp).Row
    arr = sh.Range("C1:D" & LastRow).Value
    ReDim arr1(1 To UBound(arr, 1) * 5, 1 To 2)
    a = 0
    For i = 1 To UBound(arr, 1)
        a = a + 1
        arr1(a, 1) = arr(i, 1): arr1(a, 2) = arr(i, 2)
        a = a + 4
    Next i
    With sh.Range("K1").Resize(a, 2)
        .Value = arr1
        .SpecialCells(xlCellTypeBlanks).Value = "=R[-1]C"
        .Value = .Value
    End With
End Sub
Hiện tại 2 dòng:
.SpecialCells(xlCellTypeBlanks).Value = "=R[-1]C"
.Value = .Value
đang làm việc với Range, nhờ các bạn chuyển giúp sang cách dùng mảng ạ
Untitled1.png
 
Upvote 0
Upvote 0
Cuối cùng cũng lòi cái đuôi ra. Đã bảo có chủ đề như này rồi. Có cả phương án code và công thức rồi sort.
hihi, khổ ghê OT cũng tìm rồi đó mà.
híc OT sẽ tìm tiếp và nghĩ tiếp ạ. @befaint biết link rồi thì trích cho OT tham khảo với.
Còn code trên cũng xài OK rồi nhưng OT muốn học và dùng mảng ạ.
 
Upvote 0
Mã:
Sub Chuyen_DL()
Dim Arr1(), Arr2(), i&, j&, a&, n&
With Sheets("Sheet1")
   Arr1 = .Range("C1", .[D65536].End(3)).Value
    ReDim Arr2(1 To UBound(Arr1, 1) * 5, 1 To UBound(Arr1, 2))
    For i = 1 To UBound(Arr1, 1)
      For n = 0 To 4
         For j = 1 To UBound(Arr1, 2)
            Arr2(a + n + 1, j) = Arr1(i, j)
         Next
      Next
      a = a + 5
    Next i
   .[K1].Resize(UBound(Arr2), UBound(Arr2, 2)) = Arr2
End With
End Sub
 
Upvote 0
Hàm WorksheetFunction nó có giới hạn của nó:
1. Text chỉ được khoảng 255 ký tự
2. Chỉ được khoảng 500 dòng
Các con số trên, tôi có thể sai một chút. Nhưng chuyện giới hạn là chuyện thực tế.
Thử vài ô với text dài xem.
Nếu dữ liệu 65536 dòng x 20 cột mà xài WorksheetFunction thì có mà tèo téo teo...

Cho vô mảng chạy 2 dòng For cho nó đẹp code nó bay cái Vèo :D:p
 
Upvote 0
Nếu dữ liệu 65536 dòng x 20 cột mà xài WorksheetFunction thì có mà tèo téo teo...

Cho vô mảng chạy 2 dòng For cho nó đẹp code nó bay cái Vèo :D:p
Nếu dữ liệu nhiều vậy, thì dùng excel làm chi - khi công ty giàu (dữ liệu nhiều chứng tỏ nhiều hoạt động) rồi
 
Upvote 0
hihi, khổ ghê OT cũng tìm rồi đó mà.
híc OT sẽ tìm tiếp và nghĩ tiếp ạ. @befaint biết link rồi thì trích cho OT tham khảo với.
Còn code trên cũng xài OK rồi nhưng OT muốn học và dùng mảng ạ.
Em cũng học nữa -\\/.
PHP:
Sub ChuyenDL()
    Dim sArr(), dArr(), I As Long, Idx As Long, K As Long, J As Long, N As Long: N = 5
sArr = Range("C1", Range("C" & Rows.Count).End(xlUp)).Resize(, 2).Value
ReDim dArr(1 To UBound(sArr) * N, 1 To UBound(sArr, 2))
For I = 1 To UBound(sArr)
    If sArr(I, 1) <> mpty Then
        For Idx = 1 To N
            K = K + 1
            For J = 1 To UBound(sArr, 2)
                dArr(K, J) = sArr(I, J)
            Next J
        Next Idx
    End If
Next I
If K Then Range("K1").Resize(K, UBound(sArr, 2)) = dArr
End Sub
 
Upvote 0
Web KT
Back
Top Bottom