Nhờ viết code VBA để nhiều dòng bên dưới áp dụng công thức điền tay tại ô H5 đến DH5

Liên hệ QC

do.phuong

Thành viên hoạt động
Tham gia
28/9/12
Bài viết
127
Được thích
165
Chào các anh chị ạ,

Em muốn nhờ anh chị viết code VBA cho file đính kèm.
Bên cty em thường có rất nhiều dòng dữ liệu trải dài khoảng >100.000 dòng, với khoảng 80 cột. Công thức thường dùng để lấy dữ liệu từ các sheet của cùng 1 file.
Khi thực hiện các công thức đơn giản như lệnh tổng hay vlookup, file cũng cực kỳ nặng và khi chạy công thức hoặc Save thì nó xoay tròn cả 30'.
Em để ô H5 ghi sẵn các công thức được điền tay thủ công, các dòng bên dưới từ H6 ->H150.000 áp dụng công thức đã ghi ở ô H5. Tương tự với ô J5, K5,...
Phòng em có nhiều nhân viên, mỗi nhân viên lại cần dùng công thức khác nhau để làm công việc mình phụ trách. Nên em muốn làm form chung như trong file để mọi người dùng cho dễ.

Mong anh chị viết code giúp em với ạ. Em xin cảm ơn.
 

File đính kèm

  • File can code VBA.xlsx
    17.2 KB · Đọc: 16
Chào bạn,
Có phải bạn muốn [Bật], [Tăt] chức năng Workbook Calculation không?

PHP:
Private Sub cmdOnOff_Click()
If cmdOnOff.Caption = "Auto-Calculating" Then
    Application.Calculation = xlCalculationAutomatic
    cmdOnOff.Caption = "Manual-Calculating"
Else
    cmdOnOff.Caption = "Auto-Calculating"
    Application.Calculation = xlCalculationManual
End If
End Sub
[/php]
 

File đính kèm

  • File can code VBA.xlsm
    27.8 KB · Đọc: 8
Upvote 0
Chào các anh chị ạ,

Em muốn nhờ anh chị viết code VBA cho file đính kèm.
Bên cty em thường có rất nhiều dòng dữ liệu trải dài khoảng >100.000 dòng, với khoảng 80 cột. Công thức thường dùng để lấy dữ liệu từ các sheet của cùng 1 file.
Khi thực hiện các công thức đơn giản như lệnh tổng hay vlookup, file cũng cực kỳ nặng và khi chạy công thức hoặc Save thì nó xoay tròn cả 30'.
Em để ô H5 ghi sẵn các công thức được điền tay thủ công, các dòng bên dưới từ H6 ->H150.000 áp dụng công thức đã ghi ở ô H5. Tương tự với ô J5, K5,...
Phòng em có nhiều nhân viên, mỗi nhân viên lại cần dùng công thức khác nhau để làm công việc mình phụ trách. Nên em muốn làm form chung như trong file để mọi người dùng cho dễ.

Mong anh chị viết code giúp em với ạ. Em xin cảm ơn.
Thử copy code này về xem coi đúng ý muốn không
Mã:
Sub Tao_Vlookup()
Dim Dic As Object, sArr(), dArr(), i As Long, j As Long, tmp As String
Set Dic = CreateObject("scripting.dictionary")
With Sheets("Sheet2")
   sArr = .Range("B4", .Range("B" & Rows.Count)).Resize(, 2).Value
End With
With Sheets("Sheet1")
   dArr = .Range("B6", .Range("B" & Rows.Count).End(3)).Resize(, 111).Value
End With
For i = 1 To UBound(sArr)
   If sArr(i, 1) <> Empty Then
      tmp = Replace(LCase(sArr(i, 1)), " ", "")
      Dic(tmp) = sArr(i, 2)
   End If
Next
For i = 1 To UBound(dArr)
   If dArr(i, 1) <> Empty Then
      tmp = Replace(LCase(dArr(i, 1)), " ", "")
      If Dic.exists(tmp) Then
         For j = 7 To UBound(dArr, 2)
            dArr(i, j) = Dic.Item(tmp)
         Next
      End If
   End If
