SOMAR HORAS MSFLEXGRID

LUIZGS 26/11/2010 12:30:06
#358282
boa tarde, estou tendo uma dificuldade em pegar a soma de horas de um msflexgrid, configurei o campo na tabela do access como data/hora(hora normal),estou usando o seguinte código, alguem sabe como posso resolver isso:
Private Sub cmdSomar_Click()
Dim soma As Variant
Dim i As Integer

For i = 1 To Me.MSFlexGrid1.Rows - 1
soma = soma + Me.MSFlexGrid1.TextMatrix(i, 2)
Next i

total.Text = soma

End Sub
Fazendo teste com horas que somadas sao menores que 24 funciona bem, quando ultrapassa 24 horas a soma, ele nao consegue.
Desde ja agradeço muito
Luiz
MARCELO.TREZE 26/11/2010 13:56:52
#358288
posta uma tela de exemplo
LLAIA 26/11/2010 15:46:40
#358296
Eu acho que isso resolve.

Private Sub cmdSomar_Click()
Dim soma As Long
Dim i As Integer

For i = 1 To Me.MSFlexGrid1.Rows - 1
soma = soma + Hour(Me.MSFlexGrid1.TextMatrix(i, 2))
Next i

total.Text = soma

End Sub


Mas se rolar os minutos na parada .. aí vai ter que fazer umas continhas. No VB existe uma função chamada Minute usada da mesma forma que hour só que claro, retorna os minutos.

Dá um print na tua tela aí pra gente ver como o tempo tá carregado no grid.
LUIZGS 27/11/2010 20:13:14
#358347
boa noite, obrigado pelo retorno, no calculo preciso que o codigo consiga somar os minutos também, tentei de varias formas mas nao consegui, vc sabe como poderia ser?
Ps, desculpe minha ignorancia, mas como eu posso colocar o print da tela aqui no site?

Obrigado

Luiz
HENDELLCARDOSO 27/11/2010 21:39:22
#358354
Ola veja se esse códgio serve para você::



Public Function SomaHoras(HHora1 As String, HHora2 As String) As String
On Error Resume Next
Dim Hora1 As Long
Dim Min1 As Long
Dim Seg1 As Long

Dim Hora2 As Long
Dim Min2 As Long
Dim Seg2 As Long

Dim HoraFinal As Long
Dim MinFinal As Long
Dim SegFinal As Long

Dim str As String
Dim L As Integer

Dim strHora As String

Dim InicioMidMin1 As Integer [ô]Se a hora for maior que 2 digitos é acrescentado1,
[ô]para poder quebrar o resto da string em MM e SS
Dim InicioMidMin2 As Integer

Dim InicioMidSeg1 As Integer
Dim InicioMidSeg2 As Integer

HoraFinal = 0
MinFinal = 0
SegFinal = 0

InicioMidMin1 = 4
InicioMidMin2 = 4
InicioMidSeg1 = 7
InicioMidSeg2 = 7

For L = 1 To Len(HHora1) [ô]rotina, somente para Hora, pois ela pode ser maior que 2 dígitos
If Mid(HHora1, L, 1) <> [Ô]:[Ô] Then
strHora = strHora & Mid(HHora1, L, 1)
If L >= 3 Then
InicioMidMin1 = InicioMidMin1 + 1
InicioMidSeg1 = InicioMidSeg1 + 1
End If
Else
L = Len(HHora1) + 1
Hora1 = CLng(strHora)
End If
Next L
strHora = [Ô][Ô]
For L = 1 To Len(HHora2) [ô]Esta rotina, caso hora maior que 99
If Mid(HHora2, L, 1) <> [Ô]:[Ô] Then
strHora = strHora & Mid(HHora2, L, 1)
If L >= 3 Then
InicioMidMin2 = InicioMidMin2 + 1
InicioMidSeg2 = InicioMidSeg2 + 1
End If
Else
L = Len(HHora2) + 1
Hora2 = CLng(strHora)
End If
Next L

