2012-06-08 178 views
16

第一次海報,因此,如果有任何格式,或者我沒能堅持的指導方針,請讓我知道,這樣我可以修復它。VBA錯誤1004 - 範圍類的選擇方法失敗

所以我基本上要求Excel文件的文件目錄的用戶,那麼我設置了一些變量(最初定爲公衆項目變量,因爲這些正在使用的和在其他地方發生變化)。我也添加了這些行來設置這些變量爲空(以防萬一,我不認爲這應該很重要)。然後,我將這些變量設置爲我想要訪問的excel文件,工作簿和工作表。

Dim filepath as String 
filePath = CStr(fileDialog)    'ask file dir, set to string 
Dim sourceXL As Variant     'these three were orig project variables 
Dim sourceBook As Variant 
Dim sourceSheet As Variant 
Dim sourceSheetSum As Variant 

Set sourceXL = Nothing     'set to nothing in case...? 
Set sourceBook = Nothing 
Set sourceSheet = Nothing 
Set sourceSheetSum = Nothing 

Set sourceXL = Excel.Application   'set to the paths needed 
Set sourceBook = sourceXL.Workbooks.Open(filePath) 
Set sourceSheet = sourceBook.Sheets("Measurements") 
Set sourceSheetSum = sourceBook.Sheets("Analysis Summary") 

Dim measName As Variant     'create variable to access later 
Dim partName As Variant 

sourceSheetSum.Range("C3").Select   'THIS IS THE PROBLEM LINE 

measName = sourceSheetSum.Range(Selection, Selection.End(xlDown)).Value 
sourceSheetSum.Range("D3").Select 
partName = sourceSheetSum.Range(Selection, Selection.End(xlDown)).Value 

所以我創建了兩個不同的表變量「sourceSheets」和「sourceSheetsSum」,代碼工作,如果我使用「sourceSheets」,但如果我使用「sourceSheetsSum」錯誤1004發生。我也曾嘗試與變量「sourceSheet」完全刪除代碼,在被壓倒一切「sourceSheetSum」出於某種原因的情況下。

我相當確信excel工作簿和工作表存在,並且被正確調用,因爲我運行了一小段代碼來遍歷工作簿中的所有工作表並輸出名稱,如下所示。

For j = 1 To sourceBook.Sheets.Count 
Debug.Print (Sheets(j).name) 
Next j 

隨着

測量調試輸出
分析摘要
分析設置

因此,沒有任何人有任何想法這是什麼錯誤可能意味着,或者我怎麼能可能會去尋找更多關於錯誤的信息嗎?

編輯: 所以我決定添加一些表名列表,不知道它是否會有所幫助。

For j = 1 To sourceBook.Sheets.Count 
    listSheet(j) = Sheets(j).name 
Next j  
Debug.Print (listSheet(2))  
Set sourceSheetSum = sourceBook.Sheets(listSheet(2)) 

調試打印分析總結,所以我知道該板在工作簿中存在,而且不應該在名稱的「錯字」是任何問題。
代碼仍然在同一行同樣的錯誤,但。

deusxmach1na:我想你想我改變

Dim sourceXL As Variant     
Dim sourceBook As Variant 
Dim sourceSheet As Variant 
Dim sourceSheetSum As Variant 

Set sourceSheet = sourceBook.Sheets("Measurements") 

Dim sourceXL As Excel.Application 
Dim sourceBook As Excel.Workbook 
Dim sourceSheet As Worksheet 
Dim sourceSheetSum As Worksheet 

Set sourceSheet = sourceBook.Worksheets("Measurements") 

但是,這並不能改變錯誤,我記得我是有相似,然後改變它,因爲我讀到這個變體就像一個所有的變種,而不是實際上變種是什麼。

+1

我會昏暗你的工作表,特別是工作表,看看會發生什麼。 'Dim sourceSheetSum as Worksheet'實際上,您可能想要以更具體的方式將所有東西調暗。 – deusxmach1na

