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:
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

  • Kho CCDC Thang 12.rar
    44.2 KB · Đọc: 10
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

  • Kho CCDC Thang 12 - sua.rar
    46 KB · Đọc: 14
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

File đính kèm

  • gpeVatTu.rar
    424.2 KB · Đọc: 22
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
Web KT
Back
Top Bottom