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
Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top