Vlookup Sintassi e problemi di input degli utenti
-
20-12-2019 - |
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
. 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.