VBA nhập dữ liệu tự động tạo công thức và paste giá trị (1 người xem)

  • Thread starter Thread starter Srosro
  • Ngày gửi Ngày gửi
Liên hệ QC

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

Srosro

Thành viên mới
Tham gia
10/7/18
Bài viết
15
Được thích
9
Trong lúc làm việc về nhập liệu.
Em coa chút mong muốn như sau:

VD em nhập liệu ở cột A.
Nhập từ A1 đến A100. Sau đó em làm hàm ở B1 đến B100. Sau đó copy paste giá trị.
Thì cách nhanh nhất mà em biết hiện tại là nhập liệu ở cột A như bình thường. xong tạo 1 modul trong VBA. và chạy để nó làm thao tác còn lị trong cột B.

Tuy nhiên em vẫn thấy nó chậm.
Các anh có thể giúp em.

Khi em nhập liệu ở ô A1. và không phải làm gì cả. thì ô B1 sẽ tự điền công thức và tự copy paste giá trị tại ô B1 luôn.
Sau đó em nhập liệu vào ô A2. thì ô B2 tự động điền công thức và paste giá trị trong ô B2 luôn.


Giống như cái kiểu tạo sự kiện trong Useform đấy ạ.

Bởi em nghĩ khi có kiểu như vậy. bọn em nhập liệu đối với những file nặng ý. nó sẽ rất là nhẹ. và nhanh.

Em cảm ơn
 
Chắc bạn cũng biết là cái gì tự động hóa thì đều được lập trình trước,và nếu muốn nó chạy thì cần có điều kiện để giải định hết tất cả các trước hợp? Bạn nếu ra cái ý tương rồi đó còn thiếu đôi ba phần về điều kiện và dữ liệu để test .tới đây chắc bạn hiểu vì sao hai bác trên bảo không cần làm gì rồi đúng không?
 
Trong lúc làm việc về nhập liệu.
Em coa chút mong muốn như sau:

VD em nhập liệu ở cột A.
Nhập từ A1 đến A100. Sau đó em làm hàm ở B1 đến B100. Sau đó copy paste giá trị.
Thì cách nhanh nhất mà em biết hiện tại là nhập liệu ở cột A như bình thường. xong tạo 1 modul trong VBA. và chạy để nó làm thao tác còn lị trong cột B.

Tuy nhiên em vẫn thấy nó chậm.
Các anh có thể giúp em.

Khi em nhập liệu ở ô A1. và không phải làm gì cả. thì ô B1 sẽ tự điền công thức và tự copy paste giá trị tại ô B1 luôn.
Sau đó em nhập liệu vào ô A2. thì ô B2 tự động điền công thức và paste giá trị trong ô B2 luôn.


Giống như cái kiểu tạo sự kiện trong Useform đấy ạ.

Bởi em nghĩ khi có kiểu như vậy. bọn em nhập liệu đối với những file nặng ý. nó sẽ rất là nhẹ. và nhanh.

Em cảm ơn
Cái này thì các tiền bối thừa sức làm trong 1 nốt nhạc. Hay đưa File lên để mọi người biết đúng ý bạn muốn không nhé
 
ây gu..... ý em là em muốn học ý.
ko ngồi máy thế là bị troll đây.
hì.
Công thức thì là công thức j cũng được ạ.
Còn em muốn hỏi tính ứng dụng cơ.
Vì bên em các bạn nhập dữ liệu thì vô vàn kiểu
Công thức cũng biến đổi theo mà. huhu.
Các bác lại lỡ troll em.

Cái em muốn là có cái kiểu như em nêu ý tưởng liệu có làm được ko ấy ạ.
Còn phải có file cụ thể thì khi em ngồi máy tính em sẽ bổ sung ạ.
Các bác troll em. hx. Cảm ơn các bác đã đóng góp ạ
 
