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 todos
Option 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 todos
Option 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