Nhờ sửa code tự động tính toán (1 người xem)

Liên hệ QC

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

TrungChinhs

Thành viên tích cực
Tham gia
18/2/08
Bài viết
1,475
Được thích
2,470
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

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

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

Upvote 0
Rất tuyệt đối với mình, còn một vấn đề nho nhỏ bạn ạ. Cái số TT của mình không phải số tăng dần, mà là số thứ tự của phiếu nhập, bạn xem điều kiện của nó và hộ mình nốt nhé. Cảm ơn bạn.
 
Upvote 0
Xin lỗi, mình lầm là số tăng dần
 
Lần chỉnh sửa cuối:
Upvote 0
Rất tuyệt đối với mình, còn một vấn đề nho nhỏ bạn ạ. Cái số TT của mình không phải số tăng dần, mà là số thứ tự của phiếu nhập, bạn xem điều kiện của nó và hộ mình nốt nhé. Cảm ơn bạn.

Vậy số phiếu nhập tại cột C của bạn là số gì ? sao bạn không gửi cái file chưa đúng đó lên để xem nó sai chỗ nào ?
Vì Tôi không hiểu số thứ tự của phiếu nhập là kiểu số gì ? nên không thể giúp bạn tiếp được ?
 
Upvote 0
Số thứ tự của phiếu là: ví dụ phiếu nhập 1 có 7 mặt hàng thì số thứ tự chỉ chạy từ 1 đến 7, đến phiếu nhập 2 có 3 mặt hàng thì số thứ tự chạy từ 1 đến 3, nói chung là nó phụ thuộc vào phiếu có bao nhiêu mặt hàng. Bạn xem ở sheet nhập hộ mình nhé. Cho mình hỏi thêm là trong file này sao mình ấn Ctrl + F để tìm kiếm thì không tìm được mặc dù có tên mặt hàng đó, trong ô Match entire cell contents lại có dấu tích, nếu bỏ dấu tích này đi thì lại tìm kiếm được bình thường. File của mình ở đây : http://www.mediafire.com/?5egu6v7n9hjlabl
 
Upvote 0
ninhtom1
Số thứ tự của phiếu là: ví dụ phiếu nhập 1 có 7 mặt hàng thì số thứ tự chỉ chạy từ 1 đến 7, đến phiếu nhập 2 có 3 mặt hàng thì số thứ tự chạy từ 1 đến 3, nói chung là nó phụ thuộc vào phiếu có bao nhiêu mặt hàng. Bạn xem ở sheet nhập hộ mình nhé. Cho mình hỏi thêm là trong file này sao mình ấn Ctrl + F để tìm kiếm thì không tìm được mặc dù có tên mặt hàng đó, trong ô Match entire cell contents lại có dấu tích, nếu bỏ dấu tích này đi thì lại tìm kiếm được bình thường. File của mình ở đây : http://www.mediafire.com/?5egu6v7n9hjlabl
1. Nhìn file của bạn thì làm sao tôi biết được đâu là phiếu 1, đâu là phiếu 2 ??? để mà chạy ???

2. Nếu coi mỗi dòng là 1 phiếu nhập và khi phiếu 1 có 7 mặt hàng thì bạn muốn STT chạy từ dòng nào đến dòng nào ? chẵng lẽ chạy sang cả dòng
của phiếu khác và nếu không đủ thì chạy luôn vào những dòng không có dữ liệu ???

3. Nếu mỗi ngày nhập là một phiếu nhập thì cột "số phiếu nhập" của bạn có ý nghĩa gì ?

4. Nếu mỗi ngày nhập là 1 phiếu nhập và không cần quan tâm đến số liệu của cột "số phiếu nhập" thì trong code bạn thay công thức STT COUNTA(R6C[1]:RC[1]) = COUNTIF(R6C[2]:RC[2],RC[2])..

