使用VLookup时更改工作表会导致问题

时间:2016-06-07 11:53:01

标签: vba excel-vba excel

我想从两个不同的工作表中总共导入两个值。我有工作表Site1Site2。从这些我想分别导入对应于行(Product1,Cost)(Product2,Cost)的值。

为此,我尝试过:

  Set currentWb = ActiveWorkbook
  Set openWb = Workbooks.Open(filepath & Path) ' It imports the correct file
  Set openWs = openWb.Sheets("Site1")
  currentWb.Sheets("Sheet1").Cells(2,3).Value = Application.WorksheetFunction.VLookup("Product1", openWs.Range("A1:R30"), Application.Match("Cost", openWs.Range("A1:R1")))
  Set openWs = openWb.Sheets("Site2")
  currentWb.Sheets("Sheet1").Cells(3,3).Value = Application.WorksheetFunction.VLookup("Product2", openWs.Range("A1:R30"), Application.Match("Cost", openWs.Range("A1:R1")))

然而,这会在我运行代码的第二行(参考工作表Site2)中出现错误:Error code '13'.: Incompatible types。当我尝试调试此错误时,似乎当我尝试调用工作表Site2时发生错误。

我查看了原始文件中的数据类型,在两种情况下都是数字。我的“ActiveWorkbook”中的数据类型也是一样的。我已经尝试使用新的Set openws2 = openWb.Sheets("Site2")并将代码调整到该值,但它仍然会导致相同的错误。

在工作表Site2上尝试使用VLookup时,我做错了什么?

编辑:编辑以反映更改以使VLookup跨越多列+添加“WorksheetFunction”作为VLookup的前缀。

Edit2:我现在已将代码行运行到行(使用F8)。在行MsgBox Application.Match("Cost", openWs.Range("A1:R1"))之前和之后添加Set openWs = openWb.Sheets("Site2")返回工作表“Site1”的正确列索引,但在将openWs更改为Site2后,根本没有返回任何内容。这是否意味着我无法在我所做的甘露中执行命令Set openWs = openWb.Sheets("Site2) - 即程序是否会认为这仅仅是打开一张新的工作表?

Edit3:基本上每个工作表都包含一个数组,其中A1为空,A2:A30包含产品名称的行标题 - Product1,Product2,....,Product30。范围A1:R1由数量,成本等的列标题组成。我想结合使用Application.Match,将VLookup作为一种避免列的“不匹配”的方法,以防其他用户插入新的列。因此我使用VLookup,首先找到“product1”所在的行,然后使用Application.Match我可以找到“Cost”所在的列。通过这个我应该找到,我也找到了,与(行,列)索引(Product1,Cost)对应的值。当我想使用新工作表“Site2”时出现问题。只需调整代码来捕获此工作表中的“Product2,Cost”即可(我认为)。相反,我得到一个错误,我试图调试,如果我理解它是正确的,这源于程序没有将Set openWs = openWb.Sheets("Site2")转换成我想要实现的事实,只是一个新的工作表来执行相同的操作Vlookup公式的类型。

EDIT4:由于当我尝试从工作表中导入数据时问题可能是由特殊字符å引起的,我称之为Site2(实际上它是不同的,包括å - 让我们今后称它为Site2å以尝试使用通配符),我尝试了一些不同的方法。

既不使用

 set openWs = openWb.Sheets(3) '3 is the index of `Site2å`

 For Each openWs In openWb.Worksheets
      If LCase(openWs.Name) Like "Site2?" Then
              openWs.Select
              Exit For
      End If
 Next openWs

的工作原理。后者给出错误Object or With variable not set。我将openWs定义为Dim openWs as Worksheet

2 个答案:

答案 0 :(得分:1)

您的VLOOKUP范围是单列,而不是多列范围。这总是会失败。

根据部分评论中的建议,您还需要将current.wb的所有实例调整为currentwb.

答案 1 :(得分:0)

我终于找到了解决这个问题的方法。我发布这个作为答案,因为我认为VLookup或Application.Match以及工作表中的开关引起了问题,并且在谷歌搜索后发现其他一些代码作者认为相同。

对我来说,解决方案只是在更改工作表之前关闭使用的工作簿。在我的代码中,我添加了对代码的微小调整。

  Set currentWb = ActiveWorkbook
  Set openWb = Workbooks.Open(filepath & Path) ' It imports the correct file
  Set openWs = openWb.Sheets("Site1")
  currentWb.Sheets("Sheet1").Cells(2,3).Value = Application.WorksheetFunction.VLookup("Product1", openWs.Range("A1:R30"), Application.Match("Cost", openWs.Range("A1:R1")))
  openWb.Close saveChanges:=False    ' Added this line
  Set openWs = openWb.Sheets("Site2")
  currentWb.Sheets("Sheet1").Cells(3,3).Value = Application.WorksheetFunction.VLookup("Product2", openWs.Range("A1:R30"), Application.Match("Cost", openWs.Range("A1:R1")))
  openWb.Cloe saveChanges:=False     'And this one 

希望这对任何人都有帮助!我肯定不得不谷歌相当一段时间才意识到我在找错了地方。

(我要感谢@PaaquaGrant在这个话题上花了很多时间,并且是一个非常善于交谈的人)。

相关问题