Gán 2 sheet (cấu trúc như nhau) vào 1 array (1 người xem)

Liên hệ QC

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

hoanganhdl

Thành viên hoạt động
Tham gia
10/2/09
Bài viết
135
Được thích
74
Nghề nghiệp
Kế toán viên
Khi xuất dữ liệu ra excel, vì quá nhiều dòng nên bị tách thành 2 or 3 sheet. Giờ muốn gán nối tiếp vào array thì phải làm sao? Xin ace và thầy cô hướng dẫn.
 
Khi xuất dữ liệu ra excel, vì quá nhiều dòng nên bị tách thành 2 or 3 sheet. Giờ muốn gán nối tiếp vào array
Đang dùng Excel phiên bản nào?
Cho vào 1 array rồi làm gì tiếp? Có chép lại xuống bảng tính không?
Có thể ghép các sheets vào một sheet rồi xử lý?
 
Upvote 0
sờ tít con ti niu en tơ array:
1. tạo array 2 trang èn trang 1 gán sheet1 èn trang 2 gán sheet2, o
2. dùng ADO èn lấy cái recordset của nó
 
Upvote 0
Đang dùng Excel phiên bản nào?
Cho vào 1 array rồi làm gì tiếp? Có chép lại xuống bảng tính không?
Có thể ghép các sheets vào một sheet rồi xử lý?
Mình dùng Excel 2010
Mình cần cho vào 1 array rồi duyệt qua lọc bớt các dòng ko cần thiết & gán xuống worksheet trong workbook khác
 
Upvote 0
sờ tít con ti niu en tơ array:
1. tạo array 2 trang èn trang 1 gán sheet1 èn trang 2 gán sheet2, o
2. dùng ADO èn lấy cái recordset của nó
1.Bạn có thể giới thiệu giúp mình tài liệu để đọc thêm về array 2 trang ko?
2.Mình chưa nghiên cứu đến ADO
 
Upvote 0

File đính kèm

Upvote 0
Mình chỉ bí chỗ gán 2 range vào 1 array thơi còn phần kia mình đã làm được. Bạn giúp chỗ gán 2 range ở 2 sheet vào mảng là được.
 
Upvote 0
Tìm trong thớt "Các câu hỏi về mảng trong VBA (Array)"
Trong đó có mấy bài nới về cách nối mảng.
Đọc xem có áp dụng được hay không. Nếu không áp dụng được thì giải thích tại sao không. Lúc đó tôi sẽ giúp cho cách chỉnh sửa để áp dụng, hoặc nếu hoàn toàn không thể áp dụng thì tôi sẽ bày cách khác.
 
Upvote 0
Tks bạn. Mình up file bạn viết giúp đoạn code nhé. Gán 2 sheet Part1 & Part2 vào mảng arrdata()& gán xuống 1 sheet mới là Tonghop
Cho tất cả code dưới đây vào một module:
Mã:
Public Const WSNAME = "TONG HOP"
Function SheetExist(ByVal SheetName As String) As Boolean
  On Error Resume Next
  SheetExist = Not Sheets(SheetName) Is Nothing
End Function
Function Join2DArray(ParamArray arrays())
  Dim arr(), aSub, tmp
  Dim lRs As Long, lCs As Long, lR As Long, lC As Long
  Dim n As Long, m As Long, i As Long, bChk As Boolean
  On Error Resume Next

  For i = 0 To UBound(arrays)
    aSub = arrays(i)
    n = UBound(aSub, 1) - LBound(aSub, 1) + 1
    lRs = lRs + n
    m = UBound(aSub, 2) - LBound(aSub, 2) + 1
    If lCs < m Then lCs = m
  Next
 
  ReDim arr(1 To lCs, 1 To lRs)
  n = 0: m = 0
  For i = 0 To UBound(arrays)
    aSub = arrays(i)
    For lR = LBound(aSub, 1) To UBound(aSub, 1)
      bChk = False
      n = n + 1
      For lC = LBound(aSub, 2) To UBound(aSub, 2)
        tmp = aSub(lR, lC)
        Select Case VarType(tmp)
          Case 0 To 1: arr(lC, n) = vbNullString
          Case 2 To 7: arr(lC, n) = tmp
          Case 8
            If IsNumeric(tmp) Then
              arr(lC, n) = "'" & tmp
            Else
              arr(lC, n) = tmp
            End If
        End Select
        If Len(CStr(tmp)) Then bChk = True
      Next
      If bChk = False Then n = n - 1
    Next
  Next
  If n Then
    ReDim Preserve arr(1 To lCs, 1 To n)
    Join2DArray = Transpose2DArray(arr)
  End If