Next
Sheets("sheet1").Range("B6").Resize(UBound(dArr), UBound(dArr, 2)) = dArr
End Sub
 
Upvote 0
Chào bạn,
Có phải bạn muốn [Bật], [Tăt] chức năng Workbook Calculation không?

PHP:
Private Sub cmdOnOff_Click()
If cmdOnOff.Caption = "Auto-Calculating" Then
    Application.Calculation = xlCalculationAutomatic
    cmdOnOff.Caption = "Manual-Calculating"
Else
    cmdOnOff.Caption = "Auto-Calculating"
    Application.Calculation = xlCalculationManual
End If
End Sub
[/php]
dạ, không phải ạ. Chức năng đó dùng nút có sẵn của excel cũng được ạ.
Ý e là e có 100 cột x 100.000 dòng = 100.000.00 (100 triệu ô) dùng công thức, nên bảng rất nặng. Cứ mỗi cột chỉ dùng 1 công thức
Em muốn e chỉ viết 100 ô có công thức ở dòng 5. Sau đó các ô bên dưới sẽ dùng chung công thức đã viết sẵn đó.
DÙng VBA thì bảng nhanh và nhẹ hơn rất nhiều ạ.
 
Upvote 0
Em chào anh Quang Hải ạ.
Em đọc code (chỉ hiểu sơ sơ 1-2% thôi ạ), e đoán chắc là a nghĩ bảng của e chỉ toàn lệnh Vlookup.
Nhưng mỗi ô H5, I5, K5...DH5 của em đều có công thức khác nhau, có ô là vlookup, có ô là sumifs,...
Ví dụ:
1. ở ô H5 có lệnh Vlookup -> mỗi khi em ấn Click thì các ô H6, H7 sẽ tự động copy công thức ở ô H5 và tính toán, sau đó trả về Value ở H6 và H7. Tương tự cho tới tận H100.000
2. ở ô I6 có lệnh If -> mỗi khi em ấn Click thì các ô I6, I7 sẽ tự động copy công thức ở ô I5 và tính toán, sau đó trả về value ở I6, I7. Tương tự cho tới I100.000
3. Cứ như vậy cho đến 100 cột tiếp theo ạ.

-> Nói chung: mong muốn của e là các ô bên dưới tự copy công thức ở ô thuộc dòng 5 (từ H5 đến DH5), chạy xong thì trả về value cho các ô đó, để bảng không nặng.
Công thức và vùng chọn đều đa dạng (trong cùng 1 file), tùy thuộc vào mục đích sử dụng của nhân viên khác nhau.
 

File đính kèm

  • File can code VBA 2.xlsx
    18.5 KB · Đọc: 9
Lần chỉnh sửa cuối:
Upvote 0
Em chào anh Quang Hải ạ.
Em đọc code (chỉ hiểu sơ sơ 1-2% thôi ạ), e đoán chắc là a nghĩ bảng của e chỉ toàn lệnh Vlookup.
Nhưng mỗi ô H5, I5, K5...DH5 của em đều có công thức khác nhau, có ô là vlookup, có ô là sumifs,...
Ví dụ:
1. ở ô H5 có lệnh Vlookup -> mỗi khi em ấn Click thì các ô H6, H7 sẽ tự động copy công thức ở ô H5 và tính toán, sau đó trả về Value ở H6 và H7. Tương tự cho tới tận H100.000
2. ở ô I6 có lệnh If -> mỗi khi em ấn Click thì các ô I6, I7 sẽ tự động copy công thức ở ô I5 và tính toán, sau đó trả về value ở I6, I7. Tương tự cho tới I100.000
3. Cứ như vậy cho đến 100 cột tiếp theo ạ.

-> Nói chung: mong muốn của e là các ô bên dưới tự copy công thức ở ô thuộc dòng 5 (từ H5 đến DH5), chạy xong thì trả về value cho các ô đó, để bảng không nặng.
Công thức và vùng chọn đều đa dạng (trong cùng 1 file), tùy thuộc vào mục đích sử dụng của nhân viên khác nhau.
Khi viết code thì mình thừa biết code sẽ không dùng được nhưng vẫn viết cho vui. Lẽ ra lúc đầu bạn nên đưa file có các công thức của từng cột.
 
