Ăn mày dĩ vãng
Thành viên mới
- Tham gia
- 27/5/09
- Bài viết
- 8
- Được thích
- 6
Vẫn là cách của bạn, có thể làm cho ngắn hơn: Bỏ hết VALUE sang một bên đi, không cần thiết.Công thức này bạn không phải tách số như trước nữa. Nhưng công thức hơi dài. Không biết có bác nào có cách hay hơn không?
Ví dụ B10 là ô chứa số điện thoại
- Tính tổng 4 số đầu
=VALUE(MID(B10,1,1))+VALUE(MID(B10,2,1)+VALUE(MID(B10,3,1))+VALUE(MID(B10,4,1)))
-Tính tổng 5 số cuối
=VALUE(MID(B10,5,1))+VALUE(MID(B10,6,1)+VALUE(MID(B10,7,1))+VALUE(MID(B10,8,1))+VALUE(MID(B10,9,1)))
Dùng cách này xem:Tôi có 1 số ĐT, muốn tính thành 2 tổng:
1. Tổng của 4 số đầu
2. Tổng của 5 số cuối
Tôi dùng hàm MID để tách rồi cộng
Có cách nào ngắn hơn không ?
Xin cảm ơn !
=SUMPRODUCT(1*MID($B$10,ROW($1:$4),1))
=SUMPRODUCT(1*MID($B$10,ROW($5:$9),1))
Tổng 5 hoặc 6 số cuối:Một vấn đề mới phát sinh là: Số ĐT bây giờ có cả đầu 11 số (bao gồm cả số 0).
1. Tổng 1: 4 số đầu (không tính số 0 ở đầu)
2. Tổng 2: 5 số cuối (cho đầu 10 số), hoặc 6 số cuối (cho đầu 11 số).
Tôi đã khắc phục bằng cách dùng hàm LEN để đếm số ký tự, sau đó dùng hàm IF.
Tuy nhiên như vậy công thức sẽ rất dài, có cách nào ngắn hơn không ?
Xin chân thành cảm ơn !
=SUMPRODUCT(1*MID($B11,ROW(INDIRECT("5:"&LEN(B11))),1))
Tính tổng 1->4 số đầu :Một vấn đề mới phát sinh là: Số ĐT bây giờ có cả đầu 11 số (bao gồm cả số 0).
1. Tổng 1: 4 số đầu (không tính số 0 ở đầu)
2. Tổng 2: 5 số cuối (cho đầu 10 số), hoặc 6 số cuối (cho đầu 11 số).
Tôi đã khắc phục bằng cách dùng hàm LEN để đếm số ký tự, sau đó dùng hàm IF.
Tuy nhiên như vậy công thức sẽ rất dài, có cách nào ngắn hơn không ?
Xin chân thành cảm ơn !
=SUMPRODUCT(--MID(VALUE(B11),ROW($1:$4),1))
=SUMPRODUCT(--MID(VALUE(B11),ROW(INDIRECT("5:"&LEN(VALUE(B11)))),1))
Anh chưa xem kỹ rồi, khác nhau hoàn toàn chứ ạ.Ủa, công thức của Hoàng Danh có khác gì của anh Ndu? Mà dùng cái *1 ngắn hơn dùng VALUE.
Nếu để chuyển text thành số, hầu như mình chỉ dùng *1, chả bao giờ rờ tới cái VALUE.
Có cách: Dùng VBA ---> Bạn đưa file lên đi ---> Nhấn nút 1 nhát ----> Ra kết quả (khỏi sợ chậm và tốn dung lượng)Có một số trang họ coi phong thủy cho số ĐT, tò mò tìm hiểu thì biết được cách tính theo Mai Hoa dịch, tôi dùng những hàm trên để lập quẻ Mai Hoa.
Vấn đề là: Nếu dùng công thức:
=SUMPRODUCT(1*MID($B$10,ROW($1:$4),1))
thì khi ấn F2 sẽ thấy nó tìm kiếm trong một vùng rất rộng, từ hàng 1 đến hàng 4.
File của tôi có 4 sheet, mỗi sheet khoảng 3.500 số ĐT, tôi thử dùng công thức trên cho 1 sheet thì thấy dung lượng tăng từ 8MB lên 11MB và chạy rất chậm so với công thức:
=MID(B10,1,1) + MID(B10,2,1) + MID(B10,3,1) + MID(B10,4,1)
Có cách nào giải quyết không ?
Dử liệu nhiều, có lẻ dùng Sub sẽ hay hơn (vì đở tốn dung lượng)Gửi file nhờ anh dùng tuyệt chiêu VBA giúp cho.
Cảm ơn anh nhiều !
Sub Test()
Dim i As Long, Dong As Long, Cot As Long, Clls As Range
Dim SDT As Range, Bang1 As Range, Bang2 As Range
On Error GoTo Thoat
Set SDT = Application.InputBox("Chon vung chua SDT", Type:=8)
Set Bang1 = Application.InputBox("Chon bang 1", Type:=8)
Set Bang2 = Application.InputBox("Chon bang 2", Type:=8)
For Each Clls In SDT
For i = 1 To Len(Clls)
If i < 5 Then Cot = Cot + Mid(Clls, i, 1)
If i >= 5 Then Dong = Dong + Mid(Clls, i, 1)
Next
Clls(, 2) = Bang1((Dong - 1) Mod 8 + 1, (Cot - 1) Mod 8 + 1)
Clls(, 4) = ((Dong + Cot - 1) Mod 6) + 1
Clls(, 3) = Bang2.Resize(, 1).Find(Clls(, 2), , , xlWhole)(, Clls(, 4) + 1)
Dong = 0: Cot = 0
Next
Thoat:
End Sub
Hoặc có thể dùng UDF:Gửi file nhờ anh dùng tuyệt chiêu VBA giúp cho.
Cảm ơn anh nhiều !
Function Dau(No As String) As Integer
Dau = 0
For i = 1 To 4
Dau = Dau + Mid(No, i, 1)
Next
End Function
Function Cuoi(No As String) As Integer
Cuoi = 0
For i = 5 To Len(No)
Cuoi = Cuoi + Mid(No, i, 1)
Next
End Function
Như đã nói, nếu dùng UDF thì sẽ làm tăng dung lượng lên rất nhiều (với file chứa nhiều dử liệu).. vì vậy cách này không khả thi lắmHoặc có thể dùng UDF:
PHP:Function Dau(No As String) As Integer Dau = 0 For i = 1 To 4 Dau = Dau + Mid(No, i, 1) Next End Function
PHP:Function Cuoi(No As String) As Integer Cuoi = 0 For i = 5 To Len(No) Cuoi = Cuoi + Mid(No, i, 1) Next End Function
Function SumChar(NumText As String, Point1 As Long, Point2 As Long) As Long
Dim i As Long
For i = Point1 To Point2
SumChar = SumChar + Mid(NumText, i, 1)
Next i
End Function