Notifications
Clear all

Problema em adaptação

15 Posts
3 Usuários
0 Reactions
3,429 Visualizações
(@joocta)
Posts: 187
Estimable Member
Topic starter
 

Estou adaptando um modelo de cadastro para moedas, a parte de cadastro esta feita, consegui fazer a parte das imagens.
Agora estou na parte da pesquisa e esta dando um erro:

Private Function PreecheRecordSet(ByVal Codigo As String, _
ByVal Periodo As String, _
ByVal Padrao As String, _
ByVal Conservacao As String, _
ByVal Ano As String) As Recordset

On Error GoTo TrataErro

Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sql As String
Dim sqlWhere As String
Dim sqlOrderBy As String
Dim i As Integer
Dim campo As Field
Dim myArray() As Variant........"

Aparece esse erro:

Erro de Compilação:

O tipo definido pelo usuário não foi definido.

Alguém pode me dar uma orientação?

 
Postado : 18/11/2016 5:55 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Pelo erro pode ser que você tem alguma Variável a qual não foi declarada e definido o Tipo:
Veja :
Módulo 5 - Lição 14 - Funções do VBA - Funções de Tipo - Parte 1
http://www.juliobattisti.com.br/cursos/ ... lo5/14.asp

Módulo 5 - Lição 08 - VBA - Declaração de Variáveis
http://www.juliobattisti.com.br/cursos/ ... lo5/08.asp

Veja tambem em Referências, se tem alguma com a indicação de AUSENTE.

Reveja todas as Variáveis se estão corretas e constam em todas as rotinas.

[]s

 
Postado : 18/11/2016 9:23 pm
(@joocta)
Posts: 187
Estimable Member
Topic starter
 

Bom dia Mauro,
Era na biblioteca.
Mas agora estou com outro problema:

aos poucos estou conseguindo fazer as adaptações, fazendo pesquisas, ativando algumas bibliotecas.
Me deparei com esse erro estou pesquisando, vi varias explicações, mas ainda não consegui encontrar o erro:

A Variavél do objeto ou a variavél do bloco with não foi definida 91
VBA Project.

Fazendo a depuração vi que a variavel indiceTemp não esta recebendo o valor de cboOrdenarPor.ListIndex, fazendo com que fique com o Valor=0.
O que esta dando errado? o campo que pego é um codigo de catalogo que nao é numerado automaticamente e esta na terceira coluna, o que esta na versão original e o da primeira coluna.

Private Sub PopulaListBox(ByVal Codigo As String, _
ByVal Periodo As String, _
ByVal Padrao As String, _
ByVal Metal As String, _
ByVal Ano As String)

On Error GoTo TrataErro

Dim rst As ADODB.Recordset
Dim campo As Field
Dim myArray() As Variant
Dim i As Integer
Dim li As ListItem, fld As Field, ch As ColumnHeader

Dim Column As Long
Dim Counter As Long
Counter = 0

Set rst = PreecheRecordSet(Codigo, Periodo, Padrao, Metal, Ano)

'preenche o combobox com os nomes dos campos
'persiste o índice
Dim indiceTemp As Long
indiceTemp= cboOrdenarPor.ListIndex
cboOrdenarPor.Clear
For Each campo In rst.Fields
cboOrdenarPor.AddItem campo.Name
Next
'recupera o índice selecionado
cboOrdenarPor.ListIndex = indiceTemp

'Colunas a Preencher Inicia na Primeira
For i = 2 To rst.Fields.Count - 1 'For i = 1 : a partir da 2ª coluna
Set ch = lstLista.ColumnHeaders.Add(, , rst.Fields(i).Name)
'ch.Width = 48 'Define o Tamanho de Todas as COLUNAS
'MsgBox rst.Fields(i).Name
Next

'Clear the Column Headers
lstLista.ListItems.Clear

'coloca as linhas do RecordSet num Array, se houver linhas neste
If Not rst.BOF Then
Do While Not rst.EOF

'Preenche o LISTVIEW a partir da 2ª Coluna
Set li = lstLista.ListItems.Add(, "k" & rst.Fields(0), CheckNull(rst.Fields(1)))
'Fill in the rest of the columns
For i = 2 To rst.Fields.Count - 1
li.SubItems(i - 1) = CheckNull(rst.Fields(i))

'Preenche o LISTVIEW a partir da 1ª Coluna
' Set li = lstLista.ListItems.Add(, "k" & rst.Fields(0), CheckNull(rst.Fields(0)))
'Fill in the rest of the columns
' For i = 1 To rst.Fields.Count - 1
' li.SubItems(i) = CheckNull(rst.Fields(i))
Next

rst.MoveNext 'Move to next record
Loop

'Define os Tamanhos das colunas automaticamente
Call TamanhoColAutomatico

End If
'atualiza o label de mensagens
If rst.RecordCount <= 0 Then
lblMensagens.Caption = rst.RecordCount & " registros encontrados"
Else
lblMensagens.Caption = rst.RecordCount & " registros encontrados"
End If

