对象相关的错误

时间:2016-05-24 01:46:06

标签: excel vba excel-vba

我是VBA的新手,在我学习期间,我在不同的行上得到两种不同的错误,同时引用现有工作表的值放在新工作表上:

对于这部分代码,我收到错误"对象变量或With block变量未设置",

Dim ws1 As Worksheet
For Each wss In ThisWorkbook.Sheets
    If wss.Name = "Optimisation" Then
        found = True
        wss.Delete
        Exit For
    End If
Next
If Not found Then
    Set ws1 = ActiveWorkbook.Worksheets.Add
    ws1.Name = "Optimisation"
End If
ws1.Cells(1, 1).Value = "RECIPE" '<----- error 
'ws1.Range(“A1”).Value = “RECIPE” <----- same error

有时,当我运行代码时,我得到另一个错误,而不是上面的错误。 对于这部分代码,我收到错误&#34;运行时错误:需要对象&#34;

Dim ws2 As Worksheet
Set ws2 = Application.ActiveSheet
Dim Newrecipe As String
Newrecipe = ws2.Cells(currentrow, currentcolumn).Value '<----- error

我尝试set NewRecipe = ws2.Cells(currentrow, currentcolumn).Value来回应错误。但是,现在我得到一个&#34;编译错误:对象必需&#34;为:

Dim ws2 As Worksheet
Set ws2 = Application.ActiveSheet
Dim Newrecipe As String
set Newrecipe = ws2.Cells(currentrow, currentcolumn).Value '<----- error

有人可以向我解释为什么会出现这些错误吗?谢谢。

2 个答案:

答案 0 :(得分:1)

我认为第一个错误可能是因为您的代码没有运行以下代码。

Set ws1 = ActiveWorkbook.Worksheets.Add
ws1.Name = "Optimisation"

只有当()中的代码为真时才会执行If () Then。在你的情况下,你有Not found。因此,如果您有一张名为Optimization的工作表,那么您正在设置found = true,然后您要求找不到。如果found = trueNot found = false。既然你有假,那么if语句中的代码永远不会执行。

对于你的第二个错误,你肯定不会使用set,因为字符串是VB的本机变量类型。它是特定于excel的对象,通常需要使用set。几乎任何数字,字符串,数组(变体),布尔值,日期都不需要设置。我确信还有其他我不知道的,但只是想想如果你能用不同的语言看到这种类型的变量,你可能不需要一套。

当我弄清楚你为什么在没有设置的情况下得到错误时,我会更新我的答案。

只是一个问题,currentrowcurrentcolumn在哪里初始化?

答案 1 :(得分:1)

而不是遍历所有工作表,而不是直接找到现有工作表。

以下代码还可以防止向用户发出警告消息(抑制DisplayAlerts)。

Sub Recut()
Dim ws1 As Worksheet
On Error Resume Next
Set ws1 = Sheets("Optimisation")
On Error GoTo 0
If Not ws1 Is Nothing Then
'if found delete without alert
    Application.DisplayAlerts = False
    ws1.Delete
   Application.DisplayAlerts = True
Else
    Set ws1 = ActiveWorkbook.Worksheets.Add
    ws1.Name = "Optimisation"
    ws1.Cells(1, 1).Value = "RECIPE"
End If
End Sub