Nhờ các anh, chị hỗ trợ giúp em sửa đoạn code VBA

Liên hệ QC

tinydragon

Thành viên mới
Tham gia
1/11/13
Bài viết
17
Được thích
4
Giới tính
Nữ
Dear các anh, chị,
Em mới học VBA và cần ứng dụng vào công việc để xử lý data lớn. Em có tham khảo nhiều nguồn để viết đoạn code như bên dưới để tính toán dữ liệu từ nhiều file vào 1 file. Em có đính kèm file. Em mô tả như sau:
File sumif: file có code vba để lấy số liệu tính toán từ 3 file source còn lại. Đoạn code nằm ở module 2.
Vấn đề của em là:
1. Vòng lặp for của em nó ko chạy (nó chỉ tính được kết quả của 1 file ngày 18.1.19 thôi). Nhờ anh, chị chỉ ra giúp em lỗi ạ.
2. Em muốn lấy được biến n = số file excel em chọn đầu vào để Range kết quả trả ra linh hoạt hơn (thay vì A2:C2 thì có thể là "A2:"&offset(A2,0,n), ý tưởng là vậy ạ).
Em cảm ơn anh, chị nhiều ạ!
Trích code:
Sub sumifs_multiple_files()
Dim Filename As Variant
Dim i As Integer
Dim wb As Workbook
Dim Cell1 As Range, Cell2 As Range
Filename = Application.GetOpenFilename(filefilter:="Excel Files, *.xl*", MultiSelect:=True)
If Not IsArray(Filename) Then Exit Sub
Application.ScreenUpdating = False
Set Cell1 = Sheets(3).Range("A2:C2")
Set Cell2 = Cell1.Offset(-1, 0)
For i = LBound(Filename) To UBound(Filename)
Set wb = Workbooks.Open(Filename(i))
Cell1.Value = Application.WorksheetFunction.SumIfs(wb.Sheets(1).Range("o:eek:"), wb.Sheets(1).Range("f:f"), "c", wb.Sheets(1).Range("b:b"), "<>199")
Cell2.Value = wb.Sheets(1).Range("A2").Value
wb.Close
Next i
Application.ScreenUpdating = True

End Sub
 

File đính kèm

  • Sumif.xlsm
    24.7 KB · Đọc: 5
  • W999F_TD_04.01.2019.xlsx
    3.3 MB · Đọc: 4
  • W999F_TD_11.01.2019.xlsx
    3.3 MB · Đọc: 3
  • W999F_TD_18.01.2019.xlsx
    3.3 MB · Đọc: 4
Dear các anh, chị,
Em mới học VBA và cần ứng dụng vào công việc để xử lý data lớn. Em có tham khảo nhiều nguồn để viết đoạn code như bên dưới để tính toán dữ liệu từ nhiều file vào 1 file. Em có đính kèm file. Em mô tả như sau:
File sumif: file có code vba để lấy số liệu tính toán từ 3 file source còn lại. Đoạn code nằm ở module 2.
Vấn đề của em là:
1. Vòng lặp for của em nó ko chạy (nó chỉ tính được kết quả của 1 file ngày 18.1.19 thôi). Nhờ anh, chị chỉ ra giúp em lỗi ạ.
2. Em muốn lấy được biến n = số file excel em chọn đầu vào để Range kết quả trả ra linh hoạt hơn (thay vì A2:C2 thì có thể là "A2:"&offset(A2,0,n), ý tưởng là vậy ạ).
Em cảm ơn anh, chị nhiều ạ!
Trích code:
Sub sumifs_multiple_files()
Dim Filename As Variant
Dim i As Integer
Dim wb As Workbook
Dim Cell1 As Range, Cell2 As Range
Filename = Application.GetOpenFilename(filefilter:="Excel Files, *.xl*", MultiSelect:=True)
If Not IsArray(Filename) Then Exit Sub
Application.ScreenUpdating = False
Set Cell1 = Sheets(3).Range("A2:C2")
Set Cell2 = Cell1.Offset(-1, 0)
For i = LBound(Filename) To UBound(Filename)
Set wb = Workbooks.Open(Filename(i))
Cell1.Value = Application.WorksheetFunction.SumIfs(wb.Sheets(1).Range("o:eek:"), wb.Sheets(1).Range("f:f"), "c", wb.Sheets(1).Range("b:b"), "<>199")
Cell2.Value = wb.Sheets(1).Range("A2").Value
wb.Close
Next i
Application.ScreenUpdating = True

