2017-09-19 3 views
0

안녕하세요 모두, 나는 오류 438 받고있다VBA VLOOKUP (438)

- 다음에 대한 속성 또는 메서드를 지원하지 않는 개체.

Cells(4 + Counter, i * Cells(2, 3).Value) = 
    Application.WorksheetFunction.VLookup(Cells(2, i * Cells(2, 3).Value).Value, 
             Workbooks(file).Range("$E$1:$N$20"), 
    Application.WorksheetFunction.Match(Cells(3, i * Cells(2, 3).Value).Value, 
             Workbooks(file).Range("$E$1:$R$1"), 0), False) 

기본적으로 나는 Excel 이외의 프로그램 (CSV)에서 내 컴퓨터로 다운로드되는 파일이 있습니다. 이전 코드에서는 파일 이름이 달라질 때마다 최신 파일 (다운로드 한 파일)을 검색하고 Excel로 가져옵니다. 그런 다음 B1 셀에 파일 이름을 표시하도록합니다 (나중에 이것을 참조 할 수 있습니다). 나는 file = Range ("B1"). value를 가지고 이것을 문자열로 설정한다.

이 열린 파일에서 용어를 검색하고이 셀의 오른쪽에 여러 값을 반환해야합니다. 각 반환 값은 헤더가 변경 될 수 있으므로 다르게 처리되어야하므로 Match를 사용하고 있습니다. 프로세스가 두 번째 파일에있는 데이터를 검색 한 후 카운터를 늘려서 다음 번에 데이터를 가져 오면 새 검색된 데이터가 아래 행에 표시되어 효과적으로 시계열을 만듭니다. 그룹의 수와 가능한 데이터 포인트가 변동하여 여러 그룹에 대해 6 데이터 포인트를 검색해야하기 때문에 열이 그대로 설정됩니다. 셀 (2,3) .Value는 검색해야하는 데이터 포인트의 수입니다. 각 그룹이 워크 시트에 배치되고 각 그룹의 데이터가 워크 시트 아래에 배치되는 템플릿을 만들 수 있습니다.

내 표현의 구문인지 아닌지는 확실하지 않지만 분명히 올바른 것으로 보이는 부분이 나를 혼란스럽게합니다. 일단 내가 그것을 얻을 수있는 다음 나는 모든 그룹에 가져올 필요가 다른 변수로 확장 할 수 있습니다. 많은 감사!

+0

Workbooks (file) .Range ("$ E $ 1 : $ N $ 20")는 시트를 나타내지 않습니다. 범위를 별도의 변수로 정의한 다음 시트 참조를 포함 시켰으므로 더 이상 오류가 발생하지 않습니다. –

답변

0

