我想从两个不同的工作表中总共导入两个值。我有工作表Site1
和Site2
。从这些我想分别导入对应于行(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
答案 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在这个话题上花了很多时间,并且是一个非常善于交谈的人)。