2015-10-20 61 views
2

我是一個相對無知的程序員,很抱歉。應用程序定義或對象定義的錯誤,血腥的奧祕

Excel 2010 UserForm命令按鈕的下列代碼返回應用程序定義或對象定義的錯誤。

Private Sub CommandButton1_Click() 

Dim y, vfx, sapx, prx As String 

y = Sheets(ComboBox1.Value).Range("B:B").Find(ComboBox2.Value).Row 
vfx = Sheets(ComboBox1.Value).Range("1:1").Find("Vendor No").Column 
sapx = Sheets(ComboBox1.Value).Range("1:1").Find("SAP Number").Column 
prx = Sheets(ComboBox1.Value).Range("1:1").Find("Amey Price").Column 

Lrow = Sheets("Macropage").Range("B:B")(Rows.Count).End(xlUp).Row 
Userow = Lrow + 1 

Sheets("Macropage").Range("A" & Userow) = ComboBox1.Value 
Sheets("Macropage").Range("B" & Userow) = ComboBox2.Value 
Sheets("Macropage").Range("C" & Userow) = Sheets(ComboBox1.Value).Cells(y, vfx).Value 
Sheets("Macropage").Range("D" & Userow) = Sheets(ComboBox1.Value).Cells(y, sapx).Value 
Sheets("Macropage").Range("E" & Userow) = Sheets(ComboBox1.Value).Cells(y, prx).Value 

Sheets("Macropage").Range("A3:E" & Userow).Columns.AutoFit 

Unload UserForm1 

End Sub 

導致錯誤的代碼看起來是:Sheets(ComboBox1.Value).Cells(y, prx).Value我通過在一個MsgBox粘它驗證。

prx引用的列唯一不同的地方是它包含小數而不是一些文本。我不明白爲什麼這應該是一個問題,但。

任何感興趣的信息,即使它只是關於應用程序定義或對象定義的錯誤的性質。從谷歌搜索它似乎只是意味着即使編譯器認爲它是好的,Excel執行腳本時仍有問題。

+4

你確定'prx'有一個值嗎?我會在該線上放置一個斷點,並查看它在本地窗口中的價值。 –

+2

而且,如果它沒有價值,我的猜測是沒有列「Amey價格」。 –

+4

'Dim y,vfx,sapx,prx As String' - 與您的問題無關,但您意識到只有'prx'實際上被聲明爲'String'的權利?其他人被隱式聲明爲「變體」。 –

回答

1

天啊,我是個白癡。馬特的馬克杯指出我,prx是一個字符串 - 所以Cells()不能正確解釋它作爲列索引。

不完全確定爲什麼我認爲var1, var2, var3 as type會對所有人應用相同的類型。我以爲我看過變量聲明之前..

謝謝大家。回答我自己的問題是可以的,對吧?

+0

你可能想看看[Rubberduck](http://www.rubberduck-vba.com),我的小寵物項目。最新版本(v1.4.3)中的解析器將炸開包裝指令,例如Sheets(ComboBox1.Value).Range(「B:B」)。Find(ComboBox2.Value).Row' and'Macropage.Range (「B:B」)(Rows.Count).End(xlUp).Row',但是如果你可以簡化這些調用,提取局部變量並獲得Rubberduck解析器來理解你的代碼(v2.0將有更好的解析器),我認爲*代碼檢查*功能將特別有用。它會拿起這個「帶有多個聲明的指令」。 –

4

這不是問題的解決方案,而是重寫代碼以更好地跟蹤錯誤。

Private Sub CommandButton1_Click() 

    On Error GoTo ErrExit 
    Dim y, vfx, sapx, prx As String 

    Dim sheet, Macropage 
    Set thisSheet = Sheets(ComboBox1.Value) 
    Set Macropage = Sheets("Macropage") 

    If thisSheet Then 
     MsgBox "You have to select an input page", vbExclamation 
     Exit Sub 
    End If 

    If Macropage Then 
     MsgBox "You have to select a Macro page", vbExclamation 
     Exit Sub 
    End If 

    y = thisSheet.Range("B:B").Find(ComboBox2.Value).Row 
    vfx = thisSheet.Range("1:1").Find("Vendor No").Column 
    sapx = thisSheet.Range("1:1").Find("SAP Number").Column 
    prx = thisSheet.Range("1:1").Find("Amey Price").Column 

    Lrow = Macropage.Range("B:B")(Rows.Count).End(xlUp).Row 
    Userow = Lrow + 1 

    Macropage.Range("A" & Userow) = ComboBox1.Value 
    Macropage.Range("B" & Userow) = ComboBox2.Value 

    Debug.Print "y= " & y, "vfx= " & vfx, "sapx= " & sapx, "prx= " & prx 

    Macropage.Range("C" & Userow) = thisSheet.Cells(y, vfx).Value 
    Macropage.Range("D" & Userow) = thisSheet.Cells(y, sapx).Value 
    Macropage.Range("E" & Userow) = thisSheet.Cells(y, prx).Value 

    Macropage.Range("A3:E" & Userow).Columns.AutoFit 

SafeExit: 
    Unload UserForm1 
    Exit Sub 
ErrExit: 
    MsgBox Error, vbCritical, "Error" 
    Resume SafeExit 

End Sub 
+0

請發佈Debug.Print的字符串以獲取有關錯誤的想法 – milevyo

+0

您好,我通過從我聲明的變量中除去'as string'來消除錯誤。 'cells()'不能正確解釋'prx'作爲字符串。 (請參閱我的初始帖子中的馬克杯評論)。 感謝您的迴應,但如果我從不需要尋找錯誤原因,我很可能會提及這一點。 – CapriciousMelon

相關問題