从另一个工作表获取信息时Excel VBA上的对象必需错误

时间:2016-06-15 01:04:37

标签: excel vba excel-vba macros

我正在创建一些代码以更好地跟踪费用。其中一个宏意味着从另一个工作表中加载固定费用,只有当金额不为空时,并且在信用额的情况下,仅在尚未付款的情况下加载。

我的代码如下:

Sub CargarFijos()
ActiveSheet.Range("J4").Select

If Not ActiveSheet.Previous Is Nothing Then
    If Not ActiveSheet.Previous.Range("C12") Is Nothing Then
        If Not IsEmpty(ActiveSheet.Previous.Range("C12")) Then
            ActiveCell.Text = "Tarjeta de Credito"
            ActiveCell.Offset(0, 1).Select
            ActiveCell.Value = ActiveSheet.Previous.Range("C12").Value
            ActiveCell.Offset(1, -1).Select
        End If
    End If
End If

If Not IsEmpty(ActiveCell) Then
    ActiveCell.Offset(1, 0).Select
End If

If Not Worksheets("Fijos") Is Nothing Then
    For Each c In Worksheets("Fijos").Range("A2:A40").Cells
        If Not c Is Nothing Then
            If Not IsEmpty(c.Offset(0, 1)) And Not c.Offset(0, 1) Is Nothing Then
                If IsEmpty(c.Offset(0, 2)) And Not c.Offset(0, 2) Is Nothing Then
                    ActiveCell.Text = c.Text
                    ActiveCell.Offset(0, 1).Value = c.Offset(0, 1).Value
                    ActiveCell.Offset(1, 0).Select
                ElseIf Not c.Offset(0, 2) Is Nothing And c.Offset(0, 2).Value > 0 Then
                    ActiveCell.Text = c.Text
                    ActiveCell.Offset(0, 1).Value = c.Offset(0, 1).Value
                    c.Offset(0, 2).Value = c.Offset(0, 2).Value - 1
                    ActiveCell.Offset(1, 0).Select
                End If
            End If
        End If
    Next
End If

End Sub

我的工作表“Fijos”是我有固定费用的地方。在A栏我有说明,在B栏我有需要付款的金额,在C栏我有待付款。

我的想法是,我沿着A列运行,检查B和C列,如果在C上支付了B列和待付款(或空)的金额,我在ActiveSheet上添加了B的金额

在我的ActiveSheet上,列J是费用的描述,列K是金额。

每当我执行宏时,它会显示“Object Required”,但不会说出错误发生在哪一行。

有什么想法吗?我几天前才开始尝试VBA,这可能是一个新手的错误。

2 个答案:

答案 0 :(得分:1)

此行引发错误

  

ActiveCell.Text =" Tarjeta de Credito"

text属性是只读的。它返回单元格的显示文本而不是单元格值。
使用:

  

ActiveCell.Value =" Tarjeta de Credito"

我重构了你的代码,删除了任何不会失败的条件,并在可能的情况下组合其他if语句。



Sub CargarFijos()
    ActiveSheet.Range("J4").Activate

    If Not IsEmpty(ActiveSheet.Previous.Range("C12")) Then
        ActiveCell.Value = "Tarjeta de Credito"
        ActiveCell.Offset(0, 1).Select
        ActiveCell.Value = ActiveSheet.Previous.Range("C12").Value
        ActiveCell.Offset(1, -1).Select
    End If

    If Not IsEmpty(ActiveCell) Then ActiveCell.Offset(1, 0).Select

    For Each c In Worksheets("Fijos").Range("A2:A40").Cells
        If Not IsEmpty(c.Offset(0, 1)) And IsEmpty(c.Offset(0, 2)) Then
            ActiveCell.Value = c.Text
            ActiveCell.Offset(0, 1).Value = c.Offset(0, 1).Value
            ActiveCell.Offset(1, 0).Select
        Else
            ActiveCell.Value = c.Text
            ActiveCell.Offset(0, 1).Value = c.Offset(0, 1).Value
            c.Offset(0, 2).Value = c.Offset(0, 2).Value - 1
            ActiveCell.Offset(1, 0).Select
        End If
    Next

End Sub




答案 1 :(得分:0)

您的代码没有错误

  

如果不是工作表(“Fijos”),那么

工作表(“Fijos”)不能= Nothing因为当您引用集合中不存在的成员时错误#9将引发超出范围的下标。

  

c.Offset(0,1)没什么

c.Offset(0,x)永远不会= Nothing。

  • 如果x> MaxIndexValue:引发溢出错误
  • 如果x< 0:引发应用程序定义或对象定义的错误 的更新 它不会抛出错误,因为Worksheets(“Fijos”)存在且c.Offset(0,2)永远不会超出范围。

工作表是对象的集合,而不是单个对象。集合使用{Key,Value}对来存储对象或值。钥匙是独一无二的我尝试将两次相同的密钥添加到集合中会引发错误。如果您尝试检索集合的值,则会引发错误。知道让我们抛出一行代码。

如果不是工作表(“Fijos”)则什么都没有   - 如果:如果是什么?我们来比较一下   - 比较什么?   - 不是   - 不是什么?   - 工作表(“非现有密钥”)   - 什么是工作表(“非现有密钥”)   - 这是存储在工作表中的值 - >工作表集合   - 工作表的价值是多少(“非现有密钥”)?   - 此时[在工作表中 - >工作表集合]抛出#9下标超出范围错误。   - 执行停止。   - 从未达到比较的第二部分   - 什么都没有被评估

如果您需要知道某个集合中是否存在某个项目,则必须将下标超出范围错误。

Function hasWorkBook(WorkbookName As String)
    On Error Resume Next
    Call Workbooks(WorkbookName).Name
    If Err.Number <> 0 Then
        hasWorkBook = False
    Else
        hasWorkBook = True
    End If
    On Error GoTo 0
End Function

Function hasWorkSheet(xlWorkbook As Workbook, SheetName As String)
    On Error Resume Next
    Call xlWorkbook.Worksheets(SheetName).Name
    If Err.Number <> 0 Then
        hasWorkSheet = False
    Else
        hasWorkSheet = True
    End If
    On Error GoTo 0
End Function