2015-05-19 266 views
0

我正在學習visual basic,並且我正在使用的這個腳本在初始化變量i時出現錯誤。初始化變量時Excel Visual Basic運行時錯誤'1004'

我不知道是什麼問題,但我收到錯誤消息:

Run-time error '1004': Application-defined or object-defined error

這裏是我的代碼:

Sub excelmacro() 

Sheets("Sheet1").Select 
Range("A1").Select 

Sheets("Sheet2").Select 
Range("B1").Select 

i = 1 

While i <> 10 
    If Len(ActiveCell.Value) > 1 Then 
     Sheets("Sheet1").Select 
     xname = Right(ActiveCell.Value, Len(ActiveCell.Value) - 6) 
     xsalary = Right(ActiveCell.Value, Len(ActiveCell.Offset(2, 0).Value) - 8) 
     xdesignation = Right(ActiveCell.Value, Len(ActiveCell.Offset(1, 0).Value) - 13) 

     Sheets("Sheet2").Select 
     ActiveCell.Value = xname 
     ActiveCell.Offset(0, 1).Value = xdesig 
     ActiveCell.Offset(0, 3).Value = xsalary 

     ActiveCell.Offset(1, 0).Select 
     Sheets("Sheet1").Select 
     ActiveCell.Offset(3, 0).Select 
    Else 
     i = 10 
    End If 
Wend 

End Sub 
+0

如果你的調試指向'i = 1'那麼錯誤應該是**編譯錯誤:變量未定義**。當你在模塊表頂部指定'Option Explicit'時,會發生這種情況,但是在使用它們之前不要聲明你的變量(例如** Dim i long **)。 – Jeeped

+0

我沒有指定Option Explicit,雖然 –

+0

另外,當我把Dim i As Long設置爲1之前,我得到相同的錯誤,該行 –

回答

2

你不需要變量i在你的代碼無論如何!只是踢線初始化我出。

的,如果在你的循環語句中使用我基本上是爲了躲避循環,可縮短至:

While Len(ActiveCell.Value) > 1 
    Sheets("Sheet1").Select 
    xname = Right(ActiveCell.Value, Len(ActiveCell.Value) - 6) 
    xsalary = Right(ActiveCell.Value, Len(ActiveCell.Offset(2, 0).Value) - 8) 
    xdesignation = Right(ActiveCell.Value, Len(ActiveCell.Offset(1, 0).Value) - 13) 

    Sheets("Sheet2").Select 
    ActiveCell.Value = xname 
    ActiveCell.Offset(0, 1).Value = xdesig 
    ActiveCell.Offset(0, 3).Value = xsalary 

    ActiveCell.Offset(1, 0).Select 
    Sheets("Sheet1").Select 
    ActiveCell.Offset(3, 0).Select 

Wend 
0

這可能是開始練習在How to avoid using Select in Excel VBA macros詳細方法的好時機。

您的代碼重複檢索ActiveCell中最右側字符的不同長度,但使用活動單元格下方行中的值的長度來確定要檢索的字符數。似乎你應該從你用來確定長度的同一個單元中檢索字符。

Sub excelmacro() 
    Dim i As Long, xname As String, xsalary As String, xdesignation As String 

    With Sheets("Sheet1") 
     For i = 1 To .Cells(Rows.Count, "A").End(xlUp).Row Step 3 
      If CBool(Len(.Cells(i, "A").Value)) Then 
       xname = Right(.Cells(i, "A").Value, Len(.Cells(i, "A").Value) - 6) 
       xdesignation = Right(.Cells(i + 1, "A").Value, Len(.Cells(i + 1, "A").Value) - 13) 
       xsalary = Right(.Cells(i + 2, "A").Value, Len(.Cells(i + 2, "A").Value) - 8) 

       With Sheets("Sheet2") 
        .Cells(Rows.Count, "B").End(xlUp).Offset(1, 0) = xname 
        .Cells(Rows.Count, "B").End(xlUp).Offset(0, 1) = xdesignation 
        .Cells(Rows.Count, "B").End(xlUp).Offset(0, 3) = xsalary 
       End With 

      End If 
     Next i 
    End With 
End Sub 

我保留你的一個字符串變量的使用對工資雖然你可以通過使用類型的變量,將伴隨CDbl()包裝文本得到更好的服務。第二次使用xdesig而不是xdesignation被修正。