End Function
Function Transpose2DArray(ByVal arr2D)
  Dim arr(), aTemp
  Dim lR As Long, lC As Long
  On Error Resume Next
  aTemp = arr2D
  ReDim arr(LBound(aTemp, 2) To UBound(aTemp, 2), LBound(aTemp, 1) To UBound(aTemp, 1))
  For lR = LBound(aTemp, 1) To UBound(aTemp, 1)
    For lC = LBound(aTemp, 2) To UBound(aTemp, 2)
      arr(lC, lR) = aTemp(lR, lC)
    Next
  Next
  Transpose2DArray = arr
End Function
Sub Main()
  Dim aRes, wks As Worksheet
  aRes = Join2DArray(Sheets("Part1").Range("A2:K1000"), Sheets("Part2").Range("A2:K1000"))
  If IsArray(aRes) Then
    If Not SheetExist(WSNAME) Then Worksheets.Add.Name = WSNAME
    Set wks = Sheets(WSNAME)
    wks.Range("A1:K1").Value = Sheets("Part1").Range("A1:K1").Value
    wks.Range("A2").Resize(UBound(aRes, 1), UBound(aRes, 2)).Value = aRes
  End If
End Sub
Bạn chỉ cần chú ý đến Sub Main cuối cùng, đó là chỗ cho bạn tùy biến
Bạn mở file lên, bấm Alt + F8, chọn Main và Run là xong
 

File đính kèm

Upvote 0
Cho tất cả code dưới đây vào một module:
Mã:
Public Const WSNAME = "TONG HOP"
Function SheetExist(ByVal SheetName As String) As Boolean
  On Error Resume Next
  SheetExist = Not Sheets(SheetName) Is Nothing
End Function
Function Join2DArray(ParamArray arrays())
  Dim arr(), aSub, tmp
  Dim lRs As Long, lCs As Long, lR As Long, lC As Long
  Dim n As Long, m As Long, i As Long, bChk As Boolean
  On Error Resume Next

  For i = 0 To UBound(arrays)
    aSub = arrays(i)
    n = UBound(aSub, 1) - LBound(aSub, 1) + 1
    lRs = lRs + n
    m = UBound(aSub, 2) - LBound(aSub, 2) + 1
    If lCs < m Then lCs = m
  Next
 
  ReDim arr(1 To lCs, 1 To lRs)
  n = 0: m = 0
  For i = 0 To UBound(arrays)
    aSub = arrays(i)
    For lR = LBound(aSub, 1) To UBound(aSub, 1)
      bChk = False
      n = n + 1
      For lC = LBound(aSub, 2) To UBound(aSub, 2)
        tmp = aSub(lR, lC)
        Select Case VarType(tmp)
          Case 0 To 1: arr(lC, n) = vbNullString
          Case 2 To 7: arr(lC, n) = tmp
          Case 8
            If IsNumeric(tmp) Then
              arr(lC, n) = "'" & tmp
            Else
              arr(lC, n) = tmp
            End If
        End Select
        If Len(CStr(tmp)) Then bChk = True
      Next
      If bChk = False Then n = n - 1
    Next
  Next
  If n Then
    ReDim Preserve arr(1 To lCs, 1 To n)
    Join2DArray = Transpose2DArray(arr)
  End If
End Function
Function Transpose2DArray(ByVal arr2D)
  Dim arr(), aTemp
  Dim lR As Long, lC As Long
  On Error Resume Next
  aTemp = arr2D
  ReDim arr(LBound(aTemp, 2) To UBound(aTemp, 2), LBound(aTemp, 1) To UBound(aTemp, 1))
  For lR = LBound(aTemp, 1) To UBound(aTemp, 1)
    For lC = LBound(aTemp, 2) To UBound(aTemp, 2)
      arr(lC, lR) = aTemp(lR, lC)
    Next
  Next
  Transpose2DArray = arr
End Function
Sub Main()
  Dim aRes, wks As Worksheet
  aRes = Join2DArray(Sheets("Part1").Range("A2:K1000"), Sheets("Part2").Range("A2:K1000"))
  If IsArray(aRes) Then
    If Not SheetExist(WSNAME) Then Worksheets.Add.Name = WSNAME
    Set wks = Sheets(WSNAME)
    wks.Range("A1:K1").Value = Sheets("Part1").Range("A1:K1").Value
    wks.Range("A2").Resize(UBound(aRes, 1), UBound(aRes, 2)).Value = aRes
  End If
