2017-04-21 137 views
1

我在VBA中很新,並且嘗試過搜索這個問題,但沒有運氣。我有一個工作簿,其中列出了A1中的文件路徑,B1中的工作簿名稱以及C1 & D1中的選項卡名稱。我嘗試編寫一個宏,它將從單元格A1打開一個文件,然後設置剛剛從原始B1打開的工作簿,並在C1 & D1中設置工作表名稱。然後轉到下面的一行並循環該過程。我想我除了定義變量路徑/工作簿/工作表外,還設法解決了大部分問題。以下是我到目前爲止所提出的。會有人有任何建議嗎?提前致謝!在VBA中讀取文件路徑

Dim Macro As Workbook 
Set Macro = Workbooks("Macros.xlsb") 
Workbooks.Open Range("A1") 
Dim WBRange As Range 
WBRange = Macro.Range("B1").Value 
Dim ParRange As Range 
Set ParRange = Macro.Range("C1").Value 
Dim CurrentWB As Workbook 
Set CurrentWB = WBRange 
Dim CurrentWS As Worksheet 
Set CurrentWS = ParRange 
+0

工作簿包含包含單元格的工作表。工作簿不包含單元格。 – Jeeped

+0

是否可以工作?將工作簿設置爲單元格的值?和wbRange一樣? –

+0

@Nathan_Sav - 'Workbooks.Open Range(「A1」)'在語法上是正確的(將打開名稱在活動工作表的單元格A1中指定的工作簿),但需要像'Workbooks.Open Range(「A1 「)&範圍(」B1「)''根據什麼寫在問題。 – YowE3K

回答

1

試試這個。看起來你可能會對變量的範圍感到困惑。請參閱我的代碼如下:

' Use a better name than this for your variable 
Dim Macro As Workbook 
Set Macro = Workbooks("Macros.xlsb") 

Dim NewWorkbook As Workbook 
' Notice that I fully qualify my range reference here, and then specifically retrieve the value from the cell. 
Set NewWorkbook = Workbooks.Open(ThisWorkbook.Sheets("Sheetname").Range("A1").Value) 

' You dont retrieve the value here. You also don't specify the workbook/sheet the range is in. 
' Workbooks.Open Range("A1") 

Dim WBRange As Range 
' You always have to use set when assigning a value to an object 
' This was a mistake as well. 
' Set WBRange = Macro.Range("B1").Value 
Set WBRange = Macro.Range("B1") 

Dim ParRange As Range 
' This was my mistake and causes an error. See the fix below: 
' Set ParRange = Macro.Range("C1").Value 
Set ParRange = Macro.Range("C1") 

Dim CurrentWB As Workbook 
' Set CurrentWB = WBRange 
' I think you mean this: 
Set CurrentWB = Workbooks(WBRange.Value) 

Dim CurrentWS As Worksheet 
'Set CurrentWS = ParRange 
' Use this instead 
Set CurrentWS = CurrentWB.Sheets(ParRange.Value) 

首先,當使用範圍時,最好始終限定其路徑。首先是工作簿,然後是工作表。您也可以使用已設置的工作表變量。

接下來,如果您要檢索範圍內的值,則必須使用Range.Value。雖然Range的默認成員是Value,但您會遇到檢索到錯誤成員的情況(例如,您可以檢索Range本身)。此外,您不能通過引用沒有限定符的名稱來將工作表設置爲等於工作表的名稱。您可以將該名稱用作索引器。在我上面的代碼中,我使用工作簿的名稱在Workbooks集合中找到它。工作表相同。

我希望這有助於澄清!

+0

我有很多要學習!當我將代碼更新到您提供的代碼時,出現以下錯誤: Set ParRange = Macro.Range(「C1」)。錯誤值 – Epoch

+0

哦,我的愚蠢錯誤。刪除「.Value」。在這種情況下,我們需要單元格本身,因此如果它是使用「。」的成員,我們不應該嘗試檢索它。如果我們只是設置ParRange = Macro.Range(「C1」),我們將直接指定ParRange指向單元本身,而不是其內容。更新我的代碼以反映這一點。 –

+0

對不起,我意識到5分鐘後你不能編輯評論。但是當我刪除「.Value」時,我仍然收到「對象不支持這個屬性或方法(錯誤438)」的錯誤(在ParRange和WBRange中)。注意,在宏中一個更合適的名稱)工作簿Cell A1具有文件路徑(C:\ FolderFileName.xlsx),單元格B1中文件名稱(FileName.xlsx)和C1選項卡名稱。我對Range函數的理解是它只是存儲這個值。我嘗試刪除B1中的「.xlsx」部分,但不改變任何內容。 – Epoch

相關問題