Domanda

Sto cercando di creare una macro che confronta due fogli di lavoro inseriti dall'utente, sposta quindi le differenze per i fogli diversi a seconda del perché è diverso.

Il codice richiede innanzitutto l'input dei dati più nuovi e apre quel foglio. Quindi richiede la posizione dei dati più vecchi da confrontare con ma non lo apra. Aggiunge i fogli necessari per copiare.

Docca quindi una cella di colonna per cella alla ricerca del seriale corrispondente sul secondo libro di lavoro (questo è principalmente per garantire che il confronto del corretto formattazione dei dati corretti sia disattivato). Una volta che trova il seriale corrispondente, confronta il secondo seriale per entrambe le entrambette e a seconda del suo ingresso diverso o nuovo in uno dei fogli.

Il problema principale che sto avendo è con Vlookup. Sta avendo più errori 424, 1004 e Errori di espressione di compilazione. Ho bisogno di una piccola guida sul perché è avere questi problemi. Ho cercato e ho trovato molto il bisogno di avere parentesi per fare riferimento a un file ma quando seguo questi formati esattamente getta l'errore di espressione.

Qualsiasi consiglio è apprezzato.

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
.

È stato utile?

Soluzione

have brackets to reference a file È possibile utilizzare tale approccio solo se si assegna una formula a una cella o un intervallo.

Esempio:

Dim myformula As String

myformula = "=VLOOKUP(" & MS1 & _
    ",'[" & WB2FN & "]Sheet1'! [R3C6:R10000C15], 10, False)"
Range("A1").Formula = myformula
.

Ma se si utilizza Funzione foglio di lavoro VBA , è necessario in qualche modo accedere al database o alla tabella che stai recuperando i dati da in runtime. Significa che devi passare oggetti sugli argomenti e non stringhe come fai in alto.
Qualcosa come:

'~~> 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
.

Ho appena fornito la parte in cui usi il foglio di lavoro VlookupFunction . Puoi usare il resto del tuo codice prima di esso. Fondamentalmente sopra il codice:

    .
  • assegna la tabella di origine a variabile e passarla direttamente a vlookup argomenti.
  • utilizza vlookup tramite vba worksheetfunction per recuperare i dati.

Prendi nota della routine dell'erba ( in precedenza ) Routine e OEG0 ( sull'errore GOTO 0 ).
In VBA quando una funzione foglio di lavoro restituisce un errore (ad esempio # N / A per Vlookup), il codice errori e interrompe l'esecuzione. Non ci sono Iferror come abbiamo nelle formule del foglio di lavoro. Quindi è necessario gestirlo utilizzando routine di gestione degli errori.

prendi nota che è meglio qualificare appieno gli oggetti che stai lavorando.
Questo è un buon posto per iniziare a ottimizzare i tuoi codici ed evitare il runtime Errori.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top