Viết lệnh VBA cho chuỗi có vòng lặp biến đổi dựa trên giá trị của chuỗi ban đầu (1 người xem)

Liên hệ QC

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

myguitar

Thành viên mới
Tham gia
23/10/14
Bài viết
29
Được thích
1
Em chào cả nhà,

Em đang phải viết lệnh VBA cho một chuỗi số liệu với vòng lặp biến đổi theo giá trị của chuỗi số liệu.
Bình thường thì vòng lặp là 10 giá trị của chuỗi. Nhưng trong trường hợp chuỗi xuất hiện giá trị âm thì giá trị vòng lặp tăng lên theo số các số âm trong chuỗi.

Công thức tính của cái này hơi phức tạp nên em gửi kèm trong tệp đính kèm phần tính toán của em. Trong tệp, chuỗi lặp cố định ký hiệu là E10. Còn chuỗi lặp biến đổi ký hiệu là Ej. Chuỗi Ej trong tệp thì em mới tính thủ công. Nhờ các bác xem giúp em lệnh nào để tính Ej một cách tự động mà ko phải lần mò từng giá trị âm với ạ.

Em cảm ơn các bác!
 

File đính kèm

. . .cách của bác thì ô [D19] đến [D22] ra đúng kết quả nhưng kéo lệnh này xuống dưới thì nó tính cả những giá trị khi mà cột B2 ko chứa giá trị âm.

Bạn thử kéo công thức hàm tự tạo đó lên hướng trên xem sao;

Mình thấy rằng thì là, khi áp công thức vô [F18] nó ra kết quả 1.599984127

Mà ở ô [C19] của bạn đang là 1.5999841 là còn đòi gì nữa?!
 
Upvote 0
Đương nhiên là thử rồi. Kết quả ra in hệt như ví dụ của bạn.
Đọc cho kỹ lại sẽ thấy rằng tôi có yêu cầu bạn cho ví dụ rõ ràng, nếu không ra đúng là do lỗi của bạn.

Trong bài #1, bạn có cho biết là hàm Sum_10 của mình đã tính đúng rồi, chỉ cần khai triển cho các trường hợp Ej's. Hàm CalcSum10J làm đúng công việc đó: tức là nó tìm đoạn sum và đưa vào Sum_10 để tính. Hàm CalcSum10 thực ra không cần thiết, nó chỉ giúp bạn tổng quát hoá giải pháp của mình thôi.

Cách thử:
1. copy sheet1 snag sheet mới: sheet1(2)
2. tại ô C13, ghi công thức =CalcSum10(); kéo xuống
3. tại ô D19, ghi công thức =CalcSum10J(); kéo xuống
So kết quả ở sheet1, sẽ thấy in hệt.
Nhắc lại: nếu không đúng là do lỗi bạn cho vid dụ không đúng.

Em đã thử cái CalcSum10J và thấy ra đúng kết quả rồi, chỉ có điều khi cột B ko có giá trị âm thì cái CalcSum10J cũng tính nốt bác ạ.
 
Upvote 0
Em đã thử cái CalcSum10J và thấy ra đúng kết quả rồi, chỉ có điều khi cột B ko có giá trị âm thì cái CalcSum10J cũng tính nốt bác ạ.

Tôi có viết rõ ràng rằng "kết quả ra in hệt như ví dụ của bạn. Nếu không đúng thì do ví dụ của bạn không đúng"
Xin lỗi, tôi từ chối không làm việc với ví dụ không đúng. Xin nhường lại cho các bạn khác.
 
Upvote 0
Có hai giá trị E10 được tính: E10 tính trong khoảng D10 đến D1 và E10 tính trong khoảng D11 đến D2. Cụ thể:
E10 (từ D10 đến D1) = (10)/1 + (10+9)/2 + (10+9+8)/3 + (10+9+8+7)/4 + ...+ (10+9+8+7+...+1)/10 = 77,5
E10 (từ D11 đến D2) = (-11)/1 + (-11+10)/2 + (-11+10+9)/3 + ... + (-11+10+9+...+2)/10 = 23,06

Có 1 số âm => j=10+1= 11
E11 = (-11)/1 + (-11+10)/2 + (-11+10+9)/3 + ... + (-11+10+9+...+1)/11 = 27,06.

Bác xem thêm phần tệp đính kèm em tính theo cách trung bình cộng và tính theo lệnh VBA Sum_10 nhé.
Tham gia một hàm chuối xem sao
Mã:
Public Function Chuoi(Cll As Range)
Dim Arr10, ArrJ, i, a, r As Long, rw As Long

If Cll.Row < 12 Then
Chuoi = ""
Exit Function
End If

Arr10 = Range(Cells(Cll.Row - 9, Cll.Column), Cells(Cll.Row, Cll.Column))
For r = 1 To UBound(Arr10)
If Arr10(r, 1) < 0 Then
a = a + 1
End If
Next r

rw = Cll.Row - 9 - a
ArrJ = Range(Cells(rw, Cll.Column), Cells(Cll.Row, Cll.Column))
For r = UBound(ArrJ) To 1 Step -1
i = i + ArrJ(r, 1)
Chuoi = Chuoi + i / (UBound(ArrJ) + 1 - r)
Next r

End Function
---
Cú pháp: =Chuoi( 1 Ô cuối cùng của vùng cần tính )
 
Upvote 0
Web KT

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

Back
Top Bottom