2016-06-07 53 views
1

我想從兩個不同的工作表中總共導入兩個值。我有工作表Site1Site2。從這些我想要分別導入對應的行(Product1,Cost)(Product2,Cost)的值。使用VLookup時更改工作表會導致問題

爲此,我已經試過:

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"))) 

然而,這讓我的錯誤:Error code '13'.: Incompatible types在第二排,我運行的代碼(指工作站點2)。當我嘗試調試此錯誤時,似乎在我嘗試調用工作表Site2時發生該錯誤。

我已經看過原始文件中的數據類型,它是兩種情況下的數字。我的「ActiveWorkbook」中的數據類型也相同。我嘗試過使用新的Set openws2 = openWb.Sheets("Site2")並將代碼調整爲該代碼,但它仍導致相同的錯誤。

當我試圖在工作表Site2上使用VLookup時,我做錯了什麼?

編輯:編輯以反映使VLookup跨越多個列並將「WorksheetFunction」添加爲VLookup前綴的更改。

編輯2:我現在已經將我的代碼行對齊(使用F8)。在行Set openWs = openWb.Sheets("Site2")前後添加MsgBox Application.Match("Cost", openWs.Range("A1:R1"))爲工作表「Site1」返回了正確的列索引,但在將openWs更改爲Site2後沒有任何返回任何內容。這是否意味着不可能在我已經完成的mannor中執行命令Set openWs = openWb.Sheets("Site2) - 即程序是否不會僅僅認爲這是打開一張新紙?

編輯3:基本上每個工作表包含一個數組,其中A1是空的,A2:A30由產品名的行標題組成 - 產品1,產品2,...,產品30。範圍A1:R1由數量,成本等列標題組成。我希望將Application.Match與VLookup結合使用,以避免某些其他用戶插入新列時出現「不匹配」列。因此,我使用VLookup,首先找到「product1」所在的行,然後使用Application.Match我可以找到「Cost」所在的列。通過這個我應該找到,並且我也發現, (行,列)索引(Product1,Cost)對應的值。當我想要使用新工作表「Site2」時出現問題。只需調整代碼以捕獲此工作表中的「產品2,成本」即可(我認爲)。相反,我得到一個錯誤,我試圖調試,如果我理解它是正確的,它源於這樣一個事實,即程序不會將Set openWs = openWb.Sheets("Site2")轉換爲我想要實現的事實,只是一個新的工作表來執行相同類型的Vlookup公式上。

EDIT4:由於該問題可能是由一個specialcharacter å引起的,當我嘗試從片我打電話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

+1

首先,在你的第四行中,你有一個類型錯誤,你的意思是'currentwb',而不是'current.wb'。其次,VLookup函數應該修改爲'Application.WorksheetFunction.VLookup' –

+0

@ShaiRado謝謝!我已更新我的OP,以反映這些更改。問題依然存在。 – Cenderze

+0

您的更新代碼不會將'current.wb'的所有實例更正爲'currentwb'。這應該解決剩下的問題。 –

回答

0

我終於找到了這個問題的解決方案。我發佈這個作爲答案,因爲我一直認爲VLookup或Application.Match以及工作表中的開關引起了問題,並且在Google搜索此問題後發現其他一些代碼作者也相信這一點。

對我來說,解決方案只是簡單地關閉更改工作表之前使用的工作簿。在我的代碼中,我添加了對代碼的小調整。

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在這個主題上投入了這麼多時間,並且是一個很好的人交談)。

1

您的VLOOKUP範圍是單列,而不是多列範圍。這將永遠失敗。

正如一些評論建議,你還需要的current.wb所有實例調整爲currentwb.

+0

感謝您的回答!這些更改並沒有消除這個問題。但有用的信息+1。 – Cenderze

相關問題