Cái em muốn là có cái kiểu như em nêu ý tưởng liệu có làm được ko ấy
Câu trả lời là có
Bạn nêu ý tưởng cho mọi người Mình cũng nêu ý tưởng cho bạn.
1.dùng sự kiện trong sheet
2.cho công thức muốn tính + địa chỉ cột vào ô nào đó trong sheets .rồi dùng sự kiện thay đổi chạy vòng lặp gán đến dòng cuối
* chú : nó còn rườm ra hơn bạn dùng công thức vào một ô rồi kéo cho cả cột
 
Câu trả lời là có
Bạn nêu ý tưởng cho mọi người Mình cũng nêu ý tưởng cho bạn.
1.dùng sự kiện trong sheet
2.cho công thức muốn tính + địa chỉ cột vào ô nào đó trong sheets .rồi dùng sự kiện thay đổi chạy vòng lặp gán đến dòng cuối
* chú : nó còn rườm ra hơn bạn dùng công thức vào một ô rồi kéo cho cả cột
Đây ạ. Thế bác làm mẫu giúp em. Em dốt cái này thật.
phạm vi khoảng A1 ĐẾN a200 ạ
Bài đã được tự động gộp:

chú : nó còn rườm ra hơn bạn dùng công thức vào một ô rồi kéo cho cả
Em nghĩ nó cũng rườm rà. nhưng mà để làm 1 ô rồi kéo cho cả. file nó rất là nặng. Nhiều khi bên em các bạn ý đang làm thì đơ máy. chán lắm. mất time và mất dữ liệu. ảnh hưởng text time. hx.
 

File đính kèm

Đây ạ. Thế bác làm mẫu giúp em. Em dốt cái này thật.
phạm vi khoảng A1 ĐẾN a200 ạ
Bài đã được tự động gộp:


Em nghĩ nó cũng rườm rà. nhưng mà để làm 1 ô rồi kéo cho cả. file nó rất là nặng. Nhiều khi bên em các bạn ý đang làm thì đơ máy. chán lắm. mất time và mất dữ liệu. ảnh hưởng text time. hx.
Chỉ từ A1 đến A200 thì chưa cần tới VBA đâu - Nhận lại File làm theo hướng dẫn trong File xem đúng ý chưa nhé
 

File đính kèm

Mã:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim R As String, Rng As Range, Lr As Long
Set Rng = Sheet1.Range("A1:A200")
If Not Intersect(Target, Rng) Is Nothing Then
        Lr = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
        Sheet1.Range("B" & Lr).Formula = "=VLOOKUP(" & "A" & Lr & ",Trang_tính1!A:B" & ",2,0)"
        Sheet1.Range("B" & Lr).Value = Sheet1.Range("B" & Lr).Value
End If
End Sub
Chủ thớt thích VBA mà,nhưng như tôi nói là nó sẽ rườm ra khi gán công thức,Bạn cũng có thể dùng vba gán công thức bằng Application.WorksheetFunction nhưng như tôi đã nói đã dùng vba thì dùng vba chứ cần gì công thức nữa .khi bạn bắn xong mã QR cứ cho là 10000 dòng đi nữa,dùng mảng duyệt để lấy kết quả tương ứng còn nhanh gấp mấy lần gán công thức vào cells như thế này
 
Lần chỉnh sửa cuối:
Chỉ từ A1 đến A200 thì chưa cần tới VBA đâu - Nhận lại File làm theo hướng dẫn trong File xem đúng ý chưa nhé
Bác ơi. em vd thui. chứ file trong công ty em nó ko đc mang ra ngoài. nó dùng mạng nội bộ mà. em muốn xem qua công thức rồi tự ứng dụng ạ. chứ 20.000 dòng còn chưa thành vấn đề huống chi là 200 bác ạ. hx.
Bác ứ hiểu ý em. huhu
Bài đã được tự động gộp:

