Giúp mình tìm số là tổng các số

  • Thread starter Thread starter thaivu
  • Ngày gửi Ngày gửi
Liên hệ QC
anhtuan1066 đã viết:
Bạn xem yêu cầu của bạn có gần giống với topic này ko?
http://www.giaiphapexcel.com/forum/showthread.php?t=6883
Nếu đúng là thế thì bạn may mắn rồi... chắc chắn sẽ có 1 giãi pháp hoàn hảo nhất cho bạn!.. nhưng từ từ nhé!
ANH TUẤN
Đúng là về phương pháp có thể áp dụng dạng như bài toán này bác Tuấn ạ
Tuy nhiên em thấy hàm excel bất tiện lắm, dùng hàm VBA thoải mái hơn chứ ạ
 
thaivu đã viết:
Em xin trình bày cụ thể vấn đề để các bác hiểu và giúp em như bác Tuấn và bác Okebab
Em đang làm báo cáo quý XDCB, hiển thị trên báo cáo là theo mã công trình
Em phải đối chiếu nó từng dòng tổng đó với các nghiệp vụ liên quan tới 2411 và 2412
Nhưng từng nghiệp vụ lại chẳng nhập theo từng công trình (phần mềm nó thế biết làm thế nào được, kiến nghị thì bảo trc mọi người vẫn làm đc sao cháu ko làm đc)
Quá trình truyền số liệu từ BQL và văn phòng sang công ty thì hay gặp kiểu truyền nửa chừng thì gặp trục trặc và chẳng biết truyền được cái nào rồi :(
Chính vì thế em mới phải làm cái việc nhờ các bác giúp chứ hix hix.
Em cám ơn bác Tuấn và bác Okebab rất nhiều, em vẫn đang tiếp tục mày mò để hàm tìm số tổng cho không chỉ 2 mà 3,4,5 số hạng.
Có cách nào mà khi clik vào ô kết quả nó bôi vàng luôn các ô số hạng ko các bác nhỉ.

Cái này thì có lẽ dùng For next dễ hơn.

Tuy nhiên do không có thời gian nên mình chưa cô gọn nó lại. Bác nào thích thì giúp em nhé

Mới chỉ tối đa là 5 số hạng thôi

Thân!
 

File đính kèm

Đây là hàm của bác Voda em đã sửa lại chút
PHP:
Sub timtong2so()
Dim i As Integer, j As Integer, k As Integer, ii As Integer, t As Long
Range("E2:IV22").ClearContents
For i = 2 To Cells(1, 16)
  For j = i + 1 To Cells(1, 16)
     For k = 2 To Cells(1, 18)
         t = Cells(i, 1) + Cells(j, 1)
         If t = Cells(k, 3) Then
            ii = Cells(k, Columns.Count).End(xlToLeft).Column + 1
                Cells(k, ii) = "=A" & i & " + A" & j
         End If
   Next
  Next
Next
End Sub
Sub timtong3so()
Dim i As Integer, j As Integer, m As Integer, k As Integer, ii As Integer, t As Long
Range("E2:IV22").ClearContents
For i = 2 To Cells(1, 16)
  For j = i + 1 To Cells(1, 16)
    For m = j + 1 To Cells(1, 16)
        For k = 2 To Cells(1, 18)
            t = Cells(i, 1) + Cells(j, 1) + Cells(m, 1)
            If t = Cells(k, 3) Then
               ii = Cells(k, Columns.Count).End(xlToLeft).Column + 1
                   Cells(k, ii) = "=A" & i & " + A" & j & " + A" & m
            End If
        Next
     Next
  Next
Next
End Sub

Tuy vậy hàm của bác có nhược điểm là phải xác định cho i và k chạy từ đâu tới đâu.
Điều này có nghĩa là khi ta có một cột dữ liệu mới lại phải vào editor sửa lại
Để khắc phục em nghĩ nên thêm 2 ô để nhập số max của i ,j và k
Từ đó em phát triển thêm cái hàm tìm tổng của 3 số, nếu 4 số và 5 số tương tự em ko gửi lên nữa.
Cảm ơn các bác thật nhiều, em vui quá
À quên có bác nào nghĩ ra cách click vào ô kết quả nó bôi vàng luôn mấy cái ô số hạng không ạ. Như excel bây giờ cũng bôi nhưng chưa rõ lắm.
 

File đính kèm

Mr Okebab đã viết:
Cái này thì có lẽ dùng For next dễ hơn.

Tuy nhiên do không có thời gian nên mình chưa cô gọn nó lại. Bác nào thích thì giúp em nhé

Mới chỉ tối đa là 5 số hạng thôi

Thân!
Bác Okebab viết nhanh thật, giờ công việc của em ngon hơn phần nào rồi.
có lẽ cũng chỉ dừng lại ở 5 số thôi các bác ạ.
Thấy các bác mỗi người viết theo một cách, cách nào cũng hay cả.
Em đưa file em chỉnh lại chút, các bác góp ý cho em nhé
 
Báo cáo các bác em đã hoàn thành công trình auto luôn cái khoản xác nhận số lượng số hạng cũng như số lượng số tổng
Các bác xem thử nhé
 

File đính kèm

thaivu đã viết:
Báo cáo các bác em đã hoàn thành công trình auto luôn cái khoản xác nhận số lượng số hạng cũng như số lượng số tổng
Các bác xem thử nhé

Góp ý chút xíu về giải thuật thôi :
VD như tìm tổng 5 số :
Vì các số >0 nên :
- Tìm số thứ nhất : Nếu số đó < Số cần tính -->>Xét tiếp
-> Tìm số thứ hai : Nếu số thứ nhất + thứ hai < Số cần tính -->>Xét tiếp
. . . . . .

Như vậy Code của bạn chạy rất nhanh.
Còn như của bạn, nó sẽ chạy hết cả 5 vòng For đó thì . . . hơi lâu.

Thân!
 
oh, bài toán này rất hay -> nhưng nếu chỉ dừng 5 số hạng thì làm như OB là được rồi,

nhưng tổng quát hóa là tìm tất cả các trường hợp (1,2,...) số thì ta phải dùng giải thuật Vét cạn mới giải được và tối ưu,

Và tôi nghĩ đây là bài tập lập trình của Tin học đây,
.
.

thaivu đã viết:
Báo cáo các bác em đã hoàn thành công trình auto luôn cái khoản xác nhận số lượng số hạng cũng như số lượng số tổng
Các bác xem thử nhé

như OB nói bạn cần cải thiện thuật toán, và với tổng 5 số kết quả sai bạn ơi? bạn ktra lại nhé
.
.
http://www.giaiphapexcel.com/forum/member.php?u=440
 
Mr Okebab đã viết:
Góp ý chút xíu về giải thuật thôi :
VD như tìm tổng 5 số :
Vì các số >0 nên :
- Tìm số thứ nhất : Nếu số đó < Số cần tính -->>Xét tiếp
-> Tìm số thứ hai : Nếu số thứ nhất + thứ hai < Số cần tính -->>Xét tiếp
. . . . . .

Như vậy Code của bạn chạy rất nhanh.
Còn như của bạn, nó sẽ chạy hết cả 5 vòng For đó thì . . . hơi lâu.

Thân!
Cám ơn bác, quả thực em chạy 5 số hạng thấy hơi sốt ruột thật. Với lại em có chỉnh lại một chút rồi vì hàm cũ sử dụng biến t as long chỉ được số tổng là tỷ, không phù hợp với thực tế.
Em mới chỉ viết được tổng 2 số theo cách bác bảo, bác xem có sai ở đâu không hộ em nhé
PHP:
Sub timtong2so()
Dim i As Integer, j As Integer, k As Integer, ii As Integer
Range("E2:IV60").ClearContents
For k = 2 To Cells(Rows.Count, 3).End(xlUp).Row
    If Cells(k, 3) <> 0 Then
                For i = 2 To Cells(Rows.Count, 1).End(xlUp).Row
                    If Cells(i, 1) < Cells(k, 3) And Cells(i, 1) <> 0 Then
                        For j = i + 1 To Cells(Rows.Count, 1).End(xlUp).Row
                            If Cells(k, 3) = Cells(i, 1) + Cells(j, 1) Then
                               ii = Cells(k, Columns.Count).End(xlToLeft).Column + 1
                                   Cells(k, ii) = "=A" & i & " + A" & j
                            End If
                        Next
                    End If
                Next
    End If
Next
End Sub
 
Lần chỉnh sửa cuối:
Em viết thêm được hàm tổng 3,4,5 số rồi, tốc độ nhanh hơn hẳn các bác ạ.
 

File đính kèm

Lần chỉnh sửa cuối:
Nguyên văn bởi thaivu
Em viết thêm được hàm tổng 3,4,5 số rồi, tốc độ nhanh hơn hẳn các bác ạ.
Thuật toán này chưa phải là tối ưu. Nhưng bước đầu là bạn đã thành công. Có góp ý nhỏ:
-Nên gán Cells(Rows.Count, 1).End(xlUp).Row vào một biến để code gọn hơn. Vidụ:
t = Cells(Rows.Count, 1).End(xlUp).Row
Range("E2:IV" & t).ClearContents
...
 
Vầng cái đó em sẽ sửa ngay.
Tiện thể các bác cho em hỏi, trong VBA có cách nào khi click vào 1 cell kết quả nó sẽ bôi vàng các ô số hạng không ạ
chứ như em bây giờ phải click vào xem công thức nó mới bôi theo kiểu excel vẫn khó nhìn
 
Lần chỉnh sửa cuối:
Bạn muốn click vào ô trong cột A hay trong cột C. Các ô nào sẽ bôi vàng?Bạn cho một ví dụ để dễ hình dung hơn.
 
voda đã viết:
Bạn muốn click vào ô trong cột A hay trong cột C. Các ô nào sẽ bôi vàng?Bạn cho một ví dụ để dễ hình dung hơn.

Ý là : C10 = A1 + A2 + A15 + A17 . . .

Khi Click vào đó thì các ô trong công thức đó sẽ biến thành màu vàng.

Tiện thể các bác cho em hỏi, trong VBA có cách nào khi click vào 1 cell kết quả nó sẽ bôi vàng các ô kết quả không ạ
chứ như em bây giờ phải click vào xem công thức nó mới bôi theo kiểu excel vẫn khó nhìn

Cái này cũng không khó, nhưng hơi cực.
Giải thuật như sau :
  1. Click vào 1 ô
  2. Trả lại màu nguyên thủy cho các ô trong tham chiếu của ô được kịch hoạt trước đó (Dựa vào ô cố định ở bước 4)
  3. Lấy ra được địa chỉ của các ô tham chiếu trong công thức ô hiện hành
  4. Ghi ra một Cell cố định các địa chỉ này
  5. Tiến hành tô vàng cho các ô tham chiếu đó
Mệt nhỉ.

Thân!
 
Đúng đó các bác ạ.
Em mò cái lệnh bôi vàng và xóa từ trưa tới giờ chưa đc.
 
Em đã viết xong hàm đánh dấu các số hạng.
Chân thành cảm ơn các bác đã giúp em rất nhiều
PHP:
Option Explicit
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Dim i As Integer, j As Integer, k As Integer, rowmax As Integer, colmax As Integer, sohang As Variant
rowmax = Cells(Rows.Count, 5).End(xlUp).Row For i = 3 To rowmax
colmax = Cells(i, Columns.Count).End(xlToLeft).Column
    For j = 5 To colmax
        If Cells(i, j) <> 0 Then
            If Not Intersect(Target, Cells(i, j)) Is Nothing Then
                Range("A3:A100").Interior.ColorIndex = 0
                Range("C3:C100").Interior.ColorIndex = 0
                Range("E3:CV100").Interior.ColorIndex = 0
                
                'Cells(i, 3).Interior.ColorIndex = 34
                Cells(i, j).Interior.ColorIndex = 34 ' light blue
                    
                If InStr(1, Cells(i, j), " + ") > 0 Then
                    sohang = Split(Cells(i, j), " + ")
                        For k = 0 To UBound(sohang)
                            Range(sohang(k)).Interior.ColorIndex = 34 ' light blue
                        Next
                Else
                    Range(Cells(i, j)).Interior.ColorIndex = 34 ' light blue
                End If
            End If
        End If
    Next
Next
End Sub
 
Hình như đoạn code trên thiếu chữ formula:
If InStr(1, Cells(i, j).Formula, " + ") > 0 Then
sohang = Split(Cells(i, j).Formula, " + ")
Bạn xem lại thử đúng không?
 
thaivu đã viết:
Em đã viết xong hàm đánh dấu các số hạng.
Chân thành cảm ơn các bác đã giúp em rất nhiều
PHP:
Option Explicit
Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, ByVal Target As Range) Dim i As Integer, j As Integer, k As Integer, rowmax As Integer, colmax As Integer, sohang As Variant
rowmax = Cells(Rows.Count, 5).End(xlUp).Row For i = 3 To rowmax
colmax = Cells(i, Columns.Count).End(xlToLeft).Column
    For j = 5 To colmax
        If Cells(i, j) <> 0 Then
            If Not Intersect(Target, Cells(i, j)) Is Nothing Then
                Range("A3:A100").Interior.ColorIndex = 0
                Range("C3:C100").Interior.ColorIndex = 0
                Range("E3:CV100").Interior.ColorIndex = 0
                
                'Cells(i, 3).Interior.ColorIndex = 34
                Cells(i, j).Interior.ColorIndex = 34 ' light blue
                    
                If InStr(1, Cells(i, j), " + ") > 0 Then
                    sohang = Split(Cells(i, j), " + ")
                        For k = 0 To UBound(sohang)
                            Range(sohang(k)).Interior.ColorIndex = 34 ' light blue
                        Next
                Else
                    Range(Cells(i, j)).Interior.ColorIndex = 34 ' light blue
                End If
            End If
        End If
    Next
