我正在创建一些代码以更好地跟踪费用。其中一个宏意味着从另一个工作表中加载固定费用,只有当金额不为空时,并且在信用额的情况下,仅在尚未付款的情况下加载。
我的代码如下:
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,这可能是一个新手的错误。
答案 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。
工作表是对象的集合,而不是单个对象。集合使用{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