Min1 = Mid(HHora1, InicioMidMin1, 2)
Seg1 = Mid(HHora1, InicioMidSeg1, 2)


Min2 = Mid(HHora2, InicioMidMin2, 2)
Seg2 = Mid(HHora2, InicioMidSeg2, 2)

SegFinal = Seg1 + Seg2

If SegFinal >= 60 Then
MinFinal = MinFinal + 1
SegFinal = SegFinal - 60
End If
MinFinal = MinFinal + Min1 + Min2
If MinFinal >= 60 Then
HoraFinal = HoraFinal + 1
MinFinal = MinFinal - 60
End If
HoraFinal = HoraFinal + Hora1 + Hora2

str = Format(CStr(HoraFinal), [Ô]00[Ô]) & [Ô]:[Ô] & Format(CStr(MinFinal), [Ô]00[Ô]) [ô]& [Ô]:[Ô] & Format(CStr(SegFinal), [Ô]00[Ô])
SomaHoras = str

End Function
LUIZGS 27/11/2010 22:28:25
#358356
Boa noite amigos, Hendell, obrigado pelo retorno, desculpe não soube esplicar bem o que necessito, tenho um banco de dados no access onde eu digito atraves de um form a quantidade de horas de um trabalho,Num outro form eu tenho um msflexgrid onde eu faço uma busca em uma determinada data, ele me lista todos os registros da busca, gostaria de somar a quantidade de horas do msflexgrid.
Att
Obrigado

Luiz
Ps.Adicionei um print das telas, a tela1 , o codigo que tenho funciona bem para horas menores que 23:59:59, na tela2 mostra como o resultado fica errado.
HENDELLCARDOSO 28/11/2010 14:40:51
#358365
Ola você ja tentou usar a rotina acima, acho que vai dar certo assim...

Private Sub cmdSomar_Click()
Dim soma As string
Dim i As Integer

For i = 1 To Me.MSFlexGrid1.Rows - 1
soma = soma + SomaHoras(Soma, Me.MSFlexGrid1.TextMatrix(i, 2))
Next i

total.Text = soma

End Sub
LUIZGS 29/11/2010 07:46:55
#358377
bom dia a todos, obrigado Hendell pelo retorno fiz a modificação no codigo, mas ele aparece as horas misturadas conforme o print da tela em anexo...
Att

luiz
MARCELO.TREZE 29/11/2010 11:18:41
#358387
Resposta escolhida
ola para vc ter a quantidade de horas terá de comverter tudo em minutos e depois retornar o valor em hora

seria algo mais ou menos assim

Private Sub cmdSomar_Click()
Dim i As Integer
Dim TotalMinutos As Integer
Dim HM() As String
Dim SomaHoras As String

[ô] primeiro convertemos tudo para minutos para efetuarmos uma soma correta

With MSFlexgrid1
TotalMinutos = 0
For i = 1 To Me..Rows - 1
HM = Split(.TextMatrix(i, 2),[Ô]:[Ô])
TotalMinutos = TotalMinutos + (CInt(HM(0) * 60) + CInt(HM(1)))
Next i

[ô] Agora vem a parte que retorna em horas e minutos

Dim Hrs As Integer
Dim Min As Integer

Min = TotalMinutos Mod 60 [ô] retorna o resto de total de minutos dividido por 60
Hrs = (TotalMinutos - Minutos) / 60

SomaHoras = Hrs & [Ô]:[Ô] & Format(Min,[Ô]00[Ô])

total.Text = SomaHoras

End Sub



bom veja se funciona fiz o código em um pc sem o vb instalado e não fiz os teste, mas a lógica é esta

LUIZGS 29/11/2010 13:52:41
#358394
Boa tarde, muito obrigado Marcelo-Treze, funcionou direitinho, Hendell muito obrigado pela força.
Valeu amigos
Att
Luiz
Tópico encerrado , respostas não são mais permitidas