Upvote 0
Khi viết code thì mình thừa biết code sẽ không dùng được nhưng vẫn viết cho vui. Lẽ ra lúc đầu bạn nên đưa file có các công thức của từng cột.
Hic, nhờ a cho e xin 1 đoạn code mới với ạ. Lúc a và a Cadafi viết code mới thấy mình diễn giải vẫn chưa đủ để người khác hiểu được mình muốn cái gì.
E cảm ơn anh ạ.
 
Upvote 0
Chào các anh chị ạ,

Em muốn nhờ anh chị viết code VBA cho file đính kèm.
Bên cty em thường có rất nhiều dòng dữ liệu trải dài khoảng >100.000 dòng, với khoảng 80 cột. Công thức thường dùng để lấy dữ liệu từ các sheet của cùng 1 file.
Khi thực hiện các công thức đơn giản như lệnh tổng hay vlookup, file cũng cực kỳ nặng và khi chạy công thức hoặc Save thì nó xoay tròn cả 30'.
Em để ô H5 ghi sẵn các công thức được điền tay thủ công, các dòng bên dưới từ H6 ->H150.000 áp dụng công thức đã ghi ở ô H5. Tương tự với ô J5, K5,...
Phòng em có nhiều nhân viên, mỗi nhân viên lại cần dùng công thức khác nhau để làm công việc mình phụ trách. Nên em muốn làm form chung như trong file để mọi người dùng cho dễ.

Mong anh chị viết code giúp em với ạ. Em xin cảm ơn.
Dùng VBA copy công thức là hạ sách, tốc độ không cải thiện được nhiều
Chạy code
Mã:
Sub ABC()
  Dim eRow&, eCol&, j&

  With Sheets("Sheet1")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow > 5 Then
      eCol = .Range("VVV4").End(xlToLeft).Column
      If eCol > 7 Then
        Application.ScreenUpdating = False
        For j = 8 To eCol
          If .Cells(5, j).HasFormula Then
            .Range(.Cells(5, j), .Cells(eRow, j)).FillDown
            .Range(.Cells(6, j), .Cells(eRow, j)).Value = Range(.Cells(6, j), .Cells(eRow, j)).Value
          End If
        Next j
        Application.ScreenUpdating = True
      End If
    End If
  End With
End Sub
 
Upvote 0
Upvote 0
Dùng VBA copy công thức là hạ sách, tốc độ không cải thiện được nhiều
Chạy code
Mã:
Sub ABC()
  Dim eRow&, eCol&, j&

  With Sheets("Sheet1")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    If eRow > 5 Then
      eCol = .Range("VVV4").End(xlToLeft).Column
      If eCol > 7 Then
        Application.ScreenUpdating = False
        For j = 8 To eCol
          If .Cells(5, j).HasFormula Then
            .Range(.Cells(5, j), .Cells(eRow, j)).FillDown
            .Range(.Cells(6, j), .Cells(eRow, j)).Value = Range(.Cells(6, j), .Cells(eRow, j)).Value
          End If
        Next j
        Application.ScreenUpdating = True
      End If
    End If
  End With
End Sub
chào a Hiếu,

Em đã cho code vào file cho thêm dữ liệu và gõ 1 số lệnh, nhưng bảng không chạy. A xem giúp e với ạ.
em cảm ơn.
 

File đính kèm

  • File can code VBA 3.xlsm
    1.7 MB · Đọc: 21
Upvote 0
chào a Hiếu,

Em đã cho code vào file cho thêm dữ liệu và gõ 1 số lệnh, nhưng bảng không chạy. A xem giúp e với ạ.
em cảm ơn.
Bạn đưa dữ liệu kiểu đó thì mọi người bó tay rồi. Không lần nào giống lần nào. Trách ai đây?
 
Upvote 0
chào a Hiếu,

