Nhờ sửa code tự động tính toán

Liên hệ QC

TrungChinhs

Thành viên tích cực
Tham gia
18/2/08
Bài viết
1,475
Được thích
2,468
Nghề nghiệp
Công chức
Chào các bạn! đoạn code sau (mình sưu tầm trên GPE) tự động ghi kết quả tính nhân vào cột C khi nhập dữ liệu vào cột A và cột B.

Nếu ta dán một dãy dữ liệu vào cột A và cột B thì chỉ có ô đầu dãy của cột C cho kết quả.
Mình muốn các bạn sửa giúp đoạn code này để toàn bộ cột C có kết quả theo cột A và cột B. Xin Cảm ơn !

PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error GoTo Thoat
    If Target.Column > 2 Then Exit Sub
    Cells(Target.Row, 3).Value = Cells(Target.Row, 1).Value * Cells(Target.Row, 2).Value
    Exit Sub
Thoat:
    Cells(Target.Row, 3).Value = "data error"
End Sub
 
Chỉnh sửa lần cuối bởi điều hành viên:
Đã ra được KQ ở đầu cột C , thì kéo bằng tay trong vòng 2 phút cả ngàn dòng; sao làm biếng thế.
 
Upvote 0
Đã ra được KQ ở đầu cột C , thì kéo bằng tay trong vòng 2 phút cả ngàn dòng; sao làm biếng thế.

@ dohuuthuc: Kết quả ở đầu cột C là giá trị (không phải công thức) nên không kéo được bạn ạ !

Nhờ các bạn sửa hoặc viết hộ đoạn code khác để đáp ứng yêu cầu tính toán trên. Thanks!
 
Upvote 0
Bạn nên xài SelectionChange vì nó sẽ nhanh hơn Change. Nếu muốn khi nhấn Enter thì sẽ thấy kết quả bên trên hiện ra theo ý muốn thì mình sẽ cho quá trình tính toán ở trên target.row là được. Bạn xem code có đúng ý chưa!
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range) On Error GoTo Thoat If Target.Column > 2 Or Target.Row = 1 Then Exit Sub Cells(Target.Row - 1, 3).Value = Cells(Target.Row - 1, 1).Value * Cells(Target.Row - 1, 2).Value Exit Sub Thoat: Cells(Target.Row, 3).Value = "data error" End Sub
Thân.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn nên xài SelectionChange vì nó sẽ nhanh hơn Change. Nếu muốn khi nhấn Enter thì sẽ thấy kết quả bên trên hiện ra theo ý muốn thì mình sẽ cho quá trình tính toán ở trên target.row là được. Bạn xem code có đúng ý chưa!
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo Thoat
If Target.Column > 2 Or Target.Row = 1 Then Exit Sub
Cells(Target.Row - 1, 3).Value = Cells(Target.Row - 1, 1).Value * Cells(Target.Row - 1, 2).Value
Exit Sub
Thoat:
Cells(Target.Row, 3).Value = "data error"
End Sub
Thân.

Chưa đúng ý bạn à, ý mình là mỗi khi dán dữ liệu vào cột A và cột B thì cột C sẽ tự động có kết quả (giống như là cột C có sẵn công thức chờ)
 
Upvote 0
Bạn nên xài SelectionChange vì nó sẽ nhanh hơn Change. Nếu muốn khi nhấn Enter thì sẽ thấy kết quả bên trên hiện ra theo ý muốn thì mình sẽ cho quá trình tính toán ở trên target.row là được. Bạn xem code có đúng ý chưa!
PHP:
Private Sub Worksheet_SelectionChange(ByVal Target As Range)
On Error GoTo Thoat
If Target.Column > 2 Or Target.Row = 1 Then Exit Sub
Cells(Target.Row - 1, 3).Value = Cells(Target.Row - 1, 1).Value * Cells(Target.Row - 1, 2).Value
Exit Sub
Thoat:
Cells(Target.Row, 3).Value = "data error"
End Sub
Thân.
Dùng Change được chứ!
Thử cái này xem:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  Dim Temp As Range, Clls As Range
  Set Temp = [A1].CurrentRegion
  If Target.Column < 3 Then
    For Each Clls In Temp.Offset(, 2).Resize(, 1)
      Clls = Clls.Offset(, -1) * Clls.Offset(, -2)
    Next
  End If
End Sub
 

File đính kèm

  • Nhan2Cot.xls
    18 KB · Đọc: 111
Upvote 0
TuậnLichViet Rất cảm ơn bài viết này. Tôi đã tìm rất lâu rồi nhờ Đại ca giúp đỡ nếu tôi muốn Kết quả không phải cộtA *CộtB =CộtC mà là giả sử là kết quả là cột D tôi thường phải dùng hàm = IF(C2=0%;A2*B2;A2*B2*(1-C2)) Tôi làm mãi không được rất mong Anh (Chị) giúp đỡ tôi rất cần.Cám ơn rất nhiều
Trích theo bài: Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Thoat
If Target.Column > 2 Then Exit
Sub
Cells
(Target.Row, 3).Value = Cells(Target.Row, 1).Value * Cells(Target.Row, 2).
Value
Exit
Sub
Thoat
:
Cells(Target.Row, 3).Value =
"data error"
End Sub
 
