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
  • Avatar do usuário
Por SandroLima
#37025
Boa tarde, pessoal.

O que está errado no início desse código?

Basicamente, ele insere uma linha no topo de uma tabela (TB_Atividades) copiando a formatação da linha logo abaixo.

Está apresentando a seguinte mensagem:
"Erro de compilação: Variável não definida."

E ele já funcionou antes... O que pode ser?
Código: Selecionar todos
Private Sub cmb_OK_Click()

    'A planilha "REGISTRO DE ATIVIDADES" recebeu o codename wsh_Atividades
    
Dim Tabela As ListObject
    Set Tabela = wsh_Atividades.ListObjects("TB_Atividades")
    
    On Error Resume Next
      
    Tabela.ListRows.Add (1), alwaysinsert
    Tabela.ListRows(2).Range.Copy
    Tabela.ListRows(1).Range.PasteSpecial xlPasteFormats
    Application.CutCopyMode = False
A expressão "Private Sub cmb_OK_Click()" está ficando grifada em amarelo. E o termo "alwaysinsert" em azul quando ocorre o erro.
Avatar do usuário
Por Reinaldo
Avatar
#37028
Aparentemente seu modulo está especificado com -->Option Explicit<--, isso obriga a declarar todos as variáveis.
na rotina acima a variável -->wsh_Atividades<-- não foi declarada
Por SandroLima
#37032
Assim?
Código: Selecionar todos
Dim wsh_Atividades as Worksheet 
Se for isso não funcionou... Mas vc está certo sobre o Option Explicit. Quando removi funcionou.

O que preciso fazer para funcionar mantendo o Option Explicit?
Por SandroLima
#37037
Tb não funcionou...

Estou enviando uma planilha para teste e verificação do erro.
Você não está autorizado a ver ou baixar esse anexo.
Avatar do usuário
Por gfranco
Avatar
#37038
Boa tarde.
Uma vez chamada pelo codename a planilha não precisa ser declarada mesmo utilizando-se o Option Explicit
O problema que eu pude observar no código é que faltou indicar valor para o argumento (não obrigatório) alwaysinsert que deve receber um valor (false ou true).

No site da microsoft,
https://docs.microsoft.com/en-us/office ... strows.add

se lê:

AlwaysInsert Opcional Variante Boolean . Especifica se os dados sempre serão deslocados nas células abaixo da última linha da tabela quando a nova linha for inserida, independentemente de a linha abaixo da tabela estar vazia. Se for True , as células abaixo da tabela serão deslocadas uma linha. Se False , se a linha abaixo da tabela estiver vazia, a tabela será expandida para ocupar essa linha sem alternar células abaixo dela; mas se a linha abaixo da tabela contiver dados, essas células serão deslocadas para baixo quando a nova linha for inserida.

logo, a omissão ou a especificação de um valor, proporcionará o retorno do funcionamento, conforme abaixo:


Código: Selecionar todos
Private Sub cmb_OK_Click()

    Dim Tabela As ListObject
    'Dim wsh_Cadastro As Object
    'Dim wsh_Cadastro As Worksheet
    
    Set Tabela = wsh_Cadastro.ListObjects("TB_Cadastro")
    
    Tabela.ListRows.Add (1), alwaysinsert:=True 'aqui está o valor true atribuído ( o que dá no mesmo de omitir)
    Tabela.ListRows(2).Range.Copy
    Tabela.ListRows(1).Range.PasteSpecial xlPasteFormats
    Application.CutCopyMode = False
    
    Tabela.ListRows(1).Range(1, 1).Value = Me.txt_Cadastro
    Tabela.ListRows(1).Range(1, 2).Value = Me.txt_Data
    Tabela.ListRows(1).Range(1, 3).Value = Me.txt_ID
    Tabela.ListRows(1).Range(1, 4).Value = Me.txt_Nome
    Tabela.ListRows(1).Range(1, 5).Value = Me.cbb_Sexo
    Tabela.ListRows(1).Range(1, 6).Value = Me.txt_DataNasc
    Tabela.ListRows(1).Range(1, 7).Value = Me.txt_Idade
    Tabela.ListRows(1).Range(1, 8).Value = Me.cbb_EstadoCivil
    Tabela.ListRows(1).Range(1, 9).Value = Me.txt_CPF
     
    Set Tabela = Nothing
    
    Columns.AutoFit
    
    LimparCampos
    
    MsgBox "Cadastro efetuado com sucesso.", vbInformation, "Cadastro de Paciente"
            
End Sub
Por SandroLima
#37040
Pronto....

Era isso mesmo.

Já tinha achado uma opção aqui que era a de adicionar as seguintes linhas ao início do código:
Código: Selecionar todos
Private Sub cmb_OK_Click()

    'A planilha "REGISTRO DE ATIVIDADES" recebeu o codename wsh_Atividades
    Dim Tabela As ListObject
    Dim NovoRegistro As ListRow
    
    Set Tabela = wsh_Atividades.ListObjects("TB_Atividades")
    Set NovoCadastro = Tabela.ListRows.Add
        
    On Error Resume Next
    Tabela.ListRows.Add (1), alwaysinsert:=True
    Tabela.ListRows(2).Range.Copy
    Tabela.ListRows(1).Range.PasteSpecial xlPasteFormats
    Application.CutCopyMode = False
E depois adicionei um código de filtro para que o último registro ficasse na primeira linha da tabela. E atendeu o que precisava também.

Mas realmente o que estava faltando era atribuir argumento ao valor. Por isso que funcionava antes.... em algum momento devo ter apagado sem querer.

Muito obrigado a vocês pela ajuda e pela aula.
Avatar do usuário
Por gfranco
Avatar
#37042
Quando quiser agradecer, clique em obrigado.
Se a dúvida foi sanada, marque o tópico como "resolvido"
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