문제

두 개의 사용자가 투입 된 워크 시트 두 개를 비교 한 다음 다른 시트의 차이점을 다른 시트로 이동시키는 것입니다.

코드가 먼저 최신 데이터의 입력을 묻고 해당 시트를 엽니 다. 그런 다음 구형 데이터의 위치가 비교할 수 있지만 열지는 않습니다. 복사 할 필요한 시트를 추가합니다.

두 번째 작업 책에서 일치하는 직렬을 찾는 셀로 열 셀을 내려갑니다 (주로 올바른 데이터 사실 형식을 비교하여 꺼져 있는지 확인하십시오). 일치하는 일련의 직렬을 찾으면 두 항목 모두에 대한 두 번째 시리얼과 시트 중 하나에있는 다른 또는 새 입력이 다른 경우에 따라 다릅니다.

vlookup과 함께하는 주요 문제입니다. 다수의 오류 (424, 1004) 및 컴파일 식 오류가있다. 왜 이러한 문제가 있는지에 대한 조금 안내가 필요합니다. 나는 파일을 참조 할 수 있도록 괄호를 갖는 데 많은 것을 검색하고 발견했지만, 그 형식을 따르면 표현식 오류가 발생합니다.

모든 조언을 높이 평가합니다.

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
.

도움이 되었습니까?

해결책

have brackets to reference a file 셀 또는 범위에 수식을 할당하는 경우에만 해당 방식 만 사용할 수 있습니다.

예 :

Dim myformula As String

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

그러나 VBA 워크 시트 함수 을 사용하는 경우 런타임에 데이터를 가져 오는 데이터베이스 또는 테이블에 관계없이 액세스해야합니다. 의미를 사용하는 것처럼 인수에 객체를 전달해야합니다.
같은 것 :

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

방금 vlookup 워크 시트 기능을 사용하는 부분을 제공합니다 . 이전에 코드의 나머지 코드를 사용할 수 있습니다. 기본적으로 코드 :

  • 는 소스 테이블을 변수에 할당하고 vlookup 인수로 직접 전달했습니다.
  • VBA 워크 시트 기능을 통해 vlookup 을 사용하여 데이터를 가져옵니다.

eren ( 다음 에러 재개) 루틴 및 oeg0 ( 오류가 0 에 대한 )을 기록하십시오.
워크 시트 함수 이 오류 (예 : # n / a for vlookup)를 반환하면 VBA에서 코드 오류가 발생하여 실행을 중지합니다. 워크 시트 수식에있는 것처럼 IFERROR 이 없습니다. 그래서 오류 처리 루틴을 사용하여 처리해야합니다.

또한 작업중인 개체를 완전히 자격을 얻는 것이 좋습니다. 코드를 최적화하고 런타임을 피하기 시작하는 좋은 장소입니다. 오류.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top