Next
End Sub

Đừng gửi 1 cái code dài như vậy, phải gửi kèm File thì mới test giúp bạn được. Vì File vừa có Code, vừa có dữ liệu để thử.
Chứ tớ đọc một hồi cũng hoa cả mắt. Vì thế chẳng có ý kiến gì được cả.

Thân!
 
voda đã viết:
Hình như đoạn code trên thiếu chữ formula:

Bạn xem lại thử đúng không?
Dạ, hôm đó em tìm mãi chẳng biết làm thế nào ra được cái fomular thế là em chuyển cái kết quả thành text./-*+/

Mr Okebab đã viết:
Đừng gửi 1 cái code dài như vậy, phải gửi kèm File thì mới test giúp bạn được. Vì File vừa có Code, vừa có dữ liệu để thử.
Chứ tớ đọc một hồi cũng hoa cả mắt. Vì thế chẳng có ý kiến gì được cả.

Thân!
Dạ, em gửi luôn đây ạ. Em sợ gửi nhiều quá-+*/
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:
VODA ơi! Lỗi mất rồi. Mình click vào CLICK báo lỗi mất rồi. Có ai biết làm addin cho cái vụ này không nhỉ. Cái này dân kế toán tìm số chênh lệnh thì quá tuyệt luôn.
 
Tìm tổng của một số cho trước

Chào cả nhà.
Dân kế toán chúng tôi rất cần cái tìm tổng của một số cho trước (theo file đính kèm) khi làm báo cáo.
Ví dụ: chênh lệch một số nào đấy, không biết từ đâu tìm rất mất thời gian. Hôm rồi lang thang trên GPE gặp được Mr Okebab, voda, Anhtuan1066, thaivu... đang bàn về vấn đề này. Mình tải file về xem và có chút đề nghị nhờ mọi người giúp đỡ. xem file đính kèm.
Xin cám ơn PGE, cám ơn mọi người!

Thân!
 

File đính kèm

Lần chỉnh sửa cuối:
Web KT

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

Back
Top Bottom