End Sub
Bạn chỉ cần chú ý đến Sub Main cuối cùng, đó là chỗ cho bạn tùy biến
Bạn mở file lên, bấm Alt + F8, chọn Main và Run là xong
Bạn có thể giải thích lý do chuyển chiều dòng và cột của mảng 2 lần, cám ơn nhiều
 
Upvote 0
Bạn có thể giải thích lý do chuyển chiều dòng và cột của mảng 2 lần, cám ơn nhiều
Như bạn befain nói ở trên đấy! Vì tôi nối mảng có loại bỏ dòng trống nên không biết trứơc mảng kết quả sẽ "dài" bao nhiêu nên phải xoay mảng lại để redim preserve, sau đó xoay lần nữa cho đúng chiều
 
Upvote 0
Cho tất cả code dưới đây vào một module:
Mã:
Public Const WSNAME = "TONG HOP"
Function SheetExist(ByVal SheetName As String) As Boolean
  On Error Resume Next
  SheetExist = Not Sheets(SheetName) Is Nothing
End Function
Function Join2DArray(ParamArray arrays())
  Dim arr(), aSub, tmp
  Dim lRs As Long, lCs As Long, lR As Long, lC As Long
  Dim n As Long, m As Long, i As Long, bChk As Boolean
  On Error Resume Next

  For i = 0 To UBound(arrays)
    aSub = arrays(i)
    n = UBound(aSub, 1) - LBound(aSub, 1) + 1
    lRs = lRs + n
    m = UBound(aSub, 2) - LBound(aSub, 2) + 1
    If lCs < m Then lCs = m
  Next
 
  ReDim arr(1 To lCs, 1 To lRs)
  n = 0: m = 0
  For i = 0 To UBound(arrays)
    aSub = arrays(i)
    For lR = LBound(aSub, 1) To UBound(aSub, 1)
      bChk = False
      n = n + 1
      For lC = LBound(aSub, 2) To UBound(aSub, 2)
        tmp = aSub(lR, lC)
        Select Case VarType(tmp)
          Case 0 To 1: arr(lC, n) = vbNullString
          Case 2 To 7: arr(lC, n) = tmp
          Case 8
            If IsNumeric(tmp) Then
              arr(lC, n) = "'" & tmp
            Else
              arr(lC, n) = tmp
            End If
        End Select
        If Len(CStr(tmp)) Then bChk = True
      Next
      If bChk = False Then n = n - 1
    Next
  Next
  If n Then
    ReDim Preserve arr(1 To lCs, 1 To n)
    Join2DArray = Transpose2DArray(arr)
  End If
End Function
Function Transpose2DArray(ByVal arr2D)
  Dim arr(), aTemp
  Dim lR As Long, lC As Long
  On Error Resume Next
  aTemp = arr2D
  ReDim arr(LBound(aTemp, 2) To UBound(aTemp, 2), LBound(aTemp, 1) To UBound(aTemp, 1))
  For lR = LBound(aTemp, 1) To UBound(aTemp, 1)
    For lC = LBound(aTemp, 2) To UBound(aTemp, 2)
      arr(lC, lR) = aTemp(lR, lC)
    Next
  Next
  Transpose2DArray = arr
End Function
Sub Main()
  Dim aRes, wks As Worksheet
  aRes = Join2DArray(Sheets("Part1").Range("A2:K1000"), Sheets("Part2").Range("A2:K1000"))
  If IsArray(aRes) Then
    If Not SheetExist(WSNAME) Then Worksheets.Add.Name = WSNAME
    Set wks = Sheets(WSNAME)
    wks.Range("A1:K1").Value = Sheets("Part1").Range("A1:K1").Value
    wks.Range("A2").Resize(UBound(aRes, 1), UBound(aRes, 2)).Value = aRes
  End If
End Sub
Bạn chỉ cần chú ý đến Sub Main cuối cùng, đó là chỗ cho bạn tùy biến
Bạn mở file lên, bấm Alt + F8, chọn Main và Run là xong
Vào giaiphapexcel để tìm giải pháp cho công việc (kế toán) mình vẫn thích nhất thầy ndu, thầy giúp đỡ theo kiểu một người bạn giúp giải quyết công việc chứ ko theo kiểu người thầy dạy sinh viên viết code. Học với thầy mình sẽ đi theo quy trình: Áp dụng được, sau đó hiểu được, cuối cùng mới là tự viết được. Cảm ơn thầy
 
Upvote 0
Web KT

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

Back
Top Bottom