복사 할 데이터를 어디에 두는 지 완전히 이해할 수있는 코드/설명이 충분하지 않습니다. 소스 및 대상 참조에 대한 코드 부분과 약간 혼동됩니다. 소스와 대상 워크 시트 (. 당신이 지금에 댓글을 한 당신은 부분적으로 만 자격을했다)

  • 오류를 참조하는 대상
    • 출처 :

      것들에 분명합니다 값을 검색하는 경우 처리가 이 아닙니다.

    이미 루프가 설정되어 있다고 가정합니다.

    Option Explicit 
    Sub test() 
    Dim file As Workbook 
    Dim strPath As String 
    Dim wb As Workbook 
    Dim ws1 As Worksheet 
    Dim ws2 As Worksheet 
    Dim counter As Long 
    Dim i As Long 
    
    Set wb = ThisWorkbook 
    Set ws1 = wb.Sheets("Sheet1") 'Adjust to where you are copying data too/assumes file name is in same sheet 
    
    strPath = "C:\Folder\" 'Location of CSVs 
    
    'Assume you have an actual loop set up 
    counter = 1 'Put here so example has a start value 
    i = 1 ' Put here so example has a start value 
    
    If IsFileOpen(strPath & ws1.Range("B1").Value & ".csv") Then 
        MsgBox "File already in use! Please close." 
        Exit Sub 
    
    Else 
    
        Set file = Workbooks.Open(strPath & ws1.Range("B1").Value & ".csv") 
        Set ws2 = file.Sheets(1) 
    
        With ws2 
        'Require a test for existence of value 
         If Application.WorksheetFunction.CountIf(.Range("$E$1:$N$20"), .Cells(2, i * .Cells(2, 3).Value).Value) > 0 Then 
          ws1.Cells(4 + counter, i * .Cells(2, 3).Value) = 
          Application.WorksheetFunction.VLookup(_ 
          .Cells(2, i * .Cells(2, 3).Value).Value, _ 
          .Range("$E$1:$N$20"), _ 
          Application.WorksheetFunction.Match(.Cells(3, i * .Cells(2, 3).Value).Value, .Range("$E$1:$R$1"), 0), _ 
          False) 
         End If 
    
        End With 
    
        file.Close SaveChanges:=False 
    
    End If 
    
    'Loop 
    
    'Tidy away variables e.g. set wb = nothing ..... 
    
    End Sub 
    
    'Source of function: https://support.microsoft.com/en-us/help/291295/macro-code-to-check-whether-a-file-is-already-open 
    
    Function IsFileOpen(filename As String) 
    Dim filenum As Integer, errnum As Integer 
    On Error Resume Next ' Turn error checking off. 
    filenum = FreeFile() ' Get a free file number. 
    ' Attempt to open the file and lock it. 
    Open filename For Input Lock Read As #filenum 
    Close filenum   ' Close the file. 
    errnum = Err   ' Save the error number that occurred. 
    On Error GoTo 0  ' Turn error checking back on. 
    
    ' Check to see which error occurred. 
    Select Case errnum 
    
    ' No error occurred. 
    ' File is NOT already open by another user. 
        Case 0 
         IsFileOpen = False 
    
    ' Error number for "Permission Denied." 
    ' File is already opened by another user. 
        Case 70 
         IsFileOpen = True 
    
    ' Another error occurred. 
        Case Else 
         Error errnum 
    End Select 
    
    End Function 
    

    는 개인적으로 내가 매트 리처드슨에 의해 주어진 응답 여기에 표시된 찾기를 사용하여 구조의 종류를 선호 : 그래서 당신은 관련 구문의 일부 보여줍니다 다음과 같은 예를 조절할 수 있습니다 [엑셀 VBA 찾기 문자열을 1

    찾기를 사용하여 검색 텍스트의 범위 주소를 반환하고 변수에 저장하고 변수가 NOTHING이면 테스트하고 오프셋을 사용하여 값을 오른쪽으로 가져올 수 있습니다.

  • +0

    답장을 보내 주셔서 감사합니다. 보이는 것 통합 문서 주소를 수정하면 범위를 정의 할 수있을뿐만 아니라 문제도 해결됩니다. –

    0

    답장을 보내 주셔서 감사합니다. 보이는 것 통합 문서 주소를 수정하면 범위를 정의 할 수있을뿐만 아니라 문제도 해결됩니다. 어둡게은 정수 어둡게는 문자열

    X = 범위 ("B1") Y = 범위 ("C1")

    LookupRange = 통합 문서 (X) .Sheets (Y 같이 문자열 희미한 Y가 X I로서 ("$ E $ 1 : $ N $ 20") HeaderRange = Workbooks (x) .Sheets (y) .Range ("$ E $ 1 : $ R $ 1")

    기본적으로 가장 최근에 다운로드 한 파일에서 검색 할 참조 셀을 변경하고 특정 제목에 해당하는 값을 반환합니다. 오류 처리와 관련된. 나는 프로세스가 깨져서 뭔가 잘못되었다고 경고하는 데 충분하다고 생각한다. 조회에서 찾을 수없는 변수 만 중단해야합니다. 내가 훑어 보는 두 번째 시트의 변수를 포함하는 미리 정의 된 범위가 있습니다. 통합 문서는 매크로를 통해 열려 있고 프로세스가 작동하는 동안 열린 상태로 유지됩니다. 그러면 통합 문서가 열려 있는지 여부를 처리하는 것이 실제 문제가 아니어야합니다. 도움을 주셔서 감사합니다.