Hàm của PhanTuHuong báo lỗi! Giúp test giùm!

Liên hệ QC

Ae-excel

Thành viên mới
Tham gia
23/11/07
Bài viết
11
Được thích
2
Mình rất cảm ơn vì bạn đã viết Cách thể hiện góc ở dạng độ thực sự mình đi kiếm bài này rất hay nhưng có 1 vài vấn đê nhỏ ở code của bạn. Mình ko thể fix được lỗi đó mình mong bạn fix lại giúp mình.
http://www.giaiphapexcel.com/forum/showthread.php?t=96 Bài viết của bạn
Mình dùng ##"°"##"'"##"''" xin lỗi mình đã sửa code tính trung bình thành code tính tổng. Nhưng mình nghĩ ko có gì thay đổi so với code gốc của bạn:
Code:

Mã:
Function Gocgiay(Vung)
[LEFT]On Error GoTo Sailam

Dim i, Dai, Tong, Goctheogiay, TB, Trai, Giua, Phai
[LEFT]Tong = 0
i = 0
Dim Ogoc
For Each Ogoc In Vung
Dai = Len(Ogoc)
If Ogoc <> 0 Then
Goctheogiay = Val(Left(Ogoc, Dai - 4) * 3600) + Val(Left(Right(Ogoc, 4), 2) * 60) + Val(Right(Ogoc, 2))
Tong = Tong + Goctheogiay
i = i + 1
Else
i = i
End If[/LEFT]
 
[LEFT]Next
[COLOR=red]TB = Tong  / 3600[/COLOR] 'dòng này mình đã sửa TB = Tong / i / 3600
Trai = Int(TB)
Giua = Int((TB - Trai) * 60)
Phai = Round(((TB - Trai) * 60 - Giua) * 60, 0)
If Phai > 10 And Giua > 10 Then
Gocgiay = Trai & "°" & Giua & "'" & Phai & "''"
ElseIf Phai > 10 And Giua < 10 Then
Gocgiay = Trai & "°0" & Giua & "'" & Phai & "''"
ElseIf Phai < 10 And Giua > 10 Then
Gocgiay = Trai & "°" & Giua & "'0" & Phai & "''"
Else
Gocgiay = Trai & "°0" & Giua & "'0" & Phai & "''"
End If
Exit Function
Sailam:
Gocgiay = "So lieu sai"[/LEFT]
 
[LEFT]End Function[/LEFT]

[/LEFT]



Nhưng khi áp dụng có 2 vấn đề:
- Nếu nhập giá trị theo đúng dạng ##"°"##"'"##"''" thì cho kết quả đúng còn nếu nhập theo dạng 00"°"##"'"##"''" (Ví dụ 00°30'00'') thì lại cho kết quả "So lieu sai".
- Nếu tổng hay trung bình góc mà ra có dạng 30°60'00'' hay 30°00'60'' thì nó ko chuyển thành 31°00'00'' và 30°01'00'' vì thự chất 30°60'00'' và 31°00'00'' hay 30°00'60'' và 30°01'00'' là giống nhau.
Mình mong bạn trả lời giúp mình. Mình cảm ơn bạn nhiều

 
Lần chỉnh sửa cuối:
Không thấy ai quan tâm thì tôi đành trả lời vậy:

- Khi nhập góc không có độ thì hàm sẽ sai do hàm Left..
- Tạo thêm trường hợp khi Phai=60 thì trả về 0, Giua được cộng thêm 1. (Tương tự như đối với Giua=60)

Tôi đã sửa hàm như sau:

Mã:
Function Gocgiay(Vung As Range)
  On Error GoTo Sailam
  
  Dim i As Integer, Dai As Integer, Tong As Double, Ogoc As Range
  Dim Goctheogiay As [COLOR="Red"]Double[/COLOR], Trai As Double, Giua As Integer, Phai As Integer
  
  Tong = 0
  i = 0
  
  For Each Ogoc In Vung
    Dai = Len(Ogoc.Value)
    If IsEmpty(Ogoc) = False Then
      If Dai > 4 Then
        Goctheogiay = Val(Left(Ogoc.Value, Dai - 4) * 3600) + _
        Val(Left(Right(Ogoc.Value, 4), 2) * 60) + Val(Right(Ogoc.Value, 2))
      Else
        Goctheogiay = Val(Left(Right(Ogoc.Value, 4), 2) * 60) + Val(Right(Ogoc.Value, 2))
      End If
      
      Tong = Tong + Goctheogiay / 3600
      i = i + 1
    Else
      i = i
    End If
  Next
  
   
  Trai = Int(Tong)
  Giua = Int((Tong - Trai) * 60)
  Phai = Round(((Tong - Trai) * 60 - Giua) * 60, 0)
  'Neu goc giay = 60 thi
  If Phai = 60 Then
    Giua = Giua + 1
    Phai = 0
  End If
  
  If Phai > 10 And Giua > 10 Then
      Gocgiay = Trai & "°" & Giua & "'" & Phai & "''"
    ElseIf Phai > 10 And Giua < 10 Then
      Gocgiay = Trai & "°0" & Giua & "'" & Phai & "''"
    ElseIf Phai < 10 And Giua > 10 Then
      Gocgiay = Trai & "°" & Giua & "'0" & Phai & "''"
    Else
      Gocgiay = Trai & "°0" & Giua & "'0" & Phai & "''"
  End If
  
  Exit Function

Sailam:
  Gocgiay = "So lieu sai"
 
End Function
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom