SOMAR HORAS MSFLEXGRID
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
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
posta uma tela de exemplo
Eu acho que isso resolve.
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.
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.
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
Ps, desculpe minha ignorancia, mas como eu posso colocar o print da tela aqui no site?
Obrigado
Luiz
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
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
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.
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.
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
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
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
Att
luiz
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
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
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
Boa tarde, muito obrigado Marcelo-Treze, funcionou direitinho, Hendell muito obrigado pela força.
Valeu amigos
Att
Luiz
Valeu amigos
Att
Luiz
Tópico encerrado , respostas não são mais permitidas