Đưa 2 range ở 2 sheet vào chung 1 mảng để xử lý

Liên hệ QC

moihocvba

Thành viên thường trực
Tham gia
16/8/20
Bài viết
211
Được thích
50
Chào anh chị! Em có 2 sheet Nhập và Xuất ở 2 sheet khác nhau, mục đích em cần tạo ra bảng nhập xuất tồn nên em muốn đưa 2 range này vào cùng 1 mảng để chạy vòng lặp trong mảng rút ra kết quả như mong muốn. Anh chị chỉ em cách để đưa 2 range ở 2 sheet khác nhau vào cùng 1 mảng với.

sheet nhập:
1619522551834.png

Sheet xuất:
1619522576566.png

và sheet em mong muốn kết quả:
1619522694820.png

Cám ơn anh chị đã giải đáp!
 

File đính kèm

  • 1619522547391.png
    1619522547391.png
    57.9 KB · Đọc: 7
  • Bang nhap xuat ton.xlsx
    14.1 KB · Đọc: 12
Sử dụng Power query append 2 bảng thành 1.
 
Upvote 0
Bài này dùng Power Query là chỉnh nhất.
Nhưng nếu ghiền lập trình thì dùng ADO, lệnh SQL Union hai bảng với nhau, khỏi vòng lặp vòng liếc gì ráo.
 
Upvote 0
Nếu để nguyên bảng nhập xuất: Dùng power query append:

1619526586648.png

Nếu thêm sẵn cột loại nhập xuất ở 2 bảng, khuyến mãi hàm Let của Excel 365

H2 =LET(data1,DataN2,data2,DataX2,stt,SEQUENCE(ROWS(data1)+ROWS(data2)),IF(stt<=ROWS(data1),INDEX(data1,stt,SEQUENCE(1,5)),INDEX(data2,stt-ROWS(data1),SEQUENCE(1,5))))

1619526705748.png
 

File đính kèm

  • Bang nhap xuat ton.xlsx
    28.4 KB · Đọc: 11
Upvote 0
Cách này thì có tự động được không bác, bấm nút ra ngay kế quả ý bác.
Nối lại chỉ là 1 phần công việc, chưa phải kết quả cuối. Phần tiếp theo là lập trình trên bảng đã nối để ra kết quả sheet còn lại. Phần sau này tác giả không hỏi
 
Upvote 0
Nối lại chỉ là 1 phần công việc, chưa phải kết quả cuối. Phần tiếp theo là lập trình trên bảng đã nối để ra kết quả sheet còn lại. Phần sau này tác giả không hỏi
Dạ cháu đã hiểu và chưa làm được vì chưa học món "bao ờ quoe di" này. Món này có vẻ thơm, chắc bác Vẹt cũng nghiền món này?
 
Upvote 0
Nối lại chỉ là 1 phần công việc, chưa phải kết quả cuối. Phần tiếp theo là lập trình trên bảng đã nối để ra kết quả sheet còn lại. Phần sau này tác giả không hỏi
Dạ phần sau con đã biết rồi chú, con chỉ muốn dùng VBA vì Power Query con chưa biết một chút gì hết. Hihi
Chú có thể giúp con dùng VBA ko ạ?
 
Upvote 0
Dạ phần sau con đã biết rồi chú, con chỉ muốn dùng VBA vì Power Query con chưa biết một chút gì hết. Hihi
Chú có thể giúp con dùng VBA ko ạ?
- Khai báo 3 mảng 1, 2 và 3
- lấy dòng cuối của 2 sheet,
- Mảng 1 gán dữ liệu sheet 1, mảng 2 gán dữ liệu sheet 2
- Redim mảng 3 có số dòng là tổng số dòng của 2 mảng 1, 2
- Lặp mảng 1, add vào mảng 3
- Lặp tiếp mảng 2, add tiếp vào mảng 3

(*) Cách căn bản nhất, và đừng suy nghĩ nhiều về tốc độ hay code dài
 
Upvote 0
Cách căn bản nhất, và đừng suy nghĩ nhiều về tốc độ hay code dài
thì đúng là cách này rồi còn gì bác, uổi mà ghép mảng xong không biết cái nào là xuất, cái nào là nhập, cho vào nấu cháo một đám sợ ăn không ngon. mà để ý là bài 4 tự nhiên nảy ra thêm một cột mới nữa.
 
