Cần giúp viết công thức lấy ô ở cột "Thu nhập" trừ đi ô cùng dòng ở cột "Chi phí" (2 người xem)

Liên hệ QC

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

hung2412

Thành viên tích cực
Tham gia
5/8/08
Bài viết
929
Được thích
240
Giới tính
Nam
Chào các bạn GPE!
Nhờ các bạn giúp đỡ cho tôi vấn đề này với, cụ thể như sau:
Lấy ô ở cột "Thu nhập" trừ đi ô cùng dòng ở cột "Chi phí". Hai cột "Thu nhập" và "Chi phí" này không cố định ở cột nào cả. C
hỉ biết rằng có tiêu đề là chữ "Thu nhập" và "Chi phí" và 2 cột này xuất hiện ngẫu nhiên từ cột C đến cột I.
=> Có công thức nào đặt tại cột "Chênh lệch" (Cột này được cố định tại cột B) là lấy ô ở cột "Thu nhập" trừ đi ô cùng dòng ở cột "Chi phí" không?
Ví dụ: Cột "Thu nhập" tại cột D, c
ột "Chi phí" tại cột G => Gõ công thức tại ô B5 là lấy ô D5 (Có số 4.700.000) trừ đi ô G5 (Có số 1.500.000) => Ô B5 được kết quả là 3.200.000.
Mong các bạn GPE chỉ giáo!
Trân trọng cảm ơn!
P/s: Có 01 File đính kèm.
 

File đính kèm

  • 1.xls
    1.xls
    17.5 KB · Đọc: 19
Chào các bạn GPE!
Nhờ các bạn giúp đỡ cho tôi vấn đề này với, cụ thể như sau:
Lấy ô ở cột "Thu nhập" trừ đi ô cùng dòng ở cột "Chi phí". Hai cột "Thu nhập" và "Chi phí" này không cố định ở cột nào cả. C
hỉ biết rằng có tiêu đề là chữ "Thu nhập" và "Chi phí" và 2 cột này xuất hiện ngẫu nhiên từ cột C đến cột I.
=> Có công thức nào đặt tại cột "Chênh lệch" (Cột này được cố định tại cột B) là lấy ô ở cột "Thu nhập" trừ đi ô cùng dòng ở cột "Chi phí" không?
Ví dụ: Cột "Thu nhập" tại cột D, c
ột "Chi phí" tại cột G => Gõ công thức tại ô B5 là lấy ô D5 (Có số 4.700.000) trừ đi ô G5 (Có số 1.500.000) => Ô B5 được kết quả là 3.200.000.
Mong các bạn GPE chỉ giáo!
Trân trọng cảm ơn!
P/s: Có 01 File đính kèm.
Sao lúc thì ở bên đây lúc thì ở bên kia
bạn đưa giữ liệu thật của bạn và yêu cầu cái gì làm luôn một lần
 
Sao lúc thì ở bên đây lúc thì ở bên kia
bạn đưa giữ liệu thật của bạn và yêu cầu cái gì làm luôn một lần
Dạ, vì nếu gộp các đề tài lại thì khó diễn giải với lại nhiều công đoạn khác nhau => Chả ai muốn đọc => Chia thành nhiều đề tài cho dễ giải quyết thôi mà (Cũng dễ cho người viết và dễ cho người đọc).
 
Chào các bạn GPE!
Nhờ các bạn giúp đỡ cho tôi vấn đề này với, cụ thể như sau:
Lấy ô ở cột "Thu nhập" trừ đi ô cùng dòng ở cột "Chi phí". Hai cột "Thu nhập" và "Chi phí" này không cố định ở cột nào cả. C
hỉ biết rằng có tiêu đề là chữ "Thu nhập" và "Chi phí" và 2 cột này xuất hiện ngẫu nhiên từ cột C đến cột I.
=> Có công thức nào đặt tại cột "Chênh lệch" (Cột này được cố định tại cột B) là lấy ô ở cột "Thu nhập" trừ đi ô cùng dòng ở cột "Chi phí" không?
Ví dụ: Cột "Thu nhập" tại cột D, c
ột "Chi phí" tại cột G => Gõ công thức tại ô B5 là lấy ô D5 (Có số 4.700.000) trừ đi ô G5 (Có số 1.500.000) => Ô B5 được kết quả là 3.200.000.
Mong các bạn GPE chỉ giáo!
Trân trọng cảm ơn!
P/s: Có 01 File đính kèm.

Có lẽ bạn ghép chung câu hỏi vào một chỗ sẽ tiện hơn ( Vì cách giải quyết 2 bài là tương tự )
B5=SUMPRODUCT(($C$4:$I$4="Thu nhập")*$C5:$I5)-SUMPRODUCT(($C$4:$I$4="Chi phí")*$C5:$I5)
Cũng chỉ dùng cho duy nhất 1 "Thu nhập" và 1 "Chi phí".
 