5. Trong ô Match entire cell contents có dấu tích là dùng để tìm kiếm chính xác tuyệt đối (kể cả chữ hoa và ký tự trắng), nếu bỏ dấu tích thì chỉ tìm kiếm tương đối (nên mới tìm thấy). Còn tại sao bạn nhìn thấy trong ô có mặt hàng mà máy không tìm thấy khi có dấu tích trong ô Match entire cell contents bởi vì dữ liệu trong find what và ngoài bảng tính không giống nhau tuyệt đối (bạn thử xem lại file của bạn xem, dữ liệu nhập cẩu thả thế mà máy tìm thấy thì... chẳng mấy chốc nó cũng treo vì phải làm việc quá nhiều).
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn để ý hộ mình trong sheet NHAP, nếu số phiếu nhập 1 có 3 mặt hàng thì tương ứng 3 dòng thì bên cột Số TT chạy từ 1 đến 3, Phiếu nhập 2 có 2 mặt hàng tương ứng 2 dòng thì cột Số TT chỉ chạy từ 1 đến 2, phiếu nhập 3 có 1 mặt hàng thì cột Số TT chỉ có số 1. Cứ như vậy nếu Số P.Nhap có bao nhiêu mặt hàng tương ứng bấy nhiêu dòng thì bên cột Số TT chạy từ 1 và đếm cho hết số P.Nhap đấy thì thôi, số P.Nhap sau thì Số TT lại bắt đầu lại từ 1. Bạn thông cảm vì mình không biết diễn tả thế nào cho ễ hiểu cả.
 
Upvote 0
Bạn để ý hộ mình trong sheet NHAP, nếu số phiếu nhập 1 có 3 mặt hàng thì tương ứng 3 dòng thì bên cột Số TT chạy từ 1 đến 3, Phiếu nhập 2 có 2 mặt hàng tương ứng 2 dòng thì cột Số TT chỉ chạy từ 1 đến 2, phiếu nhập 3 có 1 mặt hàng thì cột Số TT chỉ có số 1. Cứ như vậy nếu Số P.Nhap có bao nhiêu mặt hàng tương ứng bấy nhiêu dòng thì bên cột Số TT chạy từ 1 và đếm cho hết số P.Nhap đấy thì thôi, số P.Nhap sau thì Số TT lại bắt đầu lại từ 1. Bạn thông cảm vì mình không biết diễn tả thế nào cho ễ hiểu cả.

Cái này thì biết rồi, khổ lắm, nói mãi. Sao Bạn không trả lời thẳng vào 3 câu hỏi (1-3) của tôi ở bài trên nhỉ ?
Để tiếp tục thì Bạn phải ghi rõ trong file đính kèm đâu là phiếu 1, 2, 3 rồi điền trực tiếp STT của từng phiếu mà bạn muốn vào cột STT để khỏi phải diễn tả nha.

Lưu ý: gửi file đính kèm. Nếu chưa biết gửi thì xem ở đây http://www.giaiphapexcel.com/forum/...i-bài-và-đính-kèm-tập-tin&p=223343#post223343
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Bạn thông cảm và đừng giận nhé vì tôi không thể đính kèm file cùng bài viết được, nó cứ báo vượt quá dung lượng cho phép trong khi đo file của tôi chỉ có mấy trăm Kb. Còn ý nghĩa số TT của phiếu nhập là để tôi kiểm tra xem mỗi phiếu có bao nhiêu mặt hàng ý mà, để đối chiếu với các đơn vị. Tôi đã ghi yêu cầu và giai thích vào trong file rồi. File của tôi ở đây: http://www.mediafire.com/?nbi4ofd9lmz2mj9
 
Upvote 0
ah tôi hiểu rồi ! giá mà bạn đưa file này ngay từ đầu...
Bạn sửa lại công thức STT như sau nha (dòng màu đỏ)

Mã:
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.ScreenUpdating = 0
    Application.Calculation = 2
    On Error Resume Next
    Set Rng = Sheets("Nhap").[b5]       '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) = [B][COLOR="red"]"=IF(RC[1]="""","""",IF(RC[1]<>R[-1]C[1],1,R[-1]C+1))" [/COLOR][/B]     '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