Mã:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim R As String, Rng As Range, Lr As Long
Set Rng = Sheet1.Range("A1:A200")
If Not Intersect(Target, Rng) Is Nothing Then
        Lr = Sheet1.Range("A" & Rows.Count).End(xlUp).Row
        Sheet1.Range("B" & Lr).Formula = "=VLOOKUP(" & "A" & Lr & ",Trang_tính1!A: B" & ",2,0)"
        Sheet1.Range("B" & Lr).Value = Sheet1.Range("B" & Lr).Value
End If
End Sub
Chủ thớt thích VBA mà,nhưng như tôi nói là nó sẽ rườm ra khi gán công thức,Bạn cũng có thể dùng vba gán công thức bằng Application.WorksheetFunction nhưng như tôi đã nói đã dùng vba thì dùng vba chứ cần gì công thức nữa .khi bạn bắn xong mã QR cứ cho là 10000 dòng đi nữa,dùng mảng duyệt để lấy kết quả tương ứng còn nhanh gấp mấy lần gán công thức vào cells như thế này
À. Em bắt đầu hiểu ý bác rồi. Cũng rườm rà thật
Bài đã được tự động gộp:

Chỉ từ A1 đến A200 thì chưa cần tới VBA đâu - Nhận lại File làm theo hướng dẫn trong File xem đúng ý chưa nhé
File của bác trước em từng làm rồi ạ. gán cho nó Table. Sợ nặng nên cũng đã tắt tự động tính toán. xong báo các bác ý nhấn F9 để lấy kết quả. tuy nhiên. như thế file vẫn chứa công thức. tức là nó vẫn phải làm việc nhiều. suy ra trễ và làm lâu.
Nhiều bác bên em các bác ý còn bấm nhầm làm hỏng file. xong loạn hết file lên. công thức cũng bị sai theo ạ.
Nên em cũng muốn làm VBA. các bác ấy sẽ ko động đến công thức nữa. giảm việc làm sai xuống
 
Lần chỉnh sửa cuối:
Mã:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim R As String, Rng As Range, Lr As Long
Set Rng = Sheet1.Range("A1:A200")
If Intersect(Target, Rng) Is Nothing Then Exit Sub
        Application.EnableEvents = False
        R = Mid(Replace(Target.Address, "$", ""), 2, Len(Target.Address) - 1)
        Sheet1.Range("B" & R).Formula = "=IFERROR(VLOOKUP(A" & R & ",Trang_tính1!A:B,2,0)" & "," & """"")"
        Sheet1.Range("B" & R).Value = Sheet1.Range("B" & R).Value
        Application.EnableEvents = True
End Sub
cod bài #11 như bạn mô tả là cứ bắn lần lượt nên nó cứ phang dòng cuối.còn code này thì ô nào cũng được miễn là trong cột A thay đổi.Làm cho bạn biết nó khá phiền thôi.còn nếu mà muốn nhanh thì tốt hơn hết bạn giả lập một file rồi đưa lên mọi người xem thôi.nếu chỉ là dựa vào ID lấy tên thì bắn hết 1 lượt lấy ID sau đó là chạy vòng lặp lấy dữ liệu từ sheets 2 qua.nhanh hơn nhiều so với bạn gán công thức
 

File đính kèm

Lần chỉnh sửa cuối:

Góp ý cho bạn:
1/ Nội quy có quy định "Tất cả các bài viết bằng tiếng Việt cần viết có dấu đầy đủ, tránh phạm lỗi chính tả và làm mất đi sự trong sáng của tiếng Việt"
2/ Bạn nên tiếng Việt cần viết có dấu đầy đủ, có nghĩa là trong bài viết nên viết chữ cho đầy đủ, rỏ nghĩa và không sử dụng tiếng Tây, tiếng u, chứ nên lười biếng viết tắc thế này: vd, ko đc, hx, text time, hx , troll, gu..v..v.......Nếu ai cũng làm biếng thì chắc không ai rảnh để viết mốt mớ code cho bạn.
3/ Đọc lại nội quy để hiểu:

View attachment 250235
Dạ. Vâng ạ. em biết rồi ạ
 
Mã:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim R As String, Rng As Range, Lr As Long
Set Rng = Sheet1.Range("A1:A200")
If Intersect(Target, Rng) Is Nothing Then Exit Sub
        Application.EnableEvents = False
        R = Mid(Replace(Target.Address, "$", ""), 2, Len(Target.Address) - 1)
        Sheet1.Range("B" & R).Formula = "=IFERROR(VLOOKUP(A" & R & ",Trang_tính1!A: B,2,0)" & "," & """"")"
        Sheet1.Range("B" & R).Value = Sheet1.Range("B" & R).Value
        Application.EnableEvents = True