Exit Sub
 
Postado : 19/11/2016 7:21 am
(@joocta)
Posts: 187
Estimable Member
Topic starter
 

Estou enviando a parte que esta dando problema.
Alguém pode ajudar?

 
Postado : 20/11/2016 7:00 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Somente parte de seu arquivo fica praticamente impossivel determinar/corrigir a origem do erro. Note que o frmCadastro e parte integrante desse arquivo, e a partir dele que a pesquisa e acionada.
Cross: http://www.tomasvasquez.com.br/forum/vi ... 464#p20464

 
Postado : 21/11/2016 7:27 am
(@joocta)
Posts: 187
Estimable Member
Topic starter
 

Alterado meu amigo...
Espero que ajude. Preciso encontrar esse erro

 
Postado : 21/11/2016 10:34 am
(@joocta)
Posts: 187
Estimable Member
Topic starter
 

Estou com dor de cabeça com esse erro...

 
Postado : 23/11/2016 1:15 pm
(@manoels)
Posts: 0
New Member
 

Ola joocta,

o erro esta na Sub Exportar, verifique txtConservacao.Text

Private Sub Exportar()
    Dim i As Integer
    Dim NewWorkBook As Workbook
    Dim rst As ADODB.Recordset
    ' Preenche o RecordSet com os filtros atuais
    Set rst = PreecheRecordSet(txtCodigo.Text, txtPeriodo.Text, txtPadrao.Text, txtConservacao.Text, txtAno.Text)
    'cria um novo Workbook
    Set NewWorkBook = Application.Workbooks.Add
    ' Efetua loop em todos os campos, retornando os nomes de campos
    ' à planilha.
    For i = 0 To rst.Fields.Count - 1
        NewWorkBook.Sheets(1).Range("A1").Offset(0, i).Value = rst.Fields(i).Name
    Next i

    NewWorkBook.Sheets(1).Range("A2").CopyFromRecordset rst
    NewWorkBook.Activate
End Sub
 
Postado : 26/11/2016 9:58 am
(@manoels)
Posts: 0
New Member
 

Ola Joocta,

como não da para alterar o post anterior, o erro 91 vem da função PreecheRecordSet()

 
Postado : 26/11/2016 11:22 am
(@joocta)
Posts: 187
Estimable Member
Topic starter
 

ManoelS, foi um deslize meu,
Troquei, o txtConservacao na verdade é txtMetal,

mas o erro que falo continua e ele esta dando na linha da Populalistbox:

For Each campo In rst.Fields

Private Sub PopulaListBox(ByVal Codigo As String, _
                          ByVal Periodo As String, _
                          ByVal Padrao As String, _
                          ByVal Metal As String, _
                          ByVal Ano As String)

    On Error GoTo TrataErro

    Dim rst As ADODB.Recordset
    Dim campo As Field
    Dim myArray() As Variant
    Dim i As Integer
    Dim li As ListItem, fld As Field, ch As ColumnHeader

Dim Column As Long
Dim Counter As Long
Counter = 0

Set rst = PreecheRecordSet(Codigo, Periodo, Padrao, Metal, Ano)

    'preenche o combobox com os nomes dos campos
    'persiste o índice
    Dim indiceTemp As Long
    indiceTemp = cboOrdenarPor.ListIndex
    cboOrdenarPor.Clear
    For Each campo In rst.Fields
        cboOrdenarPor.AddItem campo.Name
    Next
    'recupera o índice selecionado
    cboOrdenarPor.ListIndex = indiceTemp

        'Colunas a Preencher Inicia na Primeira
        For i = 2 To rst.Fields.Count - 1 'For i = 1 : a partir da 2ª coluna
            Set ch = lstLista.ColumnHeaders.Add(, , rst.Fields(i).Name)
            'ch.Width = 48 'Define o Tamanho de Todas as COLUNAS
            'MsgBox rst.Fields(i).Name
        Next
 
'Clear the Column Headers
 lstLista.ListItems.Clear

    'coloca as linhas do RecordSet num Array, se houver linhas neste
    If Not rst.BOF Then
    Do While Not rst.EOF
        
        'Preenche o LISTVIEW a partir da 2ª Coluna
         'Set li = lstLista.ListItems.Add(, "k" & rst.Fields(0), CheckNull(rst.Fields(1)))
            'Fill in the rest of the columns
            'For i = 2 To rst.Fields.Count - 1
                'li.SubItems(i - 1) = CheckNull(rst.Fields(i))
         
         'Preenche o LISTVIEW a partir da 1ª Coluna
         Set li = lstLista.ListItems.Add(, "k" & rst.Fields(0), CheckNull(rst.Fields(3)))
               'Fill in the rest of the columns
                For i = 3 To rst.Fields.Count - 1
                    li.SubItems(i) = CheckNull(rst.Fields(i))
                Next
            
                   rst.MoveNext 'Move to next record
             Loop
        
        'Define os Tamanhos das colunas automaticamente
        Call TamanhoColAutomatico
        
       End If
     'atualiza o label de mensagens
    If rst.RecordCount <= 0 Then
        lblMensagens.Caption = rst.RecordCount & " registros encontrados"
    Else
        lblMensagens.Caption = rst.RecordCount & " registros encontrados"
    End If

      
    Exit Sub

    ' Fecha o conjunto de registros.
    Set rst = Nothing
    ' Fecha a conexão.
    'conn.Close