Em đã cho code vào file cho thêm dữ liệu và gõ 1 số lệnh, nhưng bảng không chạy. A xem giúp e với ạ.
em cảm ơn.
File nầy khác file trước rất nhiều, lần sau nhớ gởi file sát thực tế
Mã:
Sub ABC()
  Dim eRow&, eRow2&, eCol&

  With Sheets("sheet1")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    eRow2 = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < eRow2 Then eRow = eRow2
    If eRow > 5 Then
      eCol = .Range("VVV4").End(xlToLeft).Column
      If eCol > 7 Then
        Application.ScreenUpdating = False
        .Range(.Cells(5, 8), .Cells(eRow, eCol)).FillDown
        .Range(.Cells(6, 8), .Cells(eRow, eCol)).Value = Range(.Cells(6, 8), .Cells(eRow, eCol)).Value
        Application.ScreenUpdating = True
      End If
    End If
  End With
End Sub
 
Upvote 0
Công ty này làm gì với dữ liệu khủng thế:

...Bên cty em thường có rất nhiều dòng dữ liệu trải dài khoảng >100.000 dòng, với khoảng 80 cột. Công thức thường dùng để lấy dữ liệu từ các sheet của cùng 1 file.
...
Thường có:
80 x 100000 = 8 triệu mẫu dữ liệu.
Người quản lý được đống dữ liệu này là dân rất chuyên về dữ liệu. Dân Data Mining.
 
Upvote 0
Công ty này làm gì với dữ liệu khủng thế:


Thường có:
80 x 100000 = 8 triệu mẫu dữ liệu.
Người quản lý được đống dữ liệu này là dân rất chuyên về dữ liệu. Dân Data Mining.
Dạ, cty em dùng phần mềm sản xuất Sap, dùng cho nhiều xưởng. Hàng ngày sếp giao cho rất nhiều loại báo cáo cho từng người, dữ liệu cần tổng hợp cũng nhiều. Cuối năm thì chắc đến 200.000 dòng cũng nên.
Bài đã được tự động gộp:

File nầy khác file trước rất nhiều, lần sau nhớ gởi file sát thực tế
Mã:
Sub ABC()
  Dim eRow&, eRow2&, eCol&

  With Sheets("sheet1")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    eRow2 = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < eRow2 Then eRow = eRow2
    If eRow > 5 Then
      eCol = .Range("VVV4").End(xlToLeft).Column
      If eCol > 7 Then
        Application.ScreenUpdating = False
        .Range(.Cells(5, 8), .Cells(eRow, eCol)).FillDown
        .Range(.Cells(6, 8), .Cells(eRow, eCol)).Value = Range(.Cells(6, 8), .Cells(eRow, eCol)).Value
        Application.ScreenUpdating = True
      End If
    End If
  End With
End Sub
File nầy khác file trước rất nhiều, lần sau nhớ gởi file sát thực tế
Mã:
Sub ABC()
  Dim eRow&, eRow2&, eCol&

  With Sheets("sheet1")
    eRow = .Range("B" & Rows.Count).End(xlUp).Row
    eRow2 = .Range("A" & Rows.Count).End(xlUp).Row
    If eRow < eRow2 Then eRow = eRow2
    If eRow > 5 Then
      eCol = .Range("VVV4").End(xlToLeft).Column
      If eCol > 7 Then
        Application.ScreenUpdating = False
        .Range(.Cells(5, 8), .Cells(eRow, eCol)).FillDown
        .Range(.Cells(6, 8), .Cells(eRow, eCol)).Value = Range(.Cells(6, 8), .Cells(eRow, eCol)).Value
        Application.ScreenUpdating = True
      End If
    End If
  End With
End Sub
E cảm ơn ạ. Dữ liệu của e cho vào file, chỉ copy-paste 1 ít thôi cũng 6Mb, file gốc tới 128Mb, nên e mới nghĩ ra ít ít để gửi cho đỡ nặng, gpe cũng ko cho tải lên file mấy Mb.
Cảm ơn anh đã chỉnh giúp, bây giờ e thử code đây ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ, cty em dùng phần mềm sản xuất Sap, dùng cho nhiều xưởng. Hàng ngày sếp giao cho rất nhiều loại báo cáo cho từng người, dữ liệu cần tổng hợp cũng nhiều. Cuối năm thì chắc đến 200.000 dòng cũng nên.
...
Cỡ SAP thì phải dùng dân chuyên. Tối thiểu là các phần mềm chuyên dữ liệu.
Cỡ dữ liệu của công ty bạn là phải dùng SQL Server, chứ Excel thì là chạy lết., không cách nào quản lý nổi.
Chả nhẽ có tiền chơi SAP mà lại hà tiện các mục khác?
 
