Notifications
Clear all

ERRO DE COMPILAÇÃO

15 Posts
3 Usuários
0 Reactions
2,208 Visualizações
(@alcir)
Posts: 0
New Member
Topic starter
 

Boa Tarde pessoal, estou precisando de uma ajuda de VCs para decifrar esse enigma, pois o formulário de pesquisa não abre devido a um erro que não consigo localizar ...

Desde já agradeço !!!

End Sub

Private Sub txtCartaoSUS_Change()

End Sub

Private Sub UserForm_Initialize() <-- Esta linha aparece destacado em Amarelo
'lv.ListItems.Clear 'Clear ListView from previous filled data
lstLista.ColumnHeaders.Clear 'Clear the Column Headers <-- Nesta linha lstLista aparece destacado Azul
lstLista.ListItems.Clear
With lstLista
.Gridlines = True
.View = lvwReport
'.FullRowSelect
' .ColumnHeaders.Add Text:="ID", Width:=20
' .ColumnHeaders.Add Text:="NOME", Width:=60
' .ColumnHeaders.Add Text:="Endereço", Width:=120
' .ColumnHeaders.Add Text:="CartaoSUS", Width:=120
' .ColumnHeaders.Add Text:="Registro", Width:=7
' .ColumnHeaders.Add Text:="BAIRRO", Width:=50
End With

'preenche o cboDirecao e seleciona o primeiro item
cboDirecao.Clear
cboDirecao.AddItem "Ascendente"
cboDirecao.AddItem "Descendente"
cboDirecao.ListIndex = 0

