Object VBA从另一个工作表获取信息时,Excel VBA中的错误

我正在创build一些代码来更好地跟踪费用。 其中一个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”是我的固定费用。 在列AI上有说明,在列BI上有要支付的金额,在列CI上有待处理的支付。

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

在我的ActiveSheet中,J列是开支的描述,K列是金额。

每当我执行macros,它说“对象需要”,但没有说错误发生在哪一行。

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

这行引发错误

ActiveCell.Text =“Tarjeta de Credito”

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

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 

你的代码没有问题

如果不是工作表(“Fijos”)是没有的话

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

c.Offset(0,1)是Nothing

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

  • 如果x> MaxIndexValue:引发溢出错误
  • 如果x <0:应用程序定义或对象定义的错误被提出更新它不会抛出错误,因为工作表(“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