Sintaxe do Vlookup e problemas de entrada do usuário
-
20-12-2019 - |
Pergunta
Estou tentando criar uma macro que compara duas planilhas inseridas pelo usuário e depois move as diferenças para planilhas diferentes, dependendo do motivo da diferença.
O código primeiro pede a entrada dos dados mais recentes e abre essa planilha.Em seguida, ele solicita a localização dos dados mais antigos para comparar, mas não os abre.Ele adiciona as folhas necessárias para copiar.
Em seguida, ele desce coluna por célula, procurando a série correspondente na segunda pasta de trabalho (isso é principalmente para garantir que a comparação dos dados corretos caso a formatação esteja desativada).Depois de encontrar a série correspondente, ele compara a segunda série para ambas as entradas e dependendo se é uma entrada diferente ou nova em uma das planilhas.
O principal problema que estou tendo é com o VLookup.Está tendo vários erros 424, 1004 e erros de expressão de compilação.Preciso de um pouco de orientação sobre por que está tendo esses problemas.Eu pesquisei e descobri muito sobre a necessidade de colchetes para fazer referência a um arquivo, mas quando sigo exatamente esses formatos, ocorre o erro de expressão.
Qualquer conselho é apreciado.
Sub Compare()
'Open workbooks
''Worksheet 1
Dim filter As String
Dim caption As String
Dim WB1FN As String
Dim WB1 As Workbook
filter = "Excel Sheets (*.xlsx),*.xlsx"
caption = "Please select newest equipment file"
MsgBox (caption)
WB1FN = Application.GetOpenFilename(filter, , caption)
If WB1FN = "False" Then
MsgBox "File not selected to import"
Exit Sub
End If
Set WB1 = Application.Workbooks.Open(WB1FN)
''Worksheet 2
Dim caption2 As String
Dim WB2FN As String
filter = "Excel Sheets (*.xlsx),*.xlsx"
caption2 = "Please select previous equipment file"
MsgBox (caption2)
WB2FN = Application.GetOpenFilename(filter, , caption)
If WB2FN = "False" Then
MsgBox "File not selected to import"
Exit Sub
End If
'Comparing data
''MS find and compare
Dim MS1 As String
Dim ESN1 As String
Dim ESN2 As String
Dim LastRow As Long
Dim i As Integer
Dim d As Integer
Dim n As Integer
Dim Filename As String
d = 4
n = 4
Set WB1 = ActiveWorkbook
'Create sheets
Sheets.Add(After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)).Name = "A"
Sheets.Add(After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)).Name = "B"
Sheets.Add(After:=ActiveWorkbook.Sheets(ActiveWorkbook.Sheets.Count)).Name = "C"
'Gets the last row number
ActiveWorkbook.Sheets(1).Activate
LastRow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
For i = 4 To LastRow
''Assigning MS1,ES1,ES2
MS1 = Cells(i, 6)
ESN1 = Cells(i, 15)
ESN2 = Application.WorksheetFunction.VLookup(MS1, '[" & WB2FN & "]Sheet1'! [R3C6:R10000C15], 10, False)
''Compare ESN and copy data
If ESN2 <> ESN1 Then
cell.EntireRow.Copy Sheets(2).Cells(d, 1)
n = d + 1
ElseIf Application.WorksheetFunction.IsNA(ESN2) = "TRUE" Then
cell.EntireRow.Copy Sheets(4).Cells(n, 1)
n = n + 1
End If
Next i
'X find and copy
Dim OEM As String
ActiveWorkbook.Sheets(2).Activate
LastRow = ActiveSheet.UsedRange.SpecialCells(xlCellTypeLastCell).Row
n = 3
i = 3
For i = 3 To LastRow
''Check for X
OEM = Cells(i, 4)
If OEM = "x" Then
cell.EntireRow.Copy Sheets(3).Cells(n, 1)
n = n + 1
End If
Next i
MsgBox "Compare successful"
End Sub
Solução
have brackets to reference a file
Você só pode usar essa abordagem se estiver atribuindo uma fórmula a uma célula ou intervalo.
Exemplo:
Dim myformula As String
myformula = "=VLOOKUP(" & MS1 & _
",'[" & WB2FN & "]Sheet1'! [R3C6:R10000C15], 10, False)"
Range("A1").Formula = myformula
Mas se você usar Função de planilha VBA, você precisa acessar de alguma forma o banco de dados ou tabela da qual está buscando dados em tempo de execução.O que significa que você deve passar objetos nos argumentos e não strings como fez acima.
Algo como:
'~~> the rest of your code before Vlookup here
Dim wb As Workbook
Dim mytable As Range
Set wb = Workbooks.Open(WN2FN, , True) '~~> read only, avoid errors when file in use
Set mytable = wb.Sheets("Sheet1").Range("F3:O10000")
On Error Resume Next '~~> to handle when Vlookup returns #N/A or errors out
ESN2 = Application.WorksheetFunction.VLookup(MS1, mytable, 5, 0)
If Err.Number <> 0 Then myvalue = CVErr(xlErrNA)
On Error GoTo 0 '~~> reset error handling to trap other errors
Debug.Print ESN2
Acabei de fornecer a parte onde você usa o Função de planilha Vlookup.Você pode usar o restante do seu código antes dele.Basicamente acima do código:
- atribui a tabela de origem à variável e a passa diretamente para Vlookup argumentos.
- Usos Vlookup através da Função de planilha VBA para buscar dados.
Tome nota do OERN (Em caso de erro, retomar o próximo) rotina e OEG0 (Em caso de erro, vá para 0).
No VBA quando um Função de planilha retorna um erro (ex.#N/A para Vlookup), o código apresenta erros e interrompe a execução.Não há SE ERRO como temos nas fórmulas da planilha.Então você precisa lidar com isso usando rotinas de tratamento de erros.
Observe também que é melhor qualificar totalmente os objetos nos quais você está trabalhando.
Este é um bom lugar para começar a otimizar seus códigos e evitar erros de tempo de execução.