Upvote 0
TuậnLichViet Rất cảm ơn bài viết này. Tôi đã tìm rất lâu rồi nhờ Đại ca giúp đỡ nếu tôi muốn Kết quả không phải cộtA *CộtB =CộtC mà là giả sử là kết quả là cột D tôi thường phải dùng hàm = IF(C2=0%;A2*B2;A2*B2*(1-C2)) Tôi làm mãi không được rất mong Anh (Chị) giúp đỡ tôi rất cần.Cám ơn rất nhiều
Trích theo bài: Private Sub Worksheet_Change(ByVal Target As Range)
On Error GoTo Thoat
If Target.Column > 2 Then Exit
Sub
Cells
(Target.Row, 3).Value = Cells(Target.Row, 1).Value * Cells(Target.Row, 2).
Value
Exit
Sub
Thoat
:
Cells(Target.Row, 3).Value =
"data error"
End Sub
Thì điền nguyên công thức vào code:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  On Error Resume Next
  If Target.Column < 4 And Target.Row > 1 Then
    With Cells(Target.Row, 4).Resize(Target.Rows.Count)
      .Value = "= IF(RC[-1]=0,RC[-3]*RC[-2],RC[-3]*RC[-2]*(1-RC[-1]))"
      .Value = .Value
    End With
  End If
End Sub
Xem file
- Nhập liệu tại cột A hoặc B hoặc C ---> Cột D tự động ra kết quả
- Cho phép copy paste dử liệu từ nơi khác vào A, B, C
--------------------
Nói thêm: Có thể áp dụng cách này cho bài của anh TrungChinh mà không cần dùng vòng lập
 

File đính kèm

  • Test.xls
    18.5 KB · Đọc: 77
Upvote 0
Tuanlichviet cảm ơn bạn rất nhiều đã nhận được câu trả lời cho tôi hỏi thêm 1 chút dòng này có ý nghĩa gì? cho tôi cảm ơn trước nhé!
Cells(Target.Row, 3).Value = "data error"
 
Upvote 0
Tuanlichviet cảm ơn bạn rất nhiều đã nhận được câu trả lời cho tôi hỏi thêm 1 chút dòng này có ý nghĩa gì? cho tôi cảm ơn trước nhé!
Cells(Target.Row, 3).Value = "data error"
Cái đó là bài của người ta chứ không phải của bạn!
Đại khái 2 cell nhân với nhau có khi cũng sẽ bị lổi, chẳng hạn 2 cell này không phải là số ---> Vì thế người ta muốn rằng nếu có lổi thì hiện ra dòng chử "Data Error" ... Chỉ là sở thích thôi mà ---> Hỏng có nó cũng chả ăn nhằm gi
Bạn thích viết khác thì cứ tự nhiên, chẳng hạn:
Cells(Target.Row, 3).Value = "Sai roi, Ong Noi!"
Ẹc...Ẹc...
 
Upvote 0
Tuấnlichviet cảm ơn bạn giải thích cho tôi hiểu. Vỉ tôi là thành viên mới nên cũng thấy
 
Lần chỉnh sửa cuối:
Upvote 0
Tui biết rất ít về máy tính các bạn cho hỏi nếu có code trên rồi mình cho vào trong ô hay trong maco và cho vào bằng cách nào? xin cảm on
 
Upvote 0
Tui biết rất ít về máy tính các bạn cho hỏi nếu có code trên rồi mình cho vào trong ô hay trong maco và cho vào bằng cách nào? xin cảm on
--------------
Tôi củng như bạn, chỉ cố gắng mua sách (có giới thiệu trên diển đàn), tìm các bài trên diển đàn để đọc thôi. Cố lên
Chúc vui.
 
Upvote 0
Tui biết rất ít về máy tính các bạn cho hỏi nếu có code trên rồi mình cho vào trong ô hay trong maco và cho vào bằng cách nào? xin cảm on
Bạn mở File EXCEL và nhấn tổ hợp phím ALT+F11, nháp đúp vào Microsoft excel objects rồi chọn sheets muốn thực hiện công việc ; sau đó Paset vào màn hình trắng bên tay phải. Bạn cứ tự thực hiện, tìm tòi, khám phá rồi bạn sẽ hiểu. Thân
 
Upvote 0
Thì điền nguyên công thức vào code:
PHP:
Private Sub Worksheet_Change(ByVal Target As Range)
  On Error Resume Next
  If Target.Column < 4 And Target.Row > 1 Then
    With Cells(Target.Row, 4).Resize(Target.Rows.Count)
      .Value = "= IF(RC[-1]=0,RC[-3]*RC[-2],RC[-3]*RC[-2]*(1-RC[-1]))"
      .Value = .Value
    End With
  End If
