2013-09-28 157 views
0

所以基本上我可能有一個跛腳的問題。我現在用了大約兩個小時的VBA,我只是想製作一個宏來創建一個新的電子表格並從現有的數據庫中複製數據。運行時錯誤9在VBA腳本

我已經處理了編譯錯誤,但現在當我嘗試編譯項目時,出現「運行時錯誤9:下標超出範圍」。在下面的代碼中,錯誤出現在Name變量被賦值的行中。

我看過其他線程有同樣的問題,但由於我對VBA的有限知識,我無法弄清楚什麼是錯的或者這個代碼是否可以工作。任何幫助將不勝感激! 謝謝大家!

Option Explicit 

Sub PointsCopy() 


'Declaring variables for correct naming 

    Dim Pit As String 
    Dim RL As Integer 
    Dim Pattern As Integer 
    Dim Name As String 
    Dim DataBook As String 
    Dim DataSheet As String 
    Dim oBook As Workbook 
    Dim oSheet As Worksheet 
    Dim NewBook As Workbook 
    Dim NewSheet As Worksheet 
    Dim Rows As Integer 
    Dim Pts As String 



'Figuring out active workbook and worksheet 

    Set oBook = ActiveWorkbook 
    Set oSheet = ActiveSheet 

    DataBook = ThisWorkbook.Name 
    DataSheet = ActiveSheet.Name 


'Getting pit, RL and pattern name from cell A2 and assigning to variable 

錯誤9來在這條線 名稱=工作簿(DATABOOK).Sheets(表).Range( 「A2」)。文本

Name = Workbooks(DataBook).Sheets(DataSheet).Range("A2").Text 
    Pit = Mid(Name, 4, 2) 
    RL = Mid(Name, 7, 4) 
    Pattern = Right(Name, 4) 
    Pts = "" & Pit & "_" & RL & "_" & Pattern & "_pts.csv" 


'Adding new workbook with a proper name 

Set NewBook = Workbooks.Add 
    With NewBook 
    .SaveAs Filename:="" & Pts & "" 

    Set NewSheet = Workbooks(NewBook).Sheets("Sheet1") 

'Activating new worksheet 
NewSheet.Activate 

'Adding column names to the new workbook 

    Range("A1").Value = "MQ2_PIT_CODE" 
    Range("B1").Value = "BLOCK_TOE" 
    Range("C1").Value = "PATTERN_NUMBER" 
    Range("D1").Value = "BLOCK_NAME" 
    Range("E1").Value = "EASTING" 
    Range("F1").Value = "NORTHING" 
    Range("G1").Value = "RL" 
    Range("H1").Value = "POINT_NO" 

'Activate original data sheet 

    Workbooks(oBook).Sheets(oSheet).Activate 

'Count number of data rows in the original spreadsheet 

    Rows = Application.Count(Range("A2:A")) 

'Activate the new spreadsheet and enter pit code, block toe and pattern number 

    NewSheet.Activate 
    Range("A2:A" & Rows) = "" & Pit & "" 
    Range("B2:B" & Rows) = "" & RL & "" 
    Range("C2:C" & Rows) = "" & Pattern & "" 

'Copying data for easting, northing, rl and point number from original spreadsheet to the new one 

    Workbooks(oBook).Sheets(oSheet).Activate 
    Range("C2:C" & Rows).Select 
    Selection.Copy 

    NewSheet.Activate 
    Range("D2").PasteSpecial Paste:=xlPasteValues 

    Workbooks(oBook).Sheets(oSheet).Activate 
    Range("E2:E" & Rows).Select 
    Selection.Copy 

    NewSheet.Activate 
    Range("H2").PasteSpecial Paste:=xlPasteValues 

    Workbooks(oBook).Sheets(oSheet).Activate 
    Range("G2:I" & Rows).Select 
    Selection.Copy 

    NewSheet.Activate 
    Range("E2").PasteSpecial Paste:=xlPasteValues 

    Workbooks(NewBook).Sheets(NewSheet).Save 