TrataSaida:
    Exit Sub
TrataErro:
    Debug.Print Err.Description & vbNewLine & Err.Number & vbNewLine & Err.Source
        MsgBox Err.Description & vbNewLine & Err.Number & vbNewLine & Err.Source
    Resume TrataSaida
End Sub
 
Postado : 26/11/2016 2:12 pm
(@joocta)
Posts: 187
Estimable Member
Topic starter
 

Será que algum amigo poderia me ajudar falando o que faz cada uma das linhas da Populalistbox, Acho que o erro esta aqui, mas gostaria de entender o que faz, estou fazendo a adaptação, mas da um erro de variável não definida.
Att,
Joocta.

 
Postado : 05/12/2016 5:49 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Joocta, um dos maiores problemas quando se opta por ajustar modelos prontos com informações diferentes é não atentarmos para os nomes dos campos, Controles e Variáveis.
E para se chegar a resolução quando começam dar os erros, fica complicado e se tem de analisar com muita calma devido as complexidades das instruções uma vez que a maioria são dependentes.
Em seu modelo, você tinha referencias com nomes com acento e sem acento, por exemplo "Padrão" é diferente de "Padrao", tem instrução que ainda estava citando "Cidade" em vez de "Conservacao" alem de outras particularidades que interferem diretamente nos resultados, como a alteração das linhas no For na PopulaListBox.

A Rotina PopulaListBox está toda comentada, não tem muita coisa a se acrescentar, para se conhecer melhor o procedimento, procure acompanhar a rotina Passo a Passo utilizando a tecla F8.

Segue o modelo ajustado, faça os testes e veja se é isto.

 
Postado : 09/12/2016 1:32 pm
(@joocta)
Posts: 187
Estimable Member
Topic starter
 

Realmente Mauro.. e para quem esta começando fica pior ainda. Rsrs.
Uma outra pergunta.. No Listbox, aparece todos os campos. Tem como escolher somente alguns?
Att,
Joocta.

 
Postado : 09/12/2016 6:23 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Realmente Mauro.. e para quem esta começando fica pior ainda. Rsrs.
Uma outra pergunta.. No Listbox, aparece todos os campos. Tem como escolher somente alguns?
Att,
Joocta.

Joocta, em primeiro lugar, como está aprendendo, tem de saber a diferença entre os Controles ListBox e ListView, em sua questão você cita "ListBox", mas na verdade o controle usado é o ListView, quando fiz a alteração do Modelo Original que utilizava ListBox para ListView, não cheguei a alterar o nome da rotina, ficando PopulaListBox, pesquise sobre os Controles e verá as diferenças entre os dois, de inicio o ListView permite trabalharmos melhor com várias propriedades que o ListBox não tem.

Quanto a questão das colunas, infelizmente o CopyFromRecordset não tem como separar as colunas, tem de ser feito de forma individual.
Como você colocou a mesma questão no Forum do Tomas, veja que lá temos um Tópico somente para duvidas no "Modelo de Aplicativo de Cadastro em VBA no Microsoft Excel" - http://www.tomasvasquez.com.br/forum/viewforum.php?f=5 , de uma pesquisada lá que ja tem até adaptação para ser utilizada com o Acces.

[]s

 
Postado : 09/12/2016 9:57 pm
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Realmente Mauro.. e para quem esta começando fica pior ainda. Rsrs.
Uma outra pergunta.. No Listbox, aparece todos os campos. Tem como escolher somente alguns?
Att,
Joocta.

Joocta, em primeiro lugar, como está aprendendo, tem de saber a diferença entre os Controles ListBox e ListView, em sua questão você cita "ListBox", mas na verdade o controle usado é o ListView, quando fiz a alteração do Modelo Original que utilizava ListBox para ListView, não cheguei a alterar o nome da rotina, ficando PopulaListBox, pesquise sobre os Controles e verá as diferenças entre os dois, de inicio o ListView permite trabalharmos melhor com várias propriedades que o ListBox não tem.

Quanto a questão das colunas, infelizmente o CopyFromRecordset não tem como separar as colunas, tem de ser feito de forma individual.
Como você colocou a mesma questão no Forum do Tomas, veja que lá temos um Tópico somente para duvidas no "Modelo de Aplicativo de Cadastro em VBA no Microsoft Excel" - http://www.tomasvasquez.com.br/forum/viewforum.php?f=5 , de uma pesquisada lá que ja tem até adaptação para ser utilizada com o Acces.

[]s

 
Postado : 09/12/2016 9:57 pm