End Sub
Xem file
- Nhập liệu tại cột A hoặc B hoặc C ---> Cột D tự động ra kết quả
- Cho phép copy paste dử liệu từ nơi khác vào A, B, C
--------------------
Nói thêm: Có thể áp dụng cách này cho bài của anh TrungChinh mà không cần dùng vòng lập
Cái này nếu mình xóa ở ô nhập liệu hay ở ô kết quả đi. Khi mở lại file làm thế nào cho nó tự cập nhật kết quả bạn ơi?
 
Upvote 0
Cái này nếu mình xóa ở ô nhập liệu hay ở ô kết quả đi. Khi mở lại file làm thế nào cho nó tự cập nhật kết quả bạn ơi?

Code này sử dụng dự kiện Worksheet_Change nên chẳng cần làm gì nó cũng tự cập nhật bạn à. Bạn cứ xóa hết đi và nhập dữ liệu vào thử xem.
 
Upvote 0
Mình dùng đoạn code này của bạn. Mình bắt đầu từ ô B6. Mình cho Cột A là STT, Cột B là Số Phiếu, Cột C là ngày tháng, Cột D là Tên sản phẩm, Cột E là DVT, Cột F là Số Lượng, Cột G là đơn giá, Cột I là Thành tiền. Thành tiền = Số lượng x Đơn giá. Tại sao khi mình nhập xong các cột từ A đến F, cột I nó không tự nhảy kết quả mà phải xuống dòng nhập tiiếp 1 cột của hàng mới thì cột I hàng trên mới nhảy kết quả. Cột A mình có dùng công thức ( =if(B6 = "";"";if(b7=b6);a6+1;1). Mọi người xem hộ mình nhé.
 
Upvote 0
Mình dùng đoạn code này của bạn. Mình bắt đầu từ ô B6. Mình cho Cột A là STT, Cột B là Số Phiếu, Cột C là ngày tháng, Cột D là Tên sản phẩm, Cột E là DVT, Cột F là Số Lượng, Cột G là đơn giá, Cột I là Thành tiền. Thành tiền = Số lượng x Đơn giá. Tại sao khi mình nhập xong các cột từ A đến F, cột I nó không tự nhảy kết quả mà phải xuống dòng nhập tiiếp 1 cột của hàng mới thì cột I hàng trên mới nhảy kết quả. Cột A mình có dùng công thức ( =if(B6 = "";"";if(b7=b6);a6+1;1). Mọi người xem hộ mình nhé.

Bạn gửi file lên và ghi lại yêu cầu ngay trong bảng tính ấy, chứ hỏi kiểu này thì ai biết đằng nào mà lần. Chờ bài của bạn !
 
Upvote 0
Mình dùng đoạn code này của bạn. Mình bắt đầu từ ô B6. Mình cho Cột A là STT, Cột B là Số Phiếu, Cột C là ngày tháng, Cột D là Tên sản phẩm, Cột E là DVT, Cột F là Số Lượng, Cột G là đơn giá, Cột I là Thành tiền. Thành tiền = Số lượng x Đơn giá. Tại sao khi mình nhập xong các cột từ A đến F, cột I nó không tự nhảy kết quả mà phải xuống dòng nhập tiiếp 1 cột của hàng mới thì cột I hàng trên mới nhảy kết quả. Cột A mình có dùng công thức ( =if(B6 = "";"";if(b7=b6);a6+1;1). Mọi người xem hộ mình nhé.

Bạn dùng thử code này. Tôi đã sửa lại bảng tính của bạn cho dễ nhìn.
Bạn hãy tập thói quen không để bảng tính sát biên (không nằm trên dòng 1 và cột A) vì vừa khó nhìn và nhiều khi ta cần thêm cột phía trước hoặc dòng bên trên sẽ làm hỏng công thức hoặc code của bảng tính.

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = 0
    Application.Calculation = 2
    On Error Resume Next
    [B][COLOR="red"]Set Rng = Sheets("Nhap").[b5] [/COLOR][/B]      'khi bang tinh o vi tri khac thi trong code chi can sua lai moi o nay
    EndR = Rng(65000, 2).End(3).Row + 1
    If Not Intersect(Target, Union(Rng(1, 2).Resize(EndR), Rng(1, 8).Resize(EndR))) Is Nothing Then
        Union(Rng.Resize(65000), Rng(1, 9).Resize(65000)).ClearContents
        With Rng(1, 2).Resize(EndR).SpecialCells(2)
            .Offset(, -1) = "=IF(RC[1]="""","""",COUNTA(R6C[1]:RC[1]))"                 'Stt
            .Offset(, 6).SpecialCells(2).Offset(, 1) = "=ROUND(RC[-1]*RC[-2],0)"        'Thanh tien
        End With
        Rng(1, 9) = Application.Sum(Rng(1, 9).Resize(EndR))                             'Tong cong
        Rng.Resize(EndR) = Rng.Resize(EndR).Value
        Rng(1, 9).Resize(EndR) = Rng(1, 9).Resize(EndR).Value
    End If
End Sub
 

File đính kèm

  • Kho CCDC Thang 12.rar
    45.4 KB · Đọc: 18
Upvote 0
Web KT
Back
Top Bottom