Có lẽ bạn ghép chung câu hỏi vào một chỗ sẽ tiện hơn ( Vì cách giải quyết 2 bài là tương tự )
B5=SUMPRODUCT(($C$4:$I$4="Thu nhập")*$C5:$I5)-SUMPRODUCT(($C$4:$I$4="Chi phí")*$C5:$I5)
Cũng chỉ dùng cho duy nhất 1 "Thu nhập" và 1 "Chi phí".
Cảm ơn bạn, công thức rất là tốt. Tuy nhiên, nên sửa $C5:$I5 thành C5:I5 thì lúc kéo (Copy) công thức mới đúng với các dòng dưới.
 
Cảm ơn bạn, công thức rất là tốt. Tuy nhiên, nên sửa $C5:$I5 thành C5:I5 thì lúc kéo (Copy) công thức mới đúng với các dòng dưới.

$C5:$I5 chỉ là cố định cột, không ảnh hưởng gì đến chỉ số dòng.
Có lẽ bạn kiểm tra lại, $C5:$I5 copy xuống các dòng dưới vẫn đúng như thường
 
$C5:$I5 chỉ là cố định cột, không ảnh hưởng gì đến chỉ số dòng.
Có lẽ bạn kiểm tra lại, $C5:$I5 copy xuống các dòng dưới vẫn đúng như thường
Xin lỗi bạn, vừa nãy tôi nhấn F2 tại ô công thức => quét công thức và nhấn Ctrl + C => Chọn từng ô bên dưới rồi nhấn Ctrl + V => Sai.
Lẽ ra nhấn Ctrl + C ngay tại ô công thức (Mà không phải nhấn F2 rồi quét) => Chọn các ô bên dưới rồi nhấn Ctrl + V => Đúng.
Cảm ơn bạn lần nữa.
 
Lần chỉnh sửa cuối:
Có lẽ bạn ghép chung câu hỏi vào một chỗ sẽ tiện hơn ( Vì cách giải quyết 2 bài là tương tự )
B5=SUMPRODUCT(($C$4:$I$4="Thu nhập")*$C5:$I5)-SUMPRODUCT(($C$4:$I$4="Chi phí")*$C5:$I5)
Cũng chỉ dùng cho duy nhất 1 "Thu nhập" và 1 "Chi phí".
Liệu có chuyển hóa thành Code được không bạn nhỉ?
 
Liệu có chuyển hóa thành Code được không bạn nhỉ?
Có lẽ bạn thử thế này xem sao
Mã:
Public Sub ChenhLech()
Dim r As Long, cl As Long, Thu, Chi

With Sheet1
For cl = 3 To 9
If Left(.Cells(4, cl), 1) = "T" Then
Thu = cl
Else
If Left(.Cells(4, cl), 1) = "C" Then
Chi = cl
End If
End If
Next cl

For r = 5 To 9
.Cells(r, 2).Value = .Cells(r, Thu).Value - .Cells(r, Chi).Value
Next r
End With

End Sub
 
Có lẽ bạn thử thế này xem sao
Mã:
Public Sub ChenhLech()
Dim r As Long, cl As Long, Thu, Chi

With Sheet1
For cl = 3 To 9
If Left(.Cells(4, cl), 1) = "T" Then
Thu = cl
Else
If Left(.Cells(4, cl), 1) = "C" Then
Chi = cl
End If
End If
Next cl

For r = 5 To 9
.Cells(r, 2).Value = .Cells(r, Thu).Value - .Cells(r, Chi).Value
Next r
End With

End Sub
Cảm ơn bạn, nhưng tôi thích kết quả ở dạng công thức hơn, tôi xin phép lấy Code của bạn:
PHP:
Sub ChenhLech()
Dim r As Long, cl As Long, Thu, Chi
For cl = 3 To 9
    If Left(Cells(4, cl), 1) = "T" Then
        Thu = cl
    Else
          If Left(Cells(4, cl), 1) = "C" Then
              Chi = cl
          End If
    End If
Next cl
For r = 5 To 9
      Cells(r, 2) = "=RC" & Thu & "-RC" & Chi & ""
Next r
End Sub
 
Mình lại có câu hỏi do ngạc nhiên là: CSDL của bạn thế nào mà lại có thể các trường nhảy disco lúc chổ này, lúc chổ khác lung tung làm vậy?

Theo mình thì cấu trúc CSDL rất là quan trọng trong giai đoạn ban đầu hình thành nên chúng để dễ xử lí sau này (dù bằng công thức hay fương thức nào khác lên chúng)
 
Mình lại có câu hỏi do ngạc nhiên là: CSDL của bạn thế nào mà lại có thể các trường nhảy disco lúc chổ này, lúc chổ khác lung tung làm vậy?