End With 

End Sub 

UPDATE

我已經知道爲什麼我有這個錯誤 - 我指的是一個工作簿和工作表與字符串類型的變量,所以我已經改變了以下方式的錯誤行:

Name = ActiveSheet.Range("A2").Text 

不,我沒有得到錯誤9,但我得到錯誤13:類型不匹配如果下面一行:

Set NewSheet = Workbooks(NewBook).Sheets("Sheet1") 

對什麼是錯在這裏任何線索?再次感謝!

回答

1

NewBook是alreayd工作簿對象所以做這個任務就像是Set NewSheet = NewBook.Sheets("Sheet1")

將構建Workbooks(_something_)需要一個字符串參數,如名稱的工作簿的的正確方法。你傳遞的是一個工作簿對象,而不是一個字符串,因爲它不是預期的數據類型,所以會引發錯誤。

對於咧嘴一笑,你可以這樣做:

... = Workbooks(NewBook.Name).Sheets("Sheet1")

但是,這顯然是多餘的,善良的失敗在代碼中使用對象變量的目的。

備註Name也是一個半保留字,因爲it's a type of object in Excel。儘管這可能不會給您帶來任何錯誤,但這可能會讓您感到困惑,並且我個人儘量避免使用與對象相同或非常相似的變量名稱。

+0

感謝您的諮詢!我已經改變了很多代碼,現在相同的語句如下所示:'Set wsNewSheet = Workbooks(「F:\ VBA_scripts \」&Pts&「.csv」)。表格(「」&Pts&「」 )」。我已經檢查** Pts **變量並且它返回正確的值。現在,當我運行它時,我得到**錯誤9:下標超出範圍**。與下一條語句相同:'設置wsO_Sheet =工作簿(「」&OldBookName&「」).Sheets(「」&OldSheetName&「」)'。所有變量都是字符串類型,並具有正確的值,但不起作用。我在這裏做錯了什麼? – user2825403

+0

沒有測試它,我認爲這個問題可能是你的報價加倍,試着'.sheets(pts)'因爲'pts'已經是一個字符串了,我想不出爲什麼你需要把它放入引用更不用說雙引號。同樣,您可能指的是不存在的工作表 - 即使您的變量是正確的 - 因爲您沒有正確使用對象/賦值。 –

0

爲了迴應你在David的回答下的評論......

此:

DataBook = ThisWorkbook.Name 
DataSheet = ActiveSheet.Name 

當這種聯合有潛在的危險:

Name = Workbooks(DataBook).Sheets(DataSheet).Range("A2").Text 

原因是什麼?考慮一下。如果代碼嵌入的工作簿也是當前的工作簿,它應該工作得很好。但是,如果任何OTHER工作簿在代碼執行時處於活動狀態,那麼變量DataSheet將選取THAT工作簿中的工作表名稱,而不是「ThisWorkbook」對象中的工作簿名稱。因此,您可能會要求VBA找到當時在ACTIVE工作簿中確實存在的工作表名稱,但可能不存在於「ThisWorkbook」中;也就是代碼運行的工作簿。

這會反過來給你一個下標超出範圍的錯誤,或者換句話說,「你正在尋找一張不存在於此工作簿中的工作表」。 (我再次強調,「ThisWorkbook」是代碼運行的書,而不是當時的活動工作簿。)

要麼將​​DataBook引用更改爲活動工作簿,要麼激活ThisWorkbook(取決於你的意圖是什麼)確保工作表與您所指的工作簿相同。

0

感謝您的幫助!當我使用不同的方法來引用工作簿時,所有東西都已經解決了。這看起來很奇怪,但它似乎很好地工作:

Set wsNewSheet = Workbooks.Open("C:\Minestar_exports\" & Pts & "") 
Set wsO_Sheet = Workbooks.Open("" & OldBookName & "") 

我計算過,我沒有提到,如果我只是在默認的一個感興趣,現在它的偉大工程,一個特定的工作表!