Call DefinePlanilhaDados
Call PopulaCidades
Call PopulaListBox(vbNullString, vbNullString, vbNullString, vbNullString, vbNullString)
End Sub

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(txtNomePaciente.Text, txtAdmissao.Text, txtEndereco.Text, txtRegistro.Text, txtCartaoSUS.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

Private Sub PopulaCidades()
Dim conn As ADODB.Connection
Dim rst As ADODB.Recordset
Dim sql As String

Set conn = New ADODB.Connection
With conn
.Provider = "Microsoft.JET.OLEDB.4.0"
.ConnectionString = "Data Source=" & caminhoArquivoDados & ";Extended Properties=Excel 8.0;"
.Open
End With

sql = "SELECT DISTINCT Bairro FROM [Fornecedores$]"

Set rst = New ADODB.Recordset
With rst
.ActiveConnection = conn
.Open sql, conn, adOpenDynamic, _
adLockBatchOptimistic
End With

Do While Not rst.EOF
If Not IsNull(rst(0).Value) Then
lstCidades.AddItem rst(0).Value
End If
rst.MoveNext
Loop

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

End Sub

Private Sub PopulaListBox(ByVal NomePaciente As String, _
ByVal Admissao As String, _
ByVal Endereco As String, _
ByVal Registro As String, _
ByVal CartaoSUS 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(txtNomePaciente.Text, txtAdmissao.Text, txtEndereco.Text, txtRegistro.Text, txtCartaoSUS.Text)

'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 = 0 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

' 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

Private Sub TamanhoColAutomatico()
Dim Column As Long
Dim Counter As Long
Counter = 0
For Column = Counter To lstLista.ColumnHeaders.Count - 2
SendMessage lstLista.hWnd, LVM_SETCOLUMNWIDTH, Column, LVSCW_AUTOSIZE_USEHEADER
Next
End Sub

Public Function CheckNull(FieldValue As Variant)
On Error GoTo Error

If IsNull(FieldValue) Then
CheckNull = ""
Else
CheckNull = FieldValue
End If
' Exit Sub
Error:
'GeneralErrors "CheckNull", Err.Number, Err.Description
Resume Next
End Function

Private Function PreecheRecordSet(ByVal NomePaciente As String, _
ByVal Admissao As String, _
ByVal Endereco As String, _
ByVal Registro As String, _
ByVal CartaoSUS 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

Set conn = New ADODB.Connection
With conn
.Provider = "Microsoft.JET.OLEDB.4.0"
.ConnectionString = "Data Source=" & caminhoArquivoDados & ";Extended Properties=Excel 8.0;"
.Open
End With

sql = "SELECT * FROM [Fornecedores$]"

'monta a cláusula WHERE
'NomeDoPaciente
Call MontaClausulaWhere(txtNomePaciente.Name, "NomeDoPaciente", sqlWhere)

'Admissão
Call MontaClausulaWhere(txtAdmissao.Name, "Admissão", sqlWhere)

'Endereço
Call MontaClausulaWhere(txtEndereco.Name, "Endereço", sqlWhere)

'Bairro
For i = 1 To lstCidades.ListCount
'verifica se o item está selecionado
If lstCidades.Selected(i - 1) Then
'Monta a cláusula WHERE com OR
Debug.Print lstCidades.List(i - 1) & " selecionado"
If sqlWhere <> vbNullString Then
sqlWhere = sqlWhere & " OR"
End If
sqlWhere = sqlWhere & " UCASE(Bairro) LIKE UCASE('%" & Trim(lstCidades.List(i - 1)) & "%')"
End If
Next

'Registro
Call MontaClausulaWhere(txtRegistro.Name, "Registro", sqlWhere)

'CartaoSUS
Call MontaClausulaWhere(txtCartaoSUS.Name, "CartaoSUS", sqlWhere)

'faz a união da string SQL com a cláusula WHERE
If sqlWhere <> vbNullString Then
sql = sql & " WHERE " & sqlWhere
End If

'faz a união da string SQL com a cláusula ORDER BY
If cboOrdenarPor.ListIndex <> -1 Then
sqlOrderBy = " ORDER BY " & cboOrdenarPor.List(cboOrdenarPor.ListIndex, 0)
'define a direção
Select Case cboDirecao.ListIndex
Case Ascendente
sqlOrderBy = sqlOrderBy & " ASC"
Case Descendente
sqlOrderBy = sqlOrderBy & " DESC"
End Select
'une a query order ao sql
sql = sql & sqlOrderBy
End If

Set rst = New ADODB.Recordset
rst.CursorLocation = adUseClient
With rst
.ActiveConnection = conn
.Open sql, conn, adOpenForwardOnly, _
adLockBatchOptimistic
End With

Set rst.ActiveConnection = Nothing

' Fecha a conexão.
conn.Close

Set PreecheRecordSet = rst
Exit Function
TrataErro:
Set rst = Nothing
End Function

Private Sub MontaClausulaWhere(ByVal NomeControle As String, ByVal NomeCampo As String, ByRef sqlWhere As String)
'Admissao
If Trim(Me.Controls(NomeControle).Text) <> vbNullString Then
If sqlWhere <> vbNullString Then
sqlWhere = sqlWhere & " AND"
End If
sqlWhere = sqlWhere & " UCASE(" & NomeCampo & ") LIKE UCASE('%" & Trim(Me.Controls(NomeControle).Text) & "%')"
End If
End Sub

'Faz a transpasição de um array, transformando linhas em colunas
Private Function Array2DTranspose(avValues As Variant) As Variant
Dim lThisCol As Long, lThisRow As Long
Dim lUb2 As Long, lLb2 As Long
Dim lUb1 As Long, lLb1 As Long
Dim avTransposed As Variant

If IsArray(avValues) Then
On Error GoTo ErrFailed
lUb2 = UBound(avValues, 2)
lLb2 = LBound(avValues, 2)
lUb1 = UBound(avValues, 1)
lLb1 = LBound(avValues, 1)

ReDim avTransposed(lLb2 To lUb2, lLb1 To lUb1)
For lThisCol = lLb1 To lUb1
For lThisRow = lLb2 To lUb2
avTransposed(lThisRow, lThisCol) = avValues(lThisCol, lThisRow)
Next
Next
End If

Array2DTranspose = avTransposed
Exit Function

ErrFailed:
Debug.Print Err.Description
Debug.Assert False
Array2DTranspose = Empty
Exit Function
Resume
End Function

 
Postado : 09/02/2015 10:13 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Dê uma olhada aqui:

viewtopic.php?t=14173&p=73991

 
Postado : 09/02/2015 10:46 am
(@alcir)
Posts: 0
New Member
Topic starter
 

Meu Amigo, sua dica é Ótima e esclarecedora, mas no meu caso não tá dando erro 424
Veja abaixo na imagem o que acontece quando tento abrir o formulário de pesquisa.

O Formulário de cadastro abre normalmente e consigo realizar novos cadastros de pacientes sem
problemas, e isso só ocorre nesta máquina aqui no serviço, na minha casa os formulários funcionam
normalmente sem nenhum problema...

 
Postado : 09/02/2015 3:46 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Tá, mas... vc tentou fazer o que o Fernando indicou?

É simples, rápido, não dói e não paga nada.

 
Postado : 10/02/2015 5:11 am
(@alcir)
Posts: 0
New Member
Topic starter
 

Tá, mas... vc tentou fazer o que o Fernando indicou?

É simples, rápido, não dói e não paga nada.

Bom Dia !!!

Sim, eu fiz o que ele orientou, mas o que ocorre é que na minha máquina tudo funciona normal e em algumas máquinas na empresa em que trabalho tambem tudo funciona normal, mas na máquina em que eu tenho que rodar o formulário para uso de todos dá o erro que eu exemplifiquei acima...

Espero haver uma solução já que está tudo normal na compilação do código, pelo menos no que observei não reparei nenhum erro..

Desde já agradeço a todos !!!

 
Postado : 10/02/2015 7:17 am
(@gtsalikis)
Posts: 2373
Noble Member
 

Tá, mas vc fez na máquina que tá tendo o problema?

Veja, se tudo roda normal, o problema não é no código, é na máquina.

Vc tb pode dar uma pesquisada no fórum. Além da solução proposta pelo Ernando, tem outras, explicando que esse tipo de erro pode ocorrer devido (se não me engano, às bibliotecas do Excel), e dando outras sugestões.

 
Postado : 10/02/2015 7:20 am
(@alcir)
Posts: 0
New Member
Topic starter
 

Tá, mas vc fez na máquina que tá tendo o problema?

Veja, se tudo roda normal, o problema não é no código, é na máquina.

Vc tb pode dar uma pesquisada no fórum. Além da solução proposta pelo Ernando, tem outras, explicando que esse tipo de erro pode ocorrer devido (se não me engano, às bibliotecas do Excel), e dando outras sugestões.

Sim, fiz na própria máquina onde o programa em VBA tem que rodar, mas nesse caso a dica do Fernando não surtiu efeito, como aqui na empresa são várias máquinas testei em outras e tudo funciona perfeitamente, mas na máquina onde o formulário de Cadastro e Pesquisa tem que estar dá erro, mas vou continuar procurando por uma solução, pode ser que seja realmente nas bibliotecas do Excel ...

Muito obrigado meus amigos !!!

 
Postado : 10/02/2015 9:41 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Uma alternativa que eu não gosto, seria reinstalar o Excel (ou todo o Office)... mas não tenho como garantir que o problema sumirá...

Eu já não gosto e usar o ListView exatamente por causa disso... Nunca usei e por isso nunca vi esse problema..

Verifique se a versão do Excel é a mesma em todas as máquinas!
Outra coisa, vc está se referindo diretamente ao Listview pelo seu nome, sem indicar aonde ele está... duvido que resolva, mas procure usar o nome do formulário tb...

Exemplo, com textbox:
Ao invés de usar:

textbox1.text = "bla bla bla"

prefira usar:

frmSeuFormulario.textbox1.text = "blablabla"
 
Postado : 10/02/2015 10:29 am
(@alcir)
Posts: 0
New Member
Topic starter
 

Uma alternativa que eu não gosto, seria reinstalar o Excel (ou todo o Office)... mas não tenho como garantir que o problema sumirá...

Verifique se a versão do Excel é a mesma em todas as máquinas!
Outra coisa, vc está se referindo diretamente ao Listview pelo seu nome, sem indicar aonde ele está... duvido que resolva, mas procure usar o nome do formulário tb...

Sim, aqui na Empresa Fernando o pacote do Office instalado em todas as máquinas é a versão 2007, eu desenvolvi o aplicativo na minha casa em uma máquina com Office 2013, mas de antemão já descarto a possibilidade de incompatibilidade de versões porque na minha casa roda tudo perfeito e já experimentei em 7 máquinas aqui da empresa que tem Office 2007 e funciona também, só em uma máquina e justamente na que teria que funcionar é que está dando esse erro...

Como o programa está rodando perfeitamente em várias máquinas também descarto a possibilidade de ter erro na estrutura do código, caso fosse isso daria erro em todas as máquinas e não apenas em um único computador...
Não tenho acesso como administrador e isso limita minha atuação em busca de uma solução técnica no Hardware.

Obrigado por estar na busca de uma solução juntamente comigo...

 
Postado : 10/02/2015 11:14 am
(@fernandofernandes)
Posts: 43750
Illustrious Member
 

Muitas vezes, o erro é gerado por não ser encontrado a biblioteca/referencia que suporta o listview (se não me falha a memoria:= mscomctl.ocx), ou a mesma estar corrompida, ou ter sido aplicada/desenvolvido com uma uma versão superior a existente na maquina onde ocorre o problema.
Verifique se onde ocorre oproblema é a mesma versão da biblioteca/ocx.
Inclusive se for em um equipamente 64 bits poderá/ocorrerá problema.
Já passei por situações, onde foi resovida excluindo o listview, e incluindo um novo untilizando a mesma nomenclatura/definições

 
Postado : 10/02/2015 11:34 am
(@alcir)
Posts: 0
New Member
Topic starter
 

Reinaldo, estou com uma aplicação totalmente pronta, funcionando perfeitamente em inúmeras máquinas, ter que excluir e fazer tudo de novo é justamente o que não quero fazer, por isso estou em busca de uma solução sem desistir de meu projeto ...

 
Postado : 10/02/2015 12:36 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Alcir,

O Reinaldo falou em excluir somente o listview.
Não precisa refazer tudo não.

Eu já tive um projeto em que precisei fazer isso também. Não mexi nas planilhas nem no código.

 
Postado : 10/02/2015 12:40 pm
(@alcir)
Posts: 0
New Member
Topic starter
 

Ah! Tá eu estou tão estressado com isso que entendi errado...

Obrigado !!!

Isso não vai fazer que o programa apresente mais erros não ?

 
Postado : 10/02/2015 12:45 pm
(@gtsalikis)
Posts: 2373
Noble Member
 

Bom, eu acredito que não.

Mas, como já aprendi de longa data: toda vez que vou alterar uma vírgula na planilha, faço uma cópia e compacto, antes de começar.

Não sei se sou eu o azarado, mas...

Se tudo der errado, se der problema, a cópia intacta está ali.

 
Postado : 10/02/2015 1:03 pm
(@alcir)
Posts: 0
New Member
Topic starter
 

kkkkkkkkk

Eu faço cópias também, porque o seguro morreu de velho diz o ditado..

 
Postado : 10/02/2015 2:03 pm