Upvote 0
thì đúng là cách này rồi còn gì bác, uổi mà ghép mảng xong không biết cái nào là xuất, cái nào là nhập, cho vào nấu cháo một đám sợ ăn không ngon. mà để ý là bài 4 tự nhiên nảy ra thêm một cột mới nữa.
Bài 4 add thêm 1 cột bằng Power query chứ ở đâu ra.
Còn dùng mảng thì phải khai báo dư 1 cột, khi gán 4 cột mảng 1, 2 vào mảng 3 thì phải gán tiếp cột 5 bằng "N", hoặc "X"
Nếu dùng ADO thì cũng phải thêm 1 cột:
SQL = Select *, "N" from Data1 Union All Select *, "X" form Data2
 
Upvote 0
thì đúng là cách này rồi còn gì bác, uổi mà ghép mảng xong không biết cái nào là xuất, cái nào là nhập, cho vào nấu cháo một đám sợ ăn không ngon. mà để ý là bài 4 tự nhiên nảy ra thêm một cột mới nữa.
Bài #9 chỉ mách cho kỹ thuật nối mảng. Dữ liệu bị lộn xộn là lỗi của bạn. Có đến vài cách phân biệt:
- dùng 1 biến ghi lại độ dài mỗi mảng con
- ghi xuất là số âm.
- ...

Và nhắc lại, bài #9 chỉ mách kỹ thuật. Việc nối 2 mảng lại thành 1 chỉ là ý của thớt, đâu đã được nhận là giải thuật của bài này.
Chạy 1 vòng lặp chỉ là cái thói quen của nhiều người trên GPE, đâu đã được nhận là:
1. hiệu quả
2. code dễ hiểu
3. code dễ chỉnh sửa, dễ phát triển
 
Upvote 0
Chào anh chị! Em có 2 sheet Nhập và Xuất ở 2 sheet khác nhau, mục đích em cần tạo ra bảng nhập xuất tồn nên em muốn đưa 2 range này vào cùng 1 mảng để chạy vòng lặp trong mảng rút ra kết quả như mong muốn. Anh chị chỉ em cách để đưa 2 range ở 2 sheet khác nhau vào cùng 1 mảng với.

sheet nhập:
View attachment 257761

Sheet xuất:
View attachment 257762

và sheet em mong muốn kết quả:
View attachment 257766

Cám ơn anh chị đã giải đáp!
Tự nhiên đòi hỏi ghép 2 vùng vào 1 mảng cho luxubu.
Đổi tên sheet dài thoòng thành NXT.
PHP:
Option Explicit

Public Sub Gpe()
Dim sArr(), dArr(1 To 1000, 1 To 4), SP As String
Dim I As Long, K As Long, R As Long, fDay As Long, eDay As Long
With Sheets("NXT")
    fDay = .Range("B2").Value
    eDay = .Range("B3").Value
    SP = .Range("B4").Value
    '============================= Nhap'
    sArr = Sheets("Nhap").Range("A4", Sheets("Nhap").Range("A10000").End(xlUp)).Resize(, 4).Value
    R = UBound(sArr)
    If R > 1 Then
        For I = 2 To R
            If sArr(I, 1) >= fDay Then
                If sArr(I, 1) <= eDay Then
                    If sArr(I, 2) = SP Then
                        K = K + 1
                        dArr(K, 1) = sArr(I, 1)
                        dArr(K, 2) = sArr(I, 3)
                        dArr(K, 3) = sArr(I, 4)
                    End If
                End If
            End If
        Next I
    End If
    '============================= Xuat'
    sArr = Sheets("Xuat").Range("A4", Sheets("Xuat").Range("A10000").End(xlUp)).Resize(, 4).Value
    R = UBound(sArr)
    If R > 1 Then
        For I = 2 To R
            If sArr(I, 1) >= fDay Then
                If sArr(I, 1) <= eDay Then
                    If sArr(I, 2) = SP Then
                        K = K + 1
                        dArr(K, 1) = sArr(I, 1)
                        dArr(K, 2) = sArr(I, 3)
                        dArr(K, 4) = sArr(I, 4)
                    End If
                End If
            End If
        Next I
    End If
    '======================================NXT'
    .Range("A7:D1000").ClearContents
    .Range("A7:D1000").Borders.LineStyle = 0
    If K Then
        .Range("A7:D7").Resize(K) = dArr
        .Range("A7:D7").Resize(K).Borders.LineStyle = 1
        .Range("A7:D7").Resize(K).Sort Key1:=.Range("A7"), Order1:=xlAscending
    End If
