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
Por Damnpiro
Posts
#45503
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.
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
Por Reinaldo
Avatar
#45504
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)
Por babdallas
#45505
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
Você não está autorizado a ver ou baixar esse anexo.
Por Damnpiro
Posts
#45508
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.
Por babdallas
#45510
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
Você não está autorizado a ver ou baixar esse anexo.
Por Damnpiro
Posts
#45516
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...
Por babdallas
#45517
Uma rotina não deve influenciar a outra. Se quiser, anexe a planilha e relate o bug para que eu possa verificar.
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