VBA nhập dữ liệu tự động tạo công thức và paste giá trị

Liên hệ QC
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

  • Phải làm gì rồi .xlsm
    19 KB · Đọc: 12
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

  • Phải làm gì rồi .xlsm
    19.2 KB · Đọc: 10
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

  • Phải làm gì rồi .xlsm
    19.2 KB · Đọc: 11
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!
 
Web KT
Back
Top Bottom