回答

23

您必須選擇表之前,您可以選擇的範圍。

我已經簡化隔離問題的例子。試試這個:

Option Explicit 


Sub RangeError() 

    Dim sourceBook As Workbook 
    Dim sourceSheet As Worksheet 
    Dim sourceSheetSum As Worksheet 

    Set sourceBook = ActiveWorkbook 
    Set sourceSheet = sourceBook.Sheets("Sheet1") 
    Set sourceSheetSum = sourceBook.Sheets("Sheet2") 

    sourceSheetSum.Select 

    sourceSheetSum.Range("C3").Select   'THIS IS THE PROBLEM LINE 

End Sub 

用你的表名替換Sheet1和Sheet2。

重要說明:使用變體很危險,可能會導致難以殺死的錯誤。只有當你有這樣一個非常具體的理由時才使用它們。

+0

我不敢相信你在2個小時的老問題上以13秒的速度擊敗我! +1的速度;-) – assylias

+0

不錯!計算器Excel幫助臺已開始營業! –

+2

@HeadofCatering很好的電話!我幾乎沒有使用選擇,並忘記你必須先選擇表。嘆息,好醇'宏記錄的代碼。 – deusxmach1na

7

你不能選擇一個範圍,而不必首先選擇的片材是在儘量先選擇表,看看你仍然得到問題:

sourceSheetSum.Select 
sourceSheetSum.Range("C3").Select 
+0

+1幾乎在同一時間回答同一個問題。 –

+0

+ 1因爲你在同一時間也:) :) –

3

assylias和餐飲業的負責人已經給出你錯誤發生的原因。

現在關於你在做什麼,從我的理解,你並不需要在所有

我猜你是從VBA PowerPoint中這樣做是爲了使用Select?如果是的話,那麼你的代碼被改寫爲

Dim sourceXL As Object, sourceBook As Object 
Dim sourceSheet As Object, sourceSheetSum As Object 
Dim lRow As Long 
Dim measName As Variant, partName As Variant 
Dim filepath As String 

filepath = CStr(FileDialog) 

'~~> Establish an EXCEL application object 
On Error Resume Next 
Set sourceXL = GetObject(, "Excel.Application") 

'~~> If not found then create new instance 
If Err.Number <> 0 Then 
    Set sourceXL = CreateObject("Excel.Application") 
End If 
Err.Clear 
On Error GoTo 0 

Set sourceBook = sourceXL.Workbooks.Open(filepath) 
Set sourceSheet = sourceBook.Sheets("Measurements") 
Set sourceSheetSum = sourceBook.Sheets("Analysis Summary") 

lRow = sourceSheetSum.Range("C" & sourceSheetSum.Rows.Count).End(xlUp).Row 
measName = sourceSheetSum.Range("C3:C" & lRow) 

lRow = sourceSheetSum.Range("D" & sourceSheetSum.Rows.Count).End(xlUp).Row 
partName = sourceSheetSum.Range("D3:D" & lRow) 
+0

嗨,我有一個相關的問題(抱歉劫持)。我正在重構一些代碼並將其從表單移動到一個模塊。它使用'工作表(名稱).Range'訪問工作表。它在沒有Select的情況下運行良好,然後將其移至模塊。現在我需要在它之前添加一個'Worksheet.Select'行來使它起作用,否則它會給我一個''1004''。在一些情況下甚至不起作用。任何想法爲什麼移動代碼都會產生問題,以及如何解決問題而不需要增加一百萬次。對不起,我是VBA新手。 – DPD

+0

@DPD:是...看到這個鏈接;)http://stackoverflow.com/questions/10714251/excel-macro-avoiding-using-select –

+0

謝謝!那正是我需要的。提出了兩個答案。 – DPD

0

拆除範圍選擇之前拷貝爲我工作。感謝帖子。

相關問題