Chúc thành công !
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn ơi sao mình xóa hết dữ liệu đi nhập lại thì bị báo lỗi nhỉ? Bạn kiểm tra hộ mình với nhé.
 
Upvote 0
Bạn ơi sao mình xóa hết dữ liệu đi nhập lại thì bị báo lỗi nhỉ? Bạn kiểm tra hộ mình với nhé.

Tại vì trong code tôi sử dụng phương thức Specialclls (đã sửa).

Sáng nay sau khi post bài tôi mới nghĩ ra với cách nhập dữ liệu của bạn trong cột số phiếu nhập thì code sẽ không đúng trong trường hợp phiếu liền sau có số lượng mặt hàng bằng phiếu liền trước vd: phiếu 3 có 2 mặt hàng và phiếu 4 cũng có 2 mặt hàng thì máy sẽ hiểu phiếu 3 và phiếu 4 là một phiếu. Chính vì lý do này nên các bài trước tôi mới nói là không hiểu ý bạn.

Nếu bạn vẫn muốn giữ cách nhập dữ liệu như cũ thì tôi xin chào thua.

Nếu bạn thay đổi cách nhập là chỉ đánh số mặt hàng vào dòng đầu của phiếu, các dòng tiếp theo (nếu có) thì bỏ trống như ví dụ trong file đính kèm (mục đích là để phân biệt đâu là phiếu trước, đâu là phiếu sau) thì code sửa lại như sau:
Mã:
Private Sub Worksheet_Change(ByVal Target As Range) 
    Application.ScreenUpdating = 0
    Application.Calculation = 2
    On Error Resume Next
    Set Rng = Sheets("Nhap").[b5]       'khi bang tinh o vi tri khac thi trong code chi can sua lai moi o nay
    EndR = Rng(65000, 3).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, 3).Resize(EndR)
            .Offset(, -2) = "=IF(RC[2]="""","""",IF(RC[1]>0,1,R[-1]C+1))"     'Stt
            .Offset(, 5).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

Lần chỉnh sửa cuối:
Upvote 0
Xin cảm ơn bạn đã giúp đỡ tôi thời gian qua. Tôi phải nhập như thế vì còn phải lọc phiếu để in nên vẫn phải dùng cách nhập đó thôi.
 
Upvote 0
Bạn TrungChinh ơi, mình có việc cần nhờ bạn giúp đỡ. Nếu bạn không phiền thì bỏ ra chút ít thời gian và công sức giúp mình nhé. Yêu cầu mình gửi trong file đính kèm trong sheet SOKHO ấy nhé, có thể dùng hàm cũng được, có thể dùng VBA cũng được. File của mình đây: http://www.mediafire.com/?squz8gk3uu0x0ye
 
Upvote 0
Cảm ơn bạn, sao ô B8 mình click chuột chọn Mã VT thì nó không chạy nhỉ. Nó chỉ chạy khi mình gõ trực tiếp Mã VT và ô B8. Với lại ô diễn giải đó là mình lấy giá trị là: nếu là phiếu nhập thì là ai nhập, nếu là phiếu xuất thì xuất cho ai. Bạn lại lấy tên vật tư cho vào đó. Có thể định dạng ngày tháng theo kiểu dd/mm/yyyy được không. Bạn xem giúp mình nhé. Cảm ơn bạn nhiều
 
Upvote 0
(1) Sao ô B8 mình click chuột chọn Mã VT thì nó không chạy nhỉ. Nó chỉ chạy khi mình gõ trực tiếp Mã VT và ô B8. (2) Với lại ô diễn giải đó là mình lấy giá trị là: nếu là phiếu nhập thì là ai nhập, nếu là phiếu xuất thì xuất cho ai. Bạn lại lấy tên vật tư cho vào đó.
(3) Có thể định dạng ngày tháng theo kiểu dd/mm/yyyy được không. Bạn xem giúp mình nhé.