End With
End Sub
 

File đính kèm

  • Bang nhap xuat ton.xlsb
    25.5 KB · Đọc: 10
Upvote 0
Tự nhiên đòi hỏi ghép 2 vùng vào 1 mảng cho luxubu.
...
Bạn sử lý hai mảng gần như in hệt nhau. Như vậy bạn không cần hai code riêng biệt.

For Each bang In Array("Nhap", "Xuat")
sArr = Sheets(bang).Range("A4", Sheets(bang).Range("A10000").End(xlUp)).Resize(, 4).Value
cotSL = IIF(bang = "Xuat", 4, 3) ' cột để ghi số lượng
' code xét mảng và lấy dữ liệu ở đây
' với cột số lượng, thay vì 3, 4 thì bạn dùng cotSL
Next bang
 
Upvote 0
Bạn sử lý hai mảng gần như in hệt nhau. Như vậy bạn không cần hai code riêng biệt.

For Each bang In Array("Nhap", "Xuat")
sArr = Sheets(bang).Range("A4", Sheets(bang).Range("A10000").End(xlUp)).Resize(, 4).Value
cotSL = IIF(bang = "Xuat", 4, 3) ' cột để ghi số lượng
' code xét mảng và lấy dữ liệu ở đây
' với cột số lượng, thay vì 3, 4 thì bạn dùng cotSL
Next bang
Viết "tanh bành" ra cho khỏi bị hỏi.
Híc!
PHP:
Option Explicit

Public Sub Gpe()
Dim sArr(), dArr(1 To 1000, 1 To 4), SP As String, Bang As Variant
Dim I As Long, K As Long, R As Long, fDay As Long, eDay As Long, CotSL As Long
With Sheets("NXT")
    fDay = .Range("B2").Value
    eDay = .Range("B3").Value
    SP = .Range("B4").Value
    '============================= Nhap, Xuat'
    For Each Bang In Array("Nhap", "Xuat")
        sArr = Sheets(Bang).Range("A4", Sheets(Bang).Range("A10000").End(xlUp)).Resize(, 4).Value
        R = UBound(sArr)
        If R > 1 Then
            CotSL = IIf(Bang = "Nhap", 3, 4)
            For I = 2 To R
                If sArr(I, 1) >= fDay Then
                    If sArr(I, 1) <= eDay Then
                        If sArr(I, 2) = SP Then
                        K = K + 1
                        dArr(K, 1) = sArr(I, 1)
                        dArr(K, 2) = sArr(I, 3)
                        dArr(K, CotSL) = sArr(I, 4)
                        End If
                    End If
                End If
            Next I
        End If
    Next Bang
    '======================================NXT'
    .Range("A7:D1000").ClearContents
    .Range("A7:D1000").Borders.LineStyle = 0
    If K Then
        .Range("A7:D7").Resize(K) = dArr
        .Range("A7:D7").Resize(K).Borders.LineStyle = 1
        .Range("A7:D7").Resize(K).Sort Key1:=.Range("A7"), Order1:=xlAscending
    End If
End With
End Sub
 
Upvote 0
Lưu ý là thớt chỉ hỏi một cách hời hợt về "vào chung một mảng".
Nói cách khác, thớt chỉ đoán đại giải thuật chứ chưa suy nghĩ kỹ.

Việc gộp mảng không hề giúp cho thớt lấy được kết quả như hình ở bài #1. Bởi vì nó sẽ cho ra kết quả nhập trước xuất sau.
Để được kết quả như hình ở bài #1. Sau khi ghi kết quả xong còn phải sort theo ngày tháng.

Cách làm dễ hơn, code cũng được mà làm tay cũng chả chết ai:
- Tạo một sheet tạm
- Copy range bên nhập vào
- Copy 2 cột bên xuất vào
- Copy cột thứ 3 của bên xuất vào cột thứ 4
- Sort, Adanced Filter
- Copy vào chỗ cần thiết.
 
