Página 1 de 1
Dúvida com código bem simples
Enviado: 12 Jul 2019 às 08:41
por Damnpiro
No anexo, as células em vermelho deveriam ser preenchidas com B A D.
O código é pra gerar cada sequência de 3 letras automaticamente. Ou seja, quando eu colocar A A A nas três primeiras células, as demais ele deveria ir preenchendo. Parece que está tudo funcionando, menos a parte do + 1. Creio que seja porque essa função sirva somente para células com números e nesse caso quero que some uma letra no alfabeto, como faço? E se tiver uma maneira mais fácil eu agradeceria muito pela explicação. Estou tentando aprender VBA por contra própria.
Muito obrigado,
Daniel.
Dúvida com código bem simples
Enviado: 12 Jul 2019 às 09:40
por Reinaldo
Creio não haver entendido a dinâmica da rotina, mas todo caractere tem uma referencia numérica obtida com a função ASC (no VBA), e um numero pode retornar um caractere utilizando a função Chr (no VBA)
assim a soma +1 pode ser efetuada--> Chr(Asc(ActiveCell.Offset(-1, 0).Value) + 1)
Re: Dúvida com código bem simples
Enviado: 12 Jul 2019 às 10:45
por babdallas
Veja se é o que deseja.
Código: Selecionar todosOption Explicit
Option Private Module
Public Sub PreencherSequencia()
Const bytTotalLetras As Byte = 26 'Total de letras do alfabeto
Const bytTotalCol As Byte = 3 'Total de colunas
Dim lngTotalSeq As Long 'Total de sequências
Dim lngConLin As Long 'Contador para as linhas
Dim lngContCol As Long 'Contador para as colunas
Dim strSeq() As String 'Matriz p/ armazenar os dados das sequências
Dim lngChar As Long 'Número de caractere para usar na função Char
lngTotalSeq = bytTotalLetras ^ bytTotalCol 'Total de sequências possíveis
ReDim strSeq(1 To lngTotalSeq, 1 To bytTotalCol) As String 'Redimensiona a matris de Dados
'Loop pelos linhas (de 1 até o total de sequências possíveis)
For lngConLin = 1 To lngTotalSeq
'Loop pelas colunas
For lngContCol = 1 To bytTotalCol
If lngContCol = 1 Then
lngChar = (lngConLin - _
VBA.IIf((lngConLin Mod (lngTotalSeq / CLng(bytTotalLetras))) = 0, _
1, _
0)) \ (lngTotalSeq / CLng(bytTotalLetras)) + 65
ElseIf lngContCol = 2 Then
lngChar = _
((lngConLin - 1) Mod (bytTotalLetras ^ lngContCol) - _
VBA.IIf((lngConLin Mod (bytTotalLetras ^ lngContCol)) = 0, _
1, _
0)) \ CLng(bytTotalLetras) + 65
Else
lngChar = (lngConLin - 1) Mod CLng(bytTotalLetras) + 65
End If
strSeq(lngConLin, lngContCol) = VBA.Chr(CharCode:=lngChar)
Next lngContCol
Next lngConLin
'Despeja a matriz no intervalo
With wshSequencia
.Range("A1:C" & lngTotalSeq) = strSeq
End With
End Sub
Dúvida com código bem simples
Enviado: 12 Jul 2019 às 11:15
por Damnpiro
Muito obrigado pela atenção babdallas, mas não era isso rsrs. Eu quero que ao clicar no botão ele preencha a próxima linha com base na linha anterior. Na planilha que mandei, ao clicar no botão, as 3 células em vermelho devem ser preenchidas com B A D, e se clicar novamente, as células embaixo delas deveriam ser preenchidas com B A E, e assim por diante até B A Z, ai depois B B A, B B B. Mas somente efetuar uma sequência ao clicar o botão. Não é pra fazer um loop e preencher tudo automaticamente.
Outro exemplo. Se numa planilha em branco eu manualmente colocar A A A nas 3 primeiras colunas e clicar no botão. A segunda linha (A2, B2 e C2) deverão ser preenchidas com A A B.
É que estou fazendo uma planilha de cadastro de materiais e na empresa eles são registrados com letras. Toda vez que chega um material novo é aumentado uma letra. Queria que gerasse isso automaticamente.
Re: Dúvida com código bem simples
Enviado: 12 Jul 2019 às 11:44
por babdallas
Veja agora então
Código: Selecionar todosOption Explicit
Option Private Module
Public Sub PreencherProximaSequencia()
Dim lngProxLin As Long
Application.ScreenUpdating = False
With wshSequencia
lngProxLin = .Cells(.Rows.Count, 1).End(xlUp).Row + 1 'Proxima linha a ser preenchida
If VBA.Asc(.Range("C" & lngProxLin - 1).Value2) < 90 Then 'Verifica se a coluna C tem
'letra menor que Z
.Range("A" & lngProxLin).Value2 = .Range("A" & lngProxLin - 1).Value2
.Range("B" & lngProxLin).Value2 = .Range("B" & lngProxLin - 1).Value2
.Range("C" & lngProxLin).Value2 = VBA.Chr(VBA.Asc(.Range("C" & lngProxLin - 1).Value2) + 1)
ElseIf VBA.Asc(.Range("B" & lngProxLin - 1).Value2) < 90 Then 'Verifica se a coluna B tem _
letra menor que Z
.Range("A" & lngProxLin).Value2 = .Range("A" & lngProxLin - 1).Value2
.Range("B" & lngProxLin).Value2 = VBA.Chr(VBA.Asc(.Range("B" & lngProxLin - 1).Value2) + 1)
.Range("C" & lngProxLin).Value2 = "A"
Else
.Range("A" & lngProxLin).Value2 = VBA.Chr(VBA.Asc(.Range("A" & lngProxLin - 1).Value2) + 1)
.Range("B" & lngProxLin).Value2 = "A"
If VBA.Asc(.Range("C" & lngProxLin - 1).Value2) = 90 And _
VBA.Asc(.Range("B" & lngProxLin - 1).Value2) = 90 Then
.Range("C" & lngProxLin).Value2 = "A"
Else
.Range("C" & lngProxLin).Value2 = .Range("C" & lngProxLin - 1).Value2
End If
End If
End With
Application.ScreenUpdating = True
End Sub
Re: Dúvida com código bem simples
Enviado: 12 Jul 2019 às 12:32
por Damnpiro
Show babdallas, funcionou perfeito! Mas fiquei com uma dúvida, por que ao excluir o código PreencherSequenciaToda() o PreencherProximaSequenci() parou de funcionar?! Funcionou com uns bugs...
Re: Dúvida com código bem simples
Enviado: 12 Jul 2019 às 12:52
por babdallas
Uma rotina não deve influenciar a outra. Se quiser, anexe a planilha e relate o bug para que eu possa verificar.
Dúvida com código bem simples
Enviado: 12 Jul 2019 às 17:15
por Damnpiro
Ah não, é porque é CASE SENSITIVE. Tudo certo. SHOW! Obrigado