(1) Mình bấm chọn lúc được lúc không; Lí do là bạn trộn ô đó với ô dưới nó, nhưng mục đích chả để làm gì cả, mà chỉ tổ gây rắc rối thêm.

(2) Xem dòng lệnh 214

(3) Xem dòng lệnh 224 & dòng dưới nó. (Tại trang tính 'Nhap' chưa định dạng lại, nhường f ần đó để bạn thử sức xem sao)

PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
 If Not Intersect(Target, [B8]) Is Nothing Then
    Dim Sh As Worksheet, Rng As Range, sRng As Range, Cls As Range
    Dim MyAdd As String, ShName As String, jJ As Byte
       
    [B16].Resize(95, 7).ClearContents:              [b15] = "GPE.COM"
    Columns("IT:IT").ClearContents:                 [it1].Value = "Ngay"
1 'Tao Danh Sach Ngay Duy Nhat:'
    For jJ = 1 To 2
        MyAdd = Choose(jJ, "Nhap", "Xuat")
        Set Sh = ThisWorkbook.Worksheets(MyAdd)
        Set Rng = Sh.Range(Sh.Cells(6, "D"), Sh.[d65500].End(xlUp))
        Rng.NumberFormat = "MM/dd/yyyy"
        Rng.Copy Destination:=[it65500].End(xlUp).Offset(1)
    Next jJ
    Columns("IT:IT").AdvancedFilter Action:=xlFilterCopy, CopyToRange:=[IU1], Unique:=True
2 'Chep Du Lieu Theo Trinh Tu Ngay Thang:'
    For Each Cls In Range([iU2], [iU2].End(xlDown))
        For jJ = 1 To 2
            ShName = Choose(jJ, "Nhap", "Xuat")
            Set Sh = ThisWorkbook.Worksheets(ShName)
            Set Rng = Sh.Range(Sh.[d5], Sh.[d65500].End(xlUp))
            Set sRng = Rng.Find(Cls.Value, , xlFormulas, xlWhole)
            If Not sRng Is Nothing Then
                MyAdd = sRng.Address
                Do
                    If sRng.Offset(, 1).Value = [B8].Value Then
                        With [b111].End(xlUp).Offset(1)
                            .Value = sRng.Value
                            .Offset(, jJ).Value = sRng.Offset(, -1).Value
214                         .Offset(, 3).Value = sRng.Offset(, 11 - jJ).Value  '<=}'
                            .Offset(, 4).Value = "Ngay " & IIf(jJ = 1, "N", "X")
                            .Offset(, 4 + jJ).Value = sRng.Offset(, 4).Value
                        End With
                    End If
                    Set sRng = Rng.FindNext(sRng)
                Loop While Not sRng Is Nothing And sRng.Address <> MyAdd
            End If
        Next jJ
    Next Cls
224 Range("B16:b111").NumberFormat = "dd/MM/yyyy"
   Rng.NumberFormat = "dd/MM/yyyy"
 End If
End Sub
 
Upvote 0
Cảm ơn các bạn đã giúp đỡ mình nhiệt tình. File chạy tốt, tuy nhiên còn 1 số vấn đề nho nhỏ mình nhờ các bạn giúp đỡ tiếp. Vì không biết bình bày thế nào nên mình gửi 2 yêu cầu trợ giúp theo 2 file vậy.
2 file của mình ở đây: http://www.mediafire.com/?d1kh75e77nx7e88
Cảm ơn mọi người.
 
Upvote 0
Chỉ thực hiện được iêu cầu 2 thôi, còn (1) không đọc được

