VBA Vlookup与变量工作簿匹配错误438

时间:2017-09-19 07:19:04

标签: vba runtime-error match 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是我需要检索的数据点的数量,因此我可以创建一个模板,其中每个组都放在工作表中,每个组的数据放在工作表中。

我不确定它是否在我的表达式或其他方面,但显然似乎是正确的让我难过。一旦我把它弄下来,我就可以将它扩展到我需要为所有组引入的其他变量。 非常感谢!

2 个答案:

答案 0 :(得分: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

就我个人而言,我更喜欢使用Mat Richardson给出的响应中使用Find的结构: [Excel VBA查找字符串1

您可以使用Find返回搜索文本的Range地址并存储在变量中,测试变量IS NOTHING,并使用offset将值向右移动。

答案 1 :(得分:0)

感谢您的回复。 似乎工作簿地址的修复解决了问题以及定义范围。 Dim i As Integer Dim x As String Dim y As String

x =范围(" B1") y =范围(" C1")

LookupRange =工作簿(x).Sheets(y).Range(" $ E $ 1:$ N $ 20") HeaderRange = Workbooks(x).Sheets(y).Range(" $ E $ 1:$ R $ 1")

我基本上循环,使用更改的引用单元格搜索下载的最新文件,并返回与某个标题对应的值。 关于错误处理。我认为过程中断足以提醒我出错了。它应该只能破解在查找中找不到的变量。我有一个包含第二张表中变量的预定义范围,我查看了。 工作簿是通过宏打开的,并且在进程正在工作然后关闭时保持打开状态,因此处理工作簿是否未打开应该不是真正的问题。 谢谢你的帮助