End Sub
Ai bảo là for không chạy.Đây là nó chạy luôn lấy kết quả ở file cuối cùng mà.
 
Dear các anh, chị,
Em mới học VBA và cần ứng dụng vào công việc để xử lý data lớn. Em có tham khảo nhiều nguồn để viết đoạn code như bên dưới để tính toán dữ liệu từ nhiều file vào 1 file. Em có đính kèm file. Em mô tả như sau:
File sumif: file có code vba để lấy số liệu tính toán từ 3 file source còn lại. Đoạn code nằm ở module 2.
Vấn đề của em là:
1. Vòng lặp for của em nó ko chạy (nó chỉ tính được kết quả của 1 file ngày 18.1.19 thôi). Nhờ anh, chị chỉ ra giúp em lỗi ạ.
2. Em muốn lấy được biến n = số file excel em chọn đầu vào để Range kết quả trả ra linh hoạt hơn (thay vì A2:C2 thì có thể là "A2:"&offset(A2,0,n), ý tưởng là vậy ạ).
Em cảm ơn anh, chị nhiều ạ!
Trích code:
Sub sumifs_multiple_files()
Dim Filename As Variant
Dim i As Integer
Dim wb As Workbook
Dim Cell1 As Range, Cell2 As Range
Filename = Application.GetOpenFilename(filefilter:="Excel Files, *.xl*", MultiSelect:=True)
If Not IsArray(Filename) Then Exit Sub
Application.ScreenUpdating = False
Set Cell1 = Sheets(3).Range("A2:C2")
Set Cell2 = Cell1.Offset(-1, 0)
For i = LBound(Filename) To UBound(Filename)
Set wb = Workbooks.Open(Filename(i))
Cell1.Value = Application.WorksheetFunction.SumIfs(wb.Sheets(1).Range("o:eek:"), wb.Sheets(1).Range("f:f"), "c", wb.Sheets(1).Range("b:b"), "<>199")
Cell2.Value = wb.Sheets(1).Range("A2").Value
wb.Close
Next i
Application.ScreenUpdating = True

End Sub
Bây giờ bạn mô tả kỷ hơn mục đích của bạn là gì để mọi người biết và viết code cho bạn. Có khi không cần dùng sumif mà vẫn ra kết quả mong muốn nửa là khác.
 
Ai bảo là for không chạy.Đây là nó chạy luôn lấy kết quả ở file cuối cùng mà.
Ai bảo là for không chạy.Đây là nó chạy luôn lấy kết quả ở file cuối cùng mà.
Cảm ơn bạn đã reply! Đúng là nó chỉ ra kết quả từ 1 file thôi bạn. Mình muốn nó đi từng file 1 theo vòng lặp. Bạn có cao kiến gì chỉ cho mình với nhé!
Many thanks!
Bài đã được tự động gộp:

Bây giờ bạn mô tả kỷ hơn mục đích của bạn là gì để mọi người biết và viết code cho bạn. Có khi không cần dùng sumif mà vẫn ra kết quả mong muốn nửa là khác.
Vâng, mình muốn tính tổng cột O theo 1 vài điều kiện từ các cột khác. Mình sẽ có rất nhiều file nguồn, mình ko muốn mở từng file lên và tính vì nó nặng lắm. Các con số tính tổng ra được từng file, mình muốn đặt nó theo hàng ngang của file kết quả đó bạn.
Bạn xem thử giúp mình bị lỗi gì hay có ý nào hay hơn ko nhé!
Cảm ơn bạn nhiều!
 
Cảm ơn bạn đã reply! Đúng là nó chỉ ra kết quả từ 1 file thôi bạn. Mình muốn nó đi từng file 1 theo vòng lặp. Bạn có cao kiến gì chỉ cho mình với nhé!
Many Cảm ơn!
Bài đã được tự động gộp:


Vâng, mình muốn tính tổng cột O theo 1 vài điều kiện từ các cột khác. Mình sẽ có rất nhiều file nguồn, mình ko muốn mở từng file lên và tính vì nó nặng lắm. Các con số tính tổng ra được từng file, mình muốn đặt nó theo hàng ngang của file kết quả đó bạn.
Bạn xem thử giúp mình bị lỗi gì hay có ý nào hay hơn ko nhé!
Cảm ơn bạn nhiều!
Cho cái ví dụ cụ thể và nói chi tiết ra nhé bạn.Xem mình có viết được code khác không.
 