Upvote 0
Lưu ý là thớt chỉ hỏi một cách hời hợt về "vào chung một mảng".
Nói cách khác, thớt chỉ đoán đại giải thuật chứ chưa suy nghĩ kỹ.

Việc gộp mảng không hề giúp cho thớt lấy được kết quả như hình ở bài #1. Bởi vì nó sẽ cho ra kết quả nhập trước xuất sau.
Tôi thấy tác giả đã biết ở đâu đó code của 1 bài tương tự, kết quả tương tự hình bài #1, nhưng bài đó chỉ có 1 bảng nhập xuất. Tức 1 cái là của bản thân lại là 2 bảng, chỉ cần gộp 2 bảng làm 1 (sort siếc cái nữa), thì áp dụng code bài đã biết là xong. Tác giả cũng đã xác nhận vụ này ở bài #8
 
Upvote 0
Chào anh chị! Em có 2 sheet Nhập và Xuất ở 2 sheet khác nhau, mục đích em cần tạo ra bảng nhập xuất tồn nên em muốn đưa 2 range này vào cùng 1 mảng để chạy vòng lặp trong mảng rút ra kết quả như mong muốn. Anh chị chỉ em cách để đưa 2 range ở 2 sheet khác nhau vào cùng 1 mảng với.

sheet nhập:
View attachment 257761

Sheet xuất:
View attachment 257762

và sheet em mong muốn kết quả:
View attachment 257766

Cám ơn anh chị đã giải đáp!
Tránh tình trạng xuất kho âm, cùng ngày phải nhập phiếu nhập kho trước, sau đó mới nhập phiếu xuất kho
Mã:
Sub XYZ()
  Dim sArr(), aXuat(), aCol, Res()
  Dim SP$, fday As Date, eDay As Date, sRow&, i&, k&
 
  aCol = Array(Array("Nhap", 0, 3), Array("Xuat", 0, 4))
  With Sheets("NhapXuatTon")
    fday = .Range("B2").Value:    eDay = .Range("B3").Value
    SP = .Range("B4").Value
    
    For n = 0 To 1
      aCol(n)(1) = Sheets(aCol(n)(0)).Range("A" & Rows.Count).End(xlUp).Row - 4
    Next n
    ReDim Res(1 To aCol(0)(1) + aCol(1)(1), 1 To 4)
    For n = 0 To 1
      sRow = aCol(n)(1)
      sArr = Sheets(aCol(n)(0)).Range("A5").Resize(sRow, 4).Value
      For i = 1 To sRow
        If sArr(i, 2) = SP Then
          If sArr(i, 1) >= fday Then
            If sArr(i, 1) <= eDay Then
              k = k + 1
              Res(k, 1) = sArr(i, 1):   Res(k, 2) = sArr(i, 3)
              Res(k, aCol(n)(2)) = sArr(i, 4)
            End If
          End If
        End If
      Next i
    Next n
    i = .Range("A" & Rows.Count).End(xlUp).Row
    If i > 6 Then .Range("A7:D" & i).Clear
    If k Then
      .Range("B7").Resize(k).NumberFormat = "@"
      .Range("A7:D7").Resize(k) = Res
      .Range("A7:D7").Resize(k).Borders.LineStyle = 1
      .Range("A7:D7").Resize(k).Sort .Range("A7"), 1, .Range("C7"), , 1
    End If
  End With
End Sub
 
Upvote 0
- Khai báo 3 mảng 1, 2 và 3
- lấy dòng cuối của 2 sheet,
- Mảng 1 gán dữ liệu sheet 1, mảng 2 gán dữ liệu sheet 2
- Redim mảng 3 có số dòng là tổng số dòng của 2 mảng 1, 2
- Lặp mảng 1, add vào mảng 3
- Lặp tiếp mảng 2, add tiếp vào mảng 3

(*) Cách căn bản nhất, và đừng suy nghĩ nhiều về tốc độ hay code dài
Tôi nghĩ như thế này nhanh hơn:
- Khai báo 2 mảng 1 và 2
- lấy dòng cuối của 2 sheet,
- Mảng 1 gán dữ liệu sheet 1
- Mảng 2 gán dữ liệu sheet 2 nhưng có thêm số dòng trống = số dòng của mảng 1
- Lặp mảng 1 vào mảng 2 ở các dòng trống ấy
 
Upvote 0
Web KT

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

Back
Top Bottom