Theo mình thì cấu trúc CSDL rất là quan trọng trong giai đoạn ban đầu hình thành nên chúng để dễ xử lí sau này (dù bằng công thức hay fương thức nào khác lên chúng)
Ah, Đây là ví dụ được trích trên bảng tính lương hàng tháng của tôi, chứ chẳng phải CSDL có các trường như bạn nghĩ đâu. Tôi đang xây dựng một dự án VBA làm bảng tính lương dài hơi từ A => Z (Chỉ trong một Module).
Tại sao lại có cột lúc chỗ này, lúc chỗ khác là bởi vì: Khi khấu trừ bảng lương các khoản ủng hộ (Như Ủng hộ lũ lụt, ủng hộ NLĐộng bị tai nạn,... => Cái này không phát sinh thường xuyên) => Cấu trúc bảng tính lương có sự thay đổi các cột (Nhất là cột gần sau cùng là cột "Thực lĩnh bằng tiền mặt" bị ảnh hưởng lúc cột này lúc cột kia) => Công thức cột này cộng hay trừ cột kia không thể lấy theo chỉ số cột được (Như là C5 - E5, vì có sự thay đổi liên tục giữa các tháng như ví dụ đã nói ở trên) => Phải lấy theo tên dòng tiêu đề làm gốc (Tên tiêu đề thì bất di bất dịch như là "Thu nhập", "Tiền BHXH", "Tiền ăn",...) => Vậy đó bạn.
 
Tại sao lại có cột lúc chỗ này, lúc chỗ khác là bởi vì: Khi khấu trừ bảng lương các khoản ủng hộ (Như Ủng hộ lũ lụt, ủng hộ NLĐộng bị tai nạn,... => Cái này không phát sinh thường xuyên) => Cấu trúc bảng tính lương có sự thay đổi các cột (Nhất là cột gần sau cùng là cột "Thực lĩnh bằng tiền mặt" bị ảnh hưởng lúc cột này lúc cột kia) => Công thức cột này cộng hay trừ cột kia không thể lấy theo chỉ số cột được (Như là C5 - E5, vì có sự thay đổi liên tục giữa các tháng như ví dụ đã nói ở trên) => Phải lấy theo tên dòng tiêu đề làm gốc (Tên tiêu đề thì bất di bất dịch như là "Thu nhập", "Tiền BHXH", "Tiền ăn",...) => Vậy đó bạn.

Bạn nói như vậy mình chưa nhất trí cho lắm;
Trong hoạt động thường kỳ của mình, bạn sẽ biết 1 tháng đỉnh nào đó có bao nhiêu dạng khấu trừ, mình cho là 4 dạng chẳng hạn; khi đó ta luôn dành cho việc khấu trừ này 4 cột +1 mà thôi;
Lúc đó các cột/trường sẽ mãi là cố định, các cột/trường khấu trừ có cái sẽ có số liệu, có cái sẽ trống;
Còn khi bạn dùng VBA thì cứ lần lượt trừ 5 cột này thôi, cho dù nó không có số liệu;
Mình cho rằng VBA làm việc này nhẹ như tơ hồng so với việc fải đi xác định cột/trường khi nó cần tính tổng hợp lương;
(Hơn nữa chỉ có GĐ ngu ngơ mới è cổ công nhân viên đóng góp kiểu no dồn đói góp mà thôi)

Vài lời để bạn tham khảo & chúc vui ngày đầu tuần.
 
Chỉnh sửa lần cuối bởi điều hành viên:
Bạn nói như vậy mình chưa nhất trí cho lắm;
Trong hoạt động thường kỳ của mình, bạn sẽ biết 1 tháng đỉnh nào đó có bao nhiêu dạng khấu trừ, mình cho là 4 dạng chẳng hạn; khi đó ta luôn dành cho việc khấu trừ này 4 cột +1 mà thôi;
Lúc đó các cột/trường sẽ mãi là cố định, các cột/trường khấu trừ có cái sẽ có số liệu, có cái sẽ trống;
Còn khi bạn dùng VBA thì cứ lần lượt trừ 5 cột này thôi, cho dù nó không có số liệu;
Mình cho rằng VBA làm việc này nhẹ như tơ hồng so với việc fải đi xác định cột/trường khi nó cần tính tổng hợp lương;
(Hơn nữa chỉ có GĐ ngu ngơ mới è cổ công nhân viên đóng góp kiểu no dồn đói góp mà thôi)