Cho cái ví dụ cụ thể và nói chi tiết ra nhé bạn.Xem mình có viết được code khác không.
À cụ thể là thế này:
Mình có rất nhiều file nguồn cùng cấu trúc, khác ngày thôi, ở mỗi file mình muốn tính tổng cột O theo 1 vài điều kiện từ các cột khác (cụ thể trong hàm sumifs của mình có ghi). Mình ko muốn mở từng file lên và tính vì nó nặng lắm. Các con số tính tổng ra được từng file, mình muốn đặt nó theo hàng ngang của file kết quả đó bạn.
Bạn xem thử giúp mình bị lỗi gì hay có ý nào hay hơn ko nhé!
Cảm ơn bạn nhiều!
 
À cụ thể là thế này:
Mình có rất nhiều file nguồn cùng cấu trúc, khác ngày thôi, ở mỗi file mình muốn tính tổng cột O theo 1 vài điều kiện từ các cột khác (cụ thể trong hàm sumifs của mình có ghi). Mình ko muốn mở từng file lên và tính vì nó nặng lắm. Các con số tính tổng ra được từng file, mình muốn đặt nó theo hàng ngang của file kết quả đó bạn.
Bạn xem thử giúp mình bị lỗi gì hay có ý nào hay hơn ko nhé!
Cảm ơn bạn nhiều!
Bạn chạy cái này thử xem.
Mã:
Sub sumifs_multiple_files()
    Dim Filename As Variant, arr
    Dim i As Integer
    Dim wb As Workbook
    Filename = Application.GetOpenFilename(filefilter:="Excel Files, *.xl*", MultiSelect:=True)
    If Not IsArray(Filename) Then Exit Sub
    Application.ScreenUpdating = False
    ReDim arr(1 To 2, 1 To UBound(Filename))
    For i = LBound(Filename) To UBound(Filename)
        Set wb = Workbooks.Open(Filename(i))
        arr(2, i) = Application.WorksheetFunction.SumIfs(wb.Sheets(1).Range("o:o"), wb.Sheets(1).Range("f:f"), "c", wb.Sheets(1).Range("b:b"), "<>199")
        arr(1, i) = Mid(Filename(i), Len(Filename(i)) - 14, 10)
    wb.Close
    Next i
    Application.ScreenUpdating = True
    With Sheets("sheet3")
        .Cells.ClearContents
        .Range("A1:A2").Resize(, i - 1).Value = arr
    End With
End Sub
 
Bạn chạy cái này thử xem.
Mã:
Sub sumifs_multiple_files()
    Dim Filename As Variant, arr
    Dim i As Integer
    Dim wb As Workbook
    Filename = Application.GetOpenFilename(filefilter:="Excel Files, *.xl*", MultiSelect:=True)
    If Not IsArray(Filename) Then Exit Sub
    Application.ScreenUpdating = False
    ReDim arr(1 To 2, 1 To UBound(Filename))
    For i = LBound(Filename) To UBound(Filename)
        Set wb = Workbooks.Open(Filename(i))
        arr(2, i) = Application.WorksheetFunction.SumIfs(wb.Sheets(1).Range("o:o"), wb.Sheets(1).Range("f:f"), "c", wb.Sheets(1).Range("b:b"), "<>199")
        arr(1, i) = Mid(Filename(i), Len(Filename(i)) - 14, 10)
    wb.Close
    Next i
    Application.ScreenUpdating = True
    With Sheets("sheet3")
        .Cells.ClearContents
        .Range("A1:A2").Resize(, i - 1).Value = arr
    End With
End Sub
Oh! Code của bạn nó hoạt động tốt bạn ơi! Tuyệt vời quá! Qua nay mình loay hoay mãi! Bạn xịn quá luôn!
Nếu ko phiền, bạn cho mình hỏi ý nghĩa chỗ arr và Redim arr với nhé, mình chưa hiểu lắm!
Cảm ơn snow25 nhìu!
 
Oh! Code của bạn nó hoạt động tốt bạn ơi! Tuyệt vời quá! Qua nay mình loay hoay mãi! Bạn xịn quá luôn!
Nếu ko phiền, bạn cho mình hỏi ý nghĩa chỗ arr và Redim arr với nhé, mình chưa hiểu lắm!
Cảm ơn snow25 nhìu!
Ah mình hiểu rồi nhé bạn! Rồi mình phát triển nó thêm theo nhu cầu của mình và hoạt động tốt!
Cảm ơn bạn và diễn đàn! Hi vọng ngày nào đó mình cũng đủ trình để giải đáp 1 số thắc mắc cho các bạn khác trên này! :))
 
Web KT
Back
Top Bottom