End Sub
cod bài #11 như bạn mô tả là cứ bắn lần lượt nên nó cứ phang dòng cuối.còn code này thì ô nào cũng được miễn là trong cột A thay đổi.Làm cho bạn biết nó khá phiền thôi.còn nếu mà muốn nhanh thì tốt hơn hết bạn giả lập một file rồi đưa lên mọi người xem thôi.nếu chỉ là dựa vào ID lấy tên thì bắn hết 1 lượt lấy ID sau đó là chạy vòng lặp lấy dữ liệu từ sheets 2 qua.nhanh hơn nhiều so với bạn gán công thức
Kết quả đã như mong muốn khi gõ vào 1 dòng ở cột A và chỉ dòng đó thay đổi ở cột B. Rất tuyệt rồi ạ.
Nhưng Em muốn code khắc phục thêm 1 điều kiện nữa. Nếu em copy 1 vùng mã như hình ở dưới và dán vào ô A3 với 3 dòng chẳng hạn. Thì tương ứng với 3 dòng đó ở cột A thì 3 dòng đó ở cột B cũng được cập nhật lại công thức. Hiện tại khi dán 1 vùng ở cột A thì nó ko hiện giá trị ở cột B mà bị lỗi chuyển thành 0 hết ạ. Mong Anh xem giúp Em. Cảm ơn Anh nhiều!
1606630455597.png
 

File đính kèm

Công thức cùng 1 cột là giống nhau hay khác nhau. Nếu giống nhau thì đưa về bài toán nhập công thức tại dòng 1, các dòng tiếp theo sẽ tự động điền công thức và paste value theo công thức tại dòng 1
 
Công thức cùng 1 cột là giống nhau hay khác nhau. Nếu giống nhau thì đưa về bài toán nhập công thức tại dòng 1, các dòng tiếp theo sẽ tự động điền công thức và paste value theo công thức tại dòng 1
Công thức giống nhau bác ah. Để tránh việc tính toán quá nhiều dòng dẫn đến file bị chậm. Nên Em muốn chỉ dòng nào có tác động ở cột A như bác chủ thớt đã nêu thì dòng đó ở cột B mới tính. Hiện tại theo code của bác Cu Tồ thì đã như mong muốn rồi ạ. Chỉ mỗi một chỗ là nếu em copy 1 vùng gồm 3 dòng mã ID rồi dán vào ô A3 thì A3:A5 có sự tác động vào ô. Thì công thức ở B3:B5 sẽ được thực thi. Nhưng hiện tại nó lại trả về 0 cho các ô từ B3:B5 Bác ạ.
 
Sheet1.Range("B" & Lr).Formula = "=VLOOKUP(" & "A" & Lr & ",Trang_tính1!A:B" & ",2,0)"
Nãy mình không để ý ở đoạn code đầu trong câu công thức này đoạn 【Trang_tính1!A: B】 giữa A và B có khoảng trắng mà máy bạn vẫn chạy được à? Mình dùng WPS nên mấy lỗi này nó không báo nãy thử trên 2016 mới biết là nó bị thừa dấu cách chỗ này mà bạn vẫn chạy được :eek:
 
Nãy mình không để ý ở đoạn code đầu trong câu công thức này đoạn 【Trang_tính1!A: B】 giữa A và B có khoảng trắng mà máy bạn vẫn chạy được à? Mình dùng WPS nên mấy lỗi này nó không báo nãy thử trên 2016 mới biết là nó bị thừa dấu cách chỗ này mà bạn vẫn chạy được :eek:
Ở bài 16 File Em tải lên là có thay chỗ công thức bằng name rồi A ạ. ="=HoTen" nên code chạy đc ạ
 