File chạy tốt, tuy nhiên còn 1 số vấn đề nho nhỏ mình nhờ các bạn giúp đỡ tiếp. Vì không biết trình bày thế nào nên mình gửi 2 yêu cầu trợ giúp theo 2 file vậy.
2 file của mình ở đây: http://www.mediafire.com/?d1kh75e77nx7e88
Cảm ơn mọi người.
(2) bạn thêm câu lệnh ni vố trước dòng có đánh số 2:
PHP:
    Columns("IU:IU").Sort Key1:=[IU2], Order1:=xlAscending, Header:=xlGuess
2 'Chep Du Lieu Theo Trinh Tu Ngay Thang:'
Mà sao bạn không đưa file lên diễn đàn luôn đi nhỉ?
 
Upvote 0
Bạn à mình đã viết rõ yêu cầu vào file rồi, bạn xem lại hộ mình với nhé. Mình không gửi file lên diễn đàn được, đính kèm nó toàn báo lỗi là quá dung lượng trong khi đó file nén lại chưa đến 1Mb. Bạn xem giúp mình nhé. File của mình đây: http://www.mediafire.com/?hjyl7v2060gyffz
 
Upvote 0
Mở file của #39 thì không thấy gì;
File iêu cầu (1) thì chữ ả rập thì là không đọc được;

Không đính kèm được file: có thể nhắn BQT diễn đàn nhờ giúp đỡ & thân ái!
 
Upvote 0
Mình vẫn dọc được mà nhỉ, mình gửi lại file sau khi đã nén cho nhẹ vậy : http://www.mediafire.com/?ruci89623c2byfm

Yêu cầu của bạn tuy phức tạp nhưng không phải là không làm được. Tuy vậy với cơ sở dữ liệu của bạn như vầy thì e rằng lại phải chào thua.

Vd: áo sơ mi và đàn ghi ta tại sao lại chung mã số C87 ?

Chẳng khác gì chuyện AliBaBa và 40 tên cướp (tất cả các nhà đều đánh dấu giống nhau nên bọn cướp chẳng biết nhà nào là nhà AliBaBa để giết)...Ẹc...Ec...
 
Upvote 0
Tại vì sao nhiều thứ nhập xuất thẳng mình để mã là C87 là vì vật tư chính của mình đã hơn 1000 mục rồi. Hàng tháng vẫn nhập, xuất và tồn kho. Còn mã C87 là để cho các vật tư nhập vào rồi xuất luôn không để tồn kho. Trong tháng thì những vật tư nhập xuất thẳng rất nhiều có thể lên đến hơn 1000 loại, nếu mà cấp cho mỗi loại 1 mã vật tư thì em lại phải in thêm 1000 thẻ kho nhập xuất thẳng hàng tháng, mỗi thẻ chỉ có 2 dòng nhập vào và xuất ra. Có bạn nào giúp mình vấn đề này với.
 
Upvote 0
@ To ninhTom1: không biết bạn có khó chịu khi mình góp ý không, mình "biết hơn" bạn tý chút (do bạn hỏi mình nên mình mới nói thế, cách đây 2 năm mình còn kém xa bạn bây giờ) nên mới góp ý với bạn như vậy. Bất luận công việc của bạn như thế nào nếu bạn viết mà Máy tính hiểu thì chắc chắn điều đó là đúng còn không thì chỉ là tự mình nói - tự mình nghe - tự mình hiểu mà thôi. Tôi hơi buồn khi nghe bạn nói do công việc của bạn như vậy nên bạn phải làm như vậy! Hôm nay tổng kết cơ quan nên hơi phê. Rượu vào lời ra có gì không phải thông cảm nha !
 
Lần chỉnh sửa cuối:
Upvote 0
Mình cảm ơn mọi người đã giúp đỡ và chỉ bảo mình tận tình, mình đã làm được phần mã nhập xuất thẳng rồi. Có vấn đề gì không phải mong mọi người bỏ qua cho mình nhé. Xin chân thành cảm ơn tất cả. Chúc anh chị em trên GPE 1 năm mới mạnh khỏe, thành đạt, hạnh phúc.
 
Upvote 0

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

Back
Top Bottom