我在VBA中有一个用户定义的函数,它写了一个函数计算的一些数据。写入数据的位置将是" cell"旁边的行单元格。用户在Excel工作表中调用VBA函数。
例如: 考虑为用户提供的数字打印乘法表
Public function Mul_Table(number as integer)
dim wb as string
dim ws as string
dim i as integer ,row_num as integer,column_num as integer
wb= activeworkbook.name
ws=activesheet.name
row_num = activecell.row
column_num =activecell.column
for i = 1 to 20
workbooks(wb).sheets(ws).cells(row_num+i , column_num).value = i*number
next i
end function
现在当我执行时,我在调用函数的单元格中出现#value错误。
在调试中,控制器在第34行workbooks(wb).sheets(ws).cell(row_num+i , column_num) = i*number
"
但是我无法找到它出错的原因。
答案 0 :(得分:2)
写入数据的位置将是“cell”旁边的行单元格,用户在excel表格中调用VBA函数。
使用从工作表调用的用户定义函数无法完成此操作。这就是您返回#Value!
错误的原因。
如果断点并单步执行代码,您会发现它可能会在此行中止,如果不是更早的话:
workbooks(wb).sheets(ws).cells(row_num+i , column_num).value = i*number
一般来说,这样做的原因是,不允许从工作表调用的UDF操作未明确作为参数传递给函数的任何范围对象(或范围对象的属性)。这是为了防止循环错误,无限循环等。
将它设为Sub
而不是函数,它应该可以工作:
Public Sub Mul_Table()
dim number as INteger
dim wb as string
dim ws as string
dim i as integer ,row_num as integer,column_num as integer
number = Application.InputBox("Enter an integer value")
wb= activeworkbook.name
ws=activesheet.name
row_num = activecell.row
column_num =activecell.column
for i = 1 to 20
workbooks(wb).sheets(ws).cells(row_num+i , column_num).value = i*number
next i
End Sub
答案 1 :(得分:0)
您不能使用函数或子例程来执行此操作。您可以添加Excel的按钮或快捷方式来运行您的代码。我想让你的代码更加优化。
生成乘法表的子例程。
Public Sub Mul_Table(number As Integer)
Dim i, row_num, column_num As Integer
For i = 1 To 20
ActiveCell.Offset(i, 0).Value = i & " x " & number & " = " & i * number
'ActiveCell.Offset(i, 1).Value = i * number 'Uncomment if you want the result in a new column
Next
End Sub
根据用户输入生成乘法表的子例程。
Sub getMultiplicationTable()
mynumber = InputBox("Enter the number.", "Enter number")
Call Mul_Table(CInt(mynumber))
End Sub
生成2的乘法表的子程序
Sub getMultiplicationTableOfTwo()
Call Mul_Table(2)
End Sub
答案 2 :(得分:0)
对于你正在做的事情,你可以使用在输入内容时将触发的worksheet_change事件,然后你可以让代码检查目标地址(Target.Address)以查看它们是否输入了你想要的数据,如果是,那么执行你的任务。
以下是我刚刚为您解雇的一个例子:
Private Sub Worksheet_Change(ByVal Target As Range)
Dim X As Long
If Target.Address = "$A$1" Then
Application.EnableEvents = False
For X = 1 To 20
Range("B" & X).Value = Range("A1").Value * X
Next
Application.EnableEvents = True
End If
End Sub
将其放在工作表级别的VBE中,然后在A1中输入一个数字。
还有很多其他方法可以做到这一点,你可以一次性发布整个范围而不是循环(我离开你说你正在学习的循环,这就是你试图这样做的方式)
在那里或其他任何地方都没有错误检查,但我相信你可以根据你想要的标准找出那部分。
或者你可以用B1中的公式来做到这一点:
=$A$1*ROW(B1)
然后向下拖动并在A1中放一个数字