Vài lời để bạn tham khảo & chúc vui ngày đầu tuần.
Đúng như bạn nói, tôi còn dự phòng chục cột nữa cơ (Để cố định về số cột, cho dù không có phát sinh), nếu cột nào không có phát sinh thì VBA sẽ Delete cột rỗng.
Chẳng là tôi muốn dự phòng thôi ạ, hơn nữa tôi muốn tìm hiểu thêm như theo đề tài đề cập (Là chợt nghĩ trong đầu xem trường hợp như đề tài sẽ như thế nào mà thôi).
Tôi biết sẽ phải làm gì mà.
 
Thường trong bảng lương chúng ta có những khoảng khấu trừ như sau:

[Tạm ứng], [BHXH], [BHYT], ([Đoàn fí CĐ]), các khoản này cho là cố định; Bạn dự trù thêm 2 cột nữa để ủng hộ thiên tai/tai nạn là đủ xài rồi còn gì;
Còn chuyện bạn cho ban đầu chục cột; nhưng sau đó xóa đi những trường không có số liệu thì chảng lẽ giống dã tràng lắm ru?!
 
Thường trong bảng lương chúng ta có những khoảng khấu trừ như sau:

[Tạm ứng], [BHXH], [BHYT], ([Đoàn fí CĐ]), các khoản này cho là cố định; Bạn dự trù thêm 2 cột nữa để ủng hộ thiên tai/tai nạn là đủ xài rồi còn gì;
Còn chuyện bạn cho ban đầu chục cột; nhưng sau đó xóa đi những trường không có số liệu thì chảng lẽ giống dã tràng lắm ru?!
Dạ, chỉ là dự phòng thôi ạ (Thừa còn hơn thiếu) => Nếu không lại phải chỉnh sửa Code (Nhọc phết).
Còn tại sao lại có đề tài này thì chủ yếu là tôi muốn biết thêm thôi mà.
 
PHP:
Sub ChenhLech()
Dim r As Long, cl As Long, Thu, Chi
For cl = 3 To 9
    If Left(Cells(4, cl), 1) = "T" Then
        Thu = cl
    Else
          If Left(Cells(4, cl), 1) = "C" Then
              Chi = cl
          End If
    End If
Next cl
For r = 5 To 9
      Cells(r, 2) = "=RC" & Thu & "-RC" & Chi & ""
Next r
End Sub
Code này có thể rút gọn thành:
PHP:
Sub ChenhLech()
Dim r As Long, cl As Long, Thu, Chi
For cl = 3 To 9
    If Left(Cells(4, cl), 1) = "T" Then
        Thu = cl
    End If
    If Left(Cells(4, cl), 1) = "C" Then
        Chi = cl
    End If
Next cl
Range([A5], [A65536].End(xlUp)).Offset(, 1) = "=RC" & Thu & "-RC" & Chi & ""
End Sub
 
Bạn thử chạy macro này thêm xem sao:
PHP:
Option Explicit
Sub ThuNghiem()
 Dim Rng As Range, sRng As Range
 Dim tCol As Byte, cCol As Byte
 Set Rng = Range("C4:I4")
 tCol = Rng.Find("T" & "*", , xlFormulas, xlWhole, , , True).Column
 cCol = Rng.Find("C" & "*", , xlFormulas, xlWhole, , , True).Column
 
 MsgBox tCol, , cCol
End Sub
 
Bạn thử chạy macro này thêm xem sao:
PHP:
Option Explicit
Sub ThuNghiem()
 Dim Rng As Range, sRng As Range
 Dim tCol As Byte, cCol As Byte
 Set Rng = Range("C4:I4")
 tCol = Rng.Find("T" & "*", , xlFormulas, xlWhole, , , True).Column
 cCol = Rng.Find("C" & "*", , xlFormulas, xlWhole, , , True).Column
 
 MsgBox tCol, , cCol
End Sub
Tôi thử text và kết quả là hiện 1 cái Msg:
1.jpg
=> Kết quả cuối cùng là cần điền kết quả vào ô B5 đến ô B9 => Mà lại chưa điền.
Với lại, hình như biến sRng thừa hay sao ấy bạn ạ.
 
=>(1) Kết quả cuối cùng là cần điền kết quả vào ô B5 đến ô B9 => Mà lại chưa điền.
Với lại, hình như biến sRng thừa hay sao ấy bạn ạ.

/(ết quả cuối cùng bạn đã viết rồi còn gì:
Tạo vòng lặp như bạn đã làm thôi. (Chả lẽ chỉ cho bạn cái bạn đã viết!)

Thừa nếu ta đang tham khảo cách viết mới; Sẽ không thừa khi ta "Chặt chẽ" hơn trong ngôn ngữ để làm việc với 1 CSDL quan trọng:
Đó là
[thongbao]
Set sRng=Rng.Find(. . . , . . . ,. . . .)
tCol= sRng.Column
Set sRng=Rng.Find(. . . , . . . ,. . . .)
cCol= sRng.Column
[/thongbao]
 
Web KT

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

Back
Top Bottom