Este fórum está sendo desativado

Depois de 9 anos, este fórum será desativado. Mas calma.... estamos migrando para uma comunidade no DISCORD. Junte-se a nós.

ENTRAR PARA DISCORD

Tópicos relacionados a códigos VBA, gravação de macros, etc.
  • Avatar do usuário
#52101
Boa noite

Estou a tentar passar uns parâmetros para dentro de uma rotina de modo a torna-la o mais generalista possível, mas está a dar-me erro, então é assim, preciso de passar para dentro de uma subrotina os seguintes parâmetros:
'
' Wsd - Worksheet com os Dados
' Rng1 - Range dos dados que se encontram em WsD - Datas Iniciais
' Rng2 - Range dos dados que se encontram em WsD - Datas Finais
'
' WsO - Worksheet para saida/escrita do dados
' RngO - Range/Celula inicial onde vão ser escritos os dados
'

Ou seja preciso passar qual o nome da Planilha onde estão os Dados e os Ranges dos Dados, ........... fazer determinados cálculos....... e depois com o nome da Planilha, WsO, de saída/escrita do resultado dos cálculos e o Range da primeira célula, RngO escrever o resultado do cálculo.

Anexo uma Planilha com os dados e o código que escrevi mas que está a dar erro.
Apenas para exemplo a saída de dados é a Dataf-Datai que é o número de dias entre as duas datas.

Agradecia toda a ajuda possível para resolver este problema.

Obrigado
Jorge Cabral

NOTA: Tb aqui : https://www.planilhando.com.br/forum/vi ... 10&t=32632
Você não está autorizado a ver ou baixar esse anexo.
#52112
Olá, vamos por parte. Não entendi qual o funcionamento do código, e não tem como testá-lo sem ele estar completo. Mas, quando se trabalha com datas, a melhor forma de definir a diferença entre elas é usando o DateDiff. Exemplo:
Código: Selecionar todos
DateDiff("d", Datai, Dataf)
Isso retorna o valor em dias (Dataf - Datai). Use "d" pra dias, "m" mês, "y" anos.
#52115
Caro eduardogrigull

Muito obrigado pela sua ajuda.
O meu principal problema é como passar determinados parâmetros para dentro de uma rotina e depois usá-los dentro da rotina.

De uma forma genérica a sub-rotina (ORIGINAL) lê as datas iniciais e finais, faz uns cálculos (não tem interesse quais os cálculos em questão) e coloca os resultados num determinado local.
O que eu pretendo é que essa sub-rotina seja mais genérica, ou seja que eu lhe diga onde estão os dados para ela ler (Wsd, Rng1 e Rng2) ela depois faz os cálculos e depois eu digo onde quero que ela coloque os dados (WsO e RngO).

A questão do calculo Dataf-Datai, foi apenas para simular um calculo para fazer o output de dados, no caso real não é esse o calculo que faz, aqui foi apenas para simular um calculo e fazer o output onde eu digo para fazer, ou seja em WsO e em RngO.

Não sei fui claro na explicação.
Obrigado
Jorge Cabral
#52121
Eduardo

Mais uma vez obrigado.

Da forma que fez julgo que não está a ler o dados na planilha WsD.

E se fizer um calculo do género : ResultadoCalculo(i) = DataFinal(i, 1) - DataInicial(i, 1) , está a dar erro na saída de dados.

Um dos problemas que tenho é que não sei como passar para a rotina o nome da Planilha onde quero que leia os dados e da Planilha onde quero que escreva os resultados.
#52122
Experimente alterar:

de ~~~> Calculo "Folha2", ..., "Folha1", ...
para ~~~> Calculo Folha2, ..., Folha1, ... (sem as aspas)

de ~~~> Datai = Sheets(WsD).Range(Rng1.Address)
para ~~~> Datai = WsD.Range(Rng1.Address).Value
#52124
Obrigado Osvaldomp
Obrigado Eduardogrigull

Seguindo as indicações do Osvaldomp e com uns pequenos ajustes consegui o pretendido.

Deixo aqui o código final.

Muito obrigado aos dois pela ajuda.

Código: Selecionar todos
'
'   Wsd - Worksheet com os Dados
'   Rng1 - Range dos dados que se encontram em WsD - Datas Iniciais
'   Rng2 - Range dos dados que se encontram em WsD - Datas Finais
'
'   WsO - Worksheet para saida/escrita do dados
'   RngO - Range/Celula inicial onde vão ser escritos os dados
'

Sub Calculo(WsD, Rng1 As Range, Rng2 As Range, WsO, RngO)

    Dim Datai(), Dataf() As Variant
    Dim Resultado() As Variant
    
    Datai = WsD.Range(Rng1.Address).Value
    Dataf = WsD.Range(Rng2.Address).Value
        
    '
    ' RESTO DO CÓDIGO - è só um exemplo da calculo para produzir dados para o OUTPUT    
    '
        ReDim Resultado(1 To UBound(Datai))

        For i = 1 To UBound(Datai)
            Resultado(i) = Dataf(i, 1) - Datai(i, 1)
        Next i
   
    '
    '   Saida de Dados
    '
    
    WsO.Range(RngO).Resize(UBound(Datai)).Value = Application.Transpose(Resultado)
    
End Sub

Código: Selecionar todos
Sub Teste()

    Calculo Folha2, Range("B2:B" & Folha2.Range("B" & Folha2.Rows.Count).End(xlUp).Row), Range("C2:C" & Folha2.Range("C" & Folha2.Rows.Count).End(xlUp).Row), Folha1, "A2"

End Sub
long long title how many chars? lets see 123 ok more? yes 60

We have created lots of YouTube videos just so you can achieve [...]

Another post test yes yes yes or no, maybe ni? :-/

The best flat phpBB theme around. Period. Fine craftmanship and [...]

Do you need a super MOD? Well here it is. chew on this

All you need is right here. Content tag, SEO, listing, Pizza and spaghetti [...]

Lasagna on me this time ok? I got plenty of cash

this should be fantastic. but what about links,images, bbcodes etc etc? [...]

Estamos migrando para uma comunidade no Discord