Upvote 0
Cỡ SAP thì phải dùng dân chuyên. Tối thiểu là các phần mềm chuyên dữ liệu.
Cỡ dữ liệu của công ty bạn là phải dùng SQL Server, chứ Excel thì là chạy lết., không cách nào quản lý nổi.
Chả nhẽ có tiền chơi SAP mà lại hà tiện các mục khác?
Nếu biết Power query và có quyền truy cập CSDL thì cũng ngon, nhưng chả mấy ai
 
Upvote 0
Nếu biết Power query và có quyền truy cập CSDL thì cũng ngon, nhưng chả mấy ai
Chủ yếu là địa vị bạn à. Dân Excel không đủ đô để chơi với dân SAP, nói chuyện bất bình đẳng khó lắm.
Trước mắt thấy nó thảy cho một lần 8 triệu mẫu dữ liệu, bài #15 tăng lên 16 triệu. Power Query và Data Model làm cũng được nhưng vì Excel có nhiều files, cần tra ngược thì lại phải tìm files.
Mấy cái CSDL chân chính mới có thể quản lý về sau, khi cần Partition (phân bổ CSDL).

Nói thiệt, một tháng làm việc với file 80 cột một lần thì tôi còn chịu làm chứ bảo mỗi ngày tôi kéo qua kéo lại 80 cột đui mắt mất.
 
Upvote 0
Chủ yếu là địa vị bạn à. ...
Nói thiệt, một tháng làm việc với file 80 cột một lần thì tôi còn chịu làm chứ bảo mỗi ngày tôi kéo qua kéo lại 80 cột đui mắt mất.
80 cột là do phần mềm trích xuất ra (export), nếu biết cấu trúc CSDL, nếu biết xài, nếu được quyền truy cập CSDL, thì chỉ lấy ra những cột cần thiết, chừng 5, 10 -> tối đa 20 tuỳ theo loại báo cáo. Và như thế này lại càng hiếm: không chỉ hiếm về "địa vị" mà còn hiếm về "kỹ năng"
 
Upvote 0
Chủ yếu là địa vị bạn à. Dân Excel không đủ đô để chơi với dân SAP, nói chuyện bất bình đẳng khó lắm.
Trước mắt thấy nó thảy cho một lần 8 triệu mẫu dữ liệu, bài #15 tăng lên 16 triệu. Power Query và Data Model làm cũng được nhưng vì Excel có nhiều files, cần tra ngược thì lại phải tìm files.
Mấy cái CSDL chân chính mới có thể quản lý về sau, khi cần Partition (phân bổ CSDL).

Nói thiệt, một tháng làm việc với file 80 cột một lần thì tôi còn chịu làm chứ bảo mỗi ngày tôi kéo qua kéo lại 80 cột đui mắt mất.
A nói quá chuẩn luôn ạ. Tùy thuộc vào vị trí hay còn gọi là địa vị. Vị trí cao sẽ quyết định người đó đc quyền trích xuất dữ liệu như thế nào, có đc chọn loại nọ loại kia theo ý muốn, hay là nhân viên thì chỉ đc ra 1 bảng tổng bự chảng.
E vào cty chưa lâu, chỉ đc dùng bảng tổng và các file công thức excel có sẵn. Thấy chậm mà kéo công thức mệt nên e mới lên đây xin VBA. Thường thì mỗi báo cáo sẽ chọn một số cột cần dùng thôi, ko dùng cả 80 cột. Nhưng đc phân vài báo cáo thì cũng coi như hết.
Một ngày nhìn cái bảng bự đó kha khá lần, phải nhìn hoài cũng quen.e tìm cách làm như nào cho công việc nhẹ nhàng hơn thôi. Sau xem đc quyền truy cập cao hơn thì e sẽ tận dụng hết mức.
Cảm ơn các anh ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom