Ir ao conteúdo
  • Cadastre-se

Loop em células do excel com vba - sem macro


Posts recomendados

Olá, procurei no fórum algum código para esta solução mas não encontrei. O que precisamos é o seguinte: Quando for digitado um número na célula C5, aparece automaticamente na célula i5 a data e a hora do sistema. Porém, eu preciso que em cada célula da coluna c e da coluna i isso aconteça, ou pelo menos até a célula 300... rsrsr. Pra que eu não precise fazer fórmula por fórmula acho q teria q desenvolver um loop, mas todos os códigos que eu tentei falharam... loop next... next célula.... o que eu posso fazer?

segue abaixo o código da data que eu mencionei acima:

Private Sub Worksheet_Change(ByVal Target As Range)

If ((Target.Row = Range("C5").Row And Target.Column = Range("C5").Column)) Then
Range("i5").Value = DateTime.Now
End If

If ((Target.Row = Range("m5").Row And Target.Column = Range("m5").Column)) Then
Range("l5").Value = DateTime.Now
End If

If ((Target.Row = Range("o5").Row And Target.Column = Range("o5").Column)) Then
Range("n5").Value = DateTime.Now
End If

If ((Target.Row = Range("s5").Row And Target.Column = Range("s5").Column)) Then
Range("r5").Value = DateTime.Now
End If

If ((Target.Row = Range("u5").Row And Target.Column = Range("u5").Column)) Then
Range("t5").Value = DateTime.Now
End If


End Sub

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Tenta assim:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim Colunas As Range

Set Colunas = Range("C1:C20000")

If Not Application.Intersect(Colunas, Range(Target.Address)) Is Nothing Then

linha = Target.Row

Range("l" & linha).Value = DateTime.Now

End If

End Sub

Link para o comentário
Compartilhar em outros sites

Tentei fazer como você falou... mas não está funcionando... segue uma imagem da planilha na qual estou tentado fazer esta fórmula....se puder dar uma olhada, eu agradeço! (tentei enviar a planilha mas o arquivo não foi...)

OBS: a digitar na coluna c, aparece a hora do sistema na coluna i... só que eu usar a função Agora() do excel, quando a hora do sistema mudar, muda a hora que foi colocada na coluna também... então montamos o código acima, so que ele só executa a primeira linha da tabela....coloquei o seu código mas não acontece nada e ele fica pedindo pra eu dar um nome para a macro, só que não pode ser uma macro porque o usuário teria que habilitar ela toda hora e mandar executar...tem que ser automatico..

valeu!

post-645836-13884953734132_thumb.jpg

Link para o comentário
Compartilhar em outros sites

Bom, seguindo a mesma lógica mencionada acima, eu preciso agora que ao invés de colocar a data seja colocado o nome do computador que o usuário que alterar a planilha estiver... Então seguindo a lógica fornecida pelo Flávio Soares tentei fazer da seguinte forma:


Private Function GetComputerName(ByVal sBuffer As String, lSize As Long) As Long

Dim NameSize As Long
Dim X As Long
MachineName = Space$(16)
NameSize = Len(MachineName)

X = GetComputerName(MachineName, NameSize)

End Function


Private Sub Worksheet_Change(ByVal Target As Range)


Dim Colunas As Range

Set Colunas = Range("C1:C20000")

If Not Application.Intersect(Colunas, Range(Target.Address)) Is Nothing Then
linha = Target.Row
Range("k" & linha).Value = GetComputerName
End If

End Sub

Porém, não funciona. Se alguém puder dar uma mão, agradeço.

valeu

Link para o comentário
Compartilhar em outros sites

Tenho a seguinte fórmula em excel no editor do visual basic:

Private Sub Worksheet_Change(ByVal Target As Range)
Dim ColunasC As Range
Set ColunasC = Range("C2:C20000")
If Not Application.Intersect(ColunasC, Range(Target.Address)) Is Nothing Then
linha = Target.Row
Range("i" & linha).Value = DateTime.Now
End If
End Sub

Preciso então, que ao ser preenchida a linha correpondente na coluna i, a mesma seja bloqueada... tentei colocar a instrução abaixo, mas não funcionou.

Range("i" & linha).Locked = True

Então, como posso fazer isso???

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Selecione toda a planilha, vá em formatar células, na aba proteção e marque todas como desbloqueadas, depois selecione somente a coluna I e marque como bloqueada. Agota insira os códigos abaixo para Desbloquear a planilha e após lançar a hota, bloquear novamente. Vamos supor que o Password seja Teste.

No inicio do código coloque: ActiveSheet.Unprotect ("Teste")

E no final do código coloque: ActiveSheet.Protect ("Teste"), DrawingObjects:=True, Contents:=True, Scenarios:=True

Vai ficar assim:

ActiveSheet.Unprotect ("Teste")

Dim ColunasC As Range

Set ColunasC = Range("C2:C20000")

If Not Application.Intersect(ColunasC, Range(Target.Address)) Is Nothing Then

linha = Target.Row

Range("i" & linha).Value = DateTime.Now

End If

ActiveSheet.Protect ("Teste"), DrawingObjects:=True, Contents:=True, Scenarios:=True

Link para o comentário
Compartilhar em outros sites

O caso é que eu preciso bloquear somente a célula onde a data for colocada por isso eu tentei repetir a linha abaixo:

Range("i" & linha).Locked = True

mas não funcionou...

porque qd a planilha for aberta ela estará desbloqueada, só que apos ser preenchida a data, não pode haver alteração manual na data que foi colocada...

se você puder ajudar, agradeço.

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Então vai ficar assim, você seleciona a planilha toda e marca toda ela como desbloqueada.

ActiveSheet.Unprotect ("Teste")

Dim ColunasC As Range

Set ColunasC = Range("C2:C20000")

If Not Application.Intersect(ColunasC, Range(Target.Address)) Is Nothing Then

linha = Target.Row

Range("i" & linha).Value = DateTime.Now

End If

Range("I"&linha).Select

Selection.Locked = True

ActiveSheet.Protect ("Teste"), DrawingObjects:=True, Contents:=True, Scenarios:=True

Link para o comentário
Compartilhar em outros sites

Está aparecendo o seguinte erro:

Erro em tempo de execução 1004

O método "Range" do objeto "_Worksheet" falhou.

Private Sub Worksheet_Change(ByVal Target As Range)

ActiveSheet.Unprotect ("123")

Dim ColunasC As Range

Set ColunasC = Range("C2:C20000")

If Not Application.Intersect(ColunasC, Range(Target.Address)) Is Nothing Then
linha = Target.Row
Range("i" & linha).Value = DateTime.Now

End If
Range("i" & linha).Select [B]---->>>Aparece erro nesta linha<<<-----[/B]
Selection.Locked = True
ActiveSheet.Protect ("123"), DrawingObjects:=True, Contents:=True, Scenarios:=True

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Opa! Desculpe, falha minha, considere este (O código de desbloqueio e bloqueio devem ficar entre o IF e End if). Fica assim:

Dim ColunasC As Range

Set ColunasC = Range("C2:C20000")

If Not Application.Intersect(ColunasC, Range(Target.Address)) Is Nothing Then

ActiveSheet.Unprotect ("Teste")

linha = Target.Row

Range("i" & linha).Value = DateTime.Now

Range("I" & linha).Locked = True

ActiveSheet.Protect ("Teste"), DrawingObjects:=True, Contents:=True, Scenarios:=True

End If

Link para o comentário
Compartilhar em outros sites

  • 4 meses depois...

Me tire uma duvida Flavio

nos exemplos acima, a formula mostra a hora e o nome do micro!

tem como ela mostrar o valor da celula...? por ex:

em uma planilha de controle de notas promissorias, na coluna B fica o valor das notas,

no caso do codigo, ele registra a hora so de selecionar a celula, ai no caso ela iria registrar o valor da celula antes do valor ser alterado...

tem como? e se tiver, como ficaria o codigo por favor!

Link para o comentário
Compartilhar em outros sites

  • Membro VIP
Me tire uma duvida Flavio

nos exemplos acima, a formula mostra a hora e o nome do micro!

tem como ela mostrar o valor da celula...? por ex:

em uma planilha de controle de notas promissorias, na coluna B fica o valor das notas,

no caso do codigo, ele registra a hora so de selecionar a celula, ai no caso ela iria registrar o valor da celula antes do valor ser alterado...

tem como? e se tiver, como ficaria o codigo por favor!

Posta sua planilha em www.sendspace.com que dá para fazer....

Link para o comentário
Compartilhar em outros sites

bom...:cool:

ai ta o link!

http://www.4shared.com/file/255381454/93806fdf/N_P.html

no caso ai... na primeira aba "N P" o valor é digitado na coluna "F" ai eu queria q o codigo salvase o valor em outra coluna, "que eu a colocaria oculta" ou ate mesmo, criar uma outra aba, que registraria as mudanças nas colunas de valor das abas "N P" e "N P R"...

:rolleyes:

ahhh! nao se esqueça de explicar como você fez..... rsrs

obrigado!

Link para o comentário
Compartilhar em outros sites

  • mês depois...