À hèn chi,thắc mắc sao không thấy báo lỗi hay vậy :D
 
Mã:
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
Dim R As String, Rng As Range, Lr As Long
Set Rng = Sheet1.Range("A1:A200")
If Intersect(Target, Rng) Is Nothing Then Exit Sub
        Application.EnableEvents = False
        R = Mid(Replace(Target.Address, "$", ""), 2, Len(Target.Address) - 1)
        Sheet1.Range("B" & R).Formula = "=IFERROR(VLOOKUP(A" & R & ",Trang_tính1!A:B,2,0)" & "," & """"")"
        Sheet1.Range("B" & R).Value = Sheet1.Range("B" & R).Value
        Application.EnableEvents = True
End Sub
cod bài #11 như bạn mô tả là cứ bắn lần lượt nên nó cứ phang dòng cuối.còn code này thì ô nào cũng được miễn là trong cột A thay đổi.Làm cho bạn biết nó khá phiền thôi.còn nếu mà muốn nhanh thì tốt hơn hết bạn giả lập một file rồi đưa lên mọi người xem thôi.nếu chỉ là dựa vào ID lấy tên thì bắn hết 1 lượt lấy ID sau đó là chạy vòng lặp lấy dữ liệu từ sheets 2 qua.nhanh hơn nhiều so với bạn gán công thức


Nếu Em bổ sung thêm Name cho các cột Bộ phận (cột D), Chức Vụ (cột E). Em sửa code đoạn điền Name vào ô cho các cột như sau:

Rng.Offset(0, 1).Formula = "=HoTen"
Rng.Offset(0, 3).Formula = "=BoPhan"
Rng.Offset(0, 5).Formula = "=ChucVu"
Rng.Offset(0, 1).Value = Rng.Offset(0, 1).Value
Rng.Offset(0, 3).Value = Rng.Offset(0, 3).Value
Rng.Offset(0, 5).Value = Rng.Offset(0, 5).Value

Với trường hợp điền thêm Name cho các cột Em sửa như vậy có được không Anh? Cảm ơn Anh nhiều!
 
Rng.Offset(0, 1).Formula = "=HoTen"
Rng.Offset(0, 3).Formula = "=BoPhan"
Rng.Offset(0, 5).Formula = "=ChucVu"
Chỗ này nếu bạn thêm như thế này đâu có được nó sẽ chỉ lấy một giá trị thôi.còn thêm như thế nào phải xem file mới biết được bạn nha
 

File đính kèm

Name bạn có công thức nó ra đúng kết quả rồi
View attachment 250464
Như file Em gửi các bài trước thì với điều kiện với các vùng ở cột A được kích hoạt. Thì sự kiện Worksheet_Change sẽ được thực hiện điền Name và chuyển sang Value.
Em muốn nhờ Anh thêm trường hợp. Nếu các vùng của cột A, C, E được kích hoạt. Thì sự kiện Worksheet_Change sẽ được thực hiện điền Name và chuyển sang Value.
Em có mày mò sửa code nhưng đang chưa được (do liên quan đến Offset tọa độ cột. Nên khi em bấm vào cột C và E thì kết quả chạy sẽ bị sai tọa độ. Offset hình như chỉ để cột theo số cột, ko để được theo tên cột. Vậy liệu có đưa Range vào chỗ Offset để nó có tên cột thì khả năng, Name sẽ được điền đúng cột). Mong Anh xem giúp Em. Cảm ơn Anh!
1606930558202.png
Mã:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim R As Long
Dim Rng As Range, WorkRng As Range

Set WorkRng = Intersect(Application.ActiveSheet.Range("A1:A200, C1:C200, E1:E200"), Target)
If WorkRng Is Nothing Then Exit Sub
    Application.EnableEvents = False
        For Each Rng In WorkRng
            If Not VBA.IsEmpty(Rng.Value) Then
                R = Mid(Replace(Rng.Address, "$", ""), 2, Len(Target.Address) - 1)
                Rng.Offset(0, 1).Formula = "=HoTen"
                Rng.Offset(0, 3).Formula = "=BoPhan"
                Rng.Offset(0, 5).Formula = "=ChucVu"
                Rng.Offset(0, 1).Value = Rng.Offset(0, 1).Value
                Rng.Offset(0, 3).Value = Rng.Offset(0, 3).Value
                Rng.Offset(0, 5).Value = Rng.Offset(0, 5).Value
            Else
                Rng.Offset(0, 1).ClearContents
                Rng.Offset(0, 3).ClearContents
                Rng.Offset(0, 5).ClearContents
            End If
        Next
    Application.EnableEvents = True
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
vùng của cột A, C, E được kích hoạt
Cột C và E của bạn có ý nghĩa gì?nếu như bạn điền ở cột A rồi thì cột B D F cũng tự động điền rồi cơ mà? vậy nếu bạn điền cột C E nhưng cột A (ID) rỗng thì code dưa vào cái gì để lấy dữ liệu? Tôt hơn hết bạn đưa dữ liệu quẩn của bạn lên thì nhanh hơn
Bài đã được tự động gộp:

tối ưu khi dữ liệu nhiều
Không biết cấu trúc file dữ liệu gốc của bạn như thế nào nhưng nếu nó chuẩn và nhiều thì lấy dữ liệu duyệt mảng nhanh hơn là xử lý trên bảng tính
 
Lần chỉnh sửa cuối:
Cột C và E của bạn có ý nghĩa gì?nếu như bạn điền ở cột A rồi thì cột B D F cũng tự động điền rồi cơ mà? vậy nếu bạn điền cột C E nhưng cột A (ID) rỗng thì code dưa vào cái gì để lấy dữ liệu? Tôt hơn hết bạn đưa dữ liệu quẩn của bạn lên thì nhanh hơn
Bài đã được tự động gộp:


Không biết cấu trúc file dữ liệu gốc của bạn như thế nào nhưng nếu nó chuẩn và nhiều thì lấy dữ liệu duyệt mảng nhanh hơn là xử lý trên bảng tính

Dạ Em xin gửi trường hợp dữ liệu như hình dưới đây (với các cột màu vàng là dữ liệu nhập tay).
Trường hợp khi nhập vào cột A thì dữ liệu chạy cho cột B, D, F đều được cập nhật. Nhưng nếu thay đổi Trị giá ở cột C hoặc tỷ lệ bảo hiểm ở cột E thì code lại không được kích hoạt để cập nhật lại dữ liệu. Nên Em muốn khi tác động vào các cột A, C, E (cột màu vàng). Thì code sẽ được kích hoạt lại, để update dữ liệu mới.
Em rất muốn được sửa trên đoạn code đang làm này. Mong Anh giúp đỡ. Cảm ơn Anh!

1606932860576.png
1606932228038.png
 

File đính kèm

Nếu cố định cột như vậy thì gán kết quả bạn không dùng offset nữa mà thay vào đó là
Mã:
R = Rng.Row
để lấy giá trị dòng
và dùng .range để gán dữ liệu.kiểu như vậy
Mã:
ActiveSheet.Range("B" & R).Formula = "=HoTen"
 
Nếu cố định cột như vậy thì gán kết quả bạn không dùng offset nữa mà thay vào đó là
Mã:
R = Rng.Row
để lấy giá trị dòng
và dùng .range để gán dữ liệu.kiểu như vậy
Mã:
ActiveSheet.Range("B" & R).Formula = "=HoTen"
Code chạy đúng như mong đợi rồi Anh ạ. Em cảm ơn Anh nhiều lắm. Anh ngủ sớm nhé. Chúc Anh ngủ ngon!
 

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

Back
Top Bottom