Tenho uma planilha de controle de datas de fechamento, a coluna 1 e 2 são codigo e nome da empresa, da 3 em diante são os meses nas impares e as pares tem a data, então quando declaro janeiro como fechado, a coluna 4 automaticamente assume as data atual, quando declaro fevereiro como fechado na coluna 5 a 6 assume a data do fechamento, e assim por diante. As colunas pares tem um ComboBox com as opções aberto e fechado. Gostaria de travar as celulas que são preenchidas com a data do fechamento logo após que esta seja preenchida.

Private Sub Worksheet_Change(ByVal Target As Range)

If Target.Column = 3 And IsEmpty(Cells(Target.Row, 4)) Then

Cells(Target.Row, 4) = Date

End If

If Target.Column = 5 And IsEmpty(Cells(Target.Row, 6)) Then

Cells(Target.Row, 6) = Date

End If

If Target.Column = 7 And IsEmpty(Cells(Target.Row, 8)) Then

Cells(Target.Row, 8) = Date

End If

If Target.Column = 9 And IsEmpty(Cells(Target.Row, 10)) Then

Cells(Target.Row, 10) = Date

End If

If Target.Column = 11 And IsEmpty(Cells(Target.Row, 12)) Then

Cells(Target.Row, 12) = Date

End If

If Target.Column = 13 And IsEmpty(Cells(Target.Row, 14)) Then

Cells(Target.Row, 14) = Date

End If

If Target.Column = 15 And IsEmpty(Cells(Target.Row, 16)) Then

Cells(Target.Row, 16) = Date

End If

If Target.Column = 17 And IsEmpty(Cells(Target.Row, 18)) Then

Cells(Target.Row, 18) = Date

End If

If Target.Column = 19 And IsEmpty(Cells(Target.Row, 20)) Then

Cells(Target.Row, 20) = Date

End If

If Target.Column = 21 And IsEmpty(Cells(Target.Row, 22)) Then

Cells(Target.Row, 22) = Date

End If

If Target.Column = 23 And IsEmpty(Cells(Target.Row, 24)) Then

Cells(Target.Row, 24) = Date

End If

If Target.Column = 25 And IsEmpty(Cells(Target.Row, 26)) Then

Cells(Target.Row, 26) = Date

End If

End Sub

Muito obrigado pela atenção.

Link para o comentário
Compartilhar em outros sites

  • 8 meses depois...
  • mês depois...

Bem, vou tentar as sugestões postadas. O meu caso é relativamente simples; um controle de dia e hora, que também não deve modificar, poid é um controle de entrada e saída de veículos oficiais

Vi o inconveniente de fazer algo e sempre precisar digitar a placa do carro a cada inclusão, noto que será algo muito ruim paa o usuário.

Preciso de uma luz, pois uso muito pouco o Excel;

Link para o comentário
Compartilhar em outros sites

  • Membro VIP

Bom dia Plinio

Seja bem vindo ao fórum.

Se você não quisr digitar a placa do veículo você pode usar um código que ao digitá-lo, a função PROCV vai procurar o dado em outro local da planilha ou até em outra planilha, e vai lançar a placa do veículo.

Ficaria mais fácil se você postasse a tua planilha ´com explicações, num site gratuíto como:

http://www.4shared.com/?signout=1

Depois cole o link da planilha aqui no fórum.

Um abraço.

Link para o comentário
Compartilhar em outros sites

Obrigado, Patropi. Ainda não cheguei a implementar nada, pois logo de cara percebi que deve ser algo bem pensado para não transformar num arquivo enorme daqui há algum tempo. Já havia pensado no cadastro de carros numa outra planília, como você citou, mas não pensei na função PROCV, e até agradeço pela dica. Agora, o problema maior será realizar a automação da inserção de data e hora atuais na linha, mas que não mude quando o usuário abrí-la novamente.

Tão logo eu faça alguma coisa, eu disponibilzo, saindo tudo certo ou não, pois penso que ajudará outros colegas. Mas agora vou aproveitar o feriando, rss.

Um bom descanso a todos.

Link para o comentário
Compartilhar em outros sites

Plinio.

A inserção de data e hora poderá ser feita com utilização de código VBA.

Um bom feriado.

E é justamente o que eu estou procurando, Patropi, pois a maioria das funções padronizadas não contemplam isso, pelo menos não consegui encontrar. E para dificultar, eu sou péssimo em VBA, uma vez que não uso há muitos anos. Estou lendo o que já foi postado para ver se alguma servirá para mim. Com certeza vão querer uma interface "amigável", inclusive.

Mei uma vez obrigado e um bom feriado também.

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novas respostas.

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...