如何使用运行时间位置将数据写入VBA中的单元格?

我在VBA中有一个用户定义的函数,它写一些由函数计算的数据。 写入数据的位置将是用户在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错误的单元格中的函数被调用。 在debugging中,控制器在“ workbooks(wb).sheets(ws).cell(row_num+i , column_num) = i*number ”行发生错误,但我无法find错误原因。

写入数据的位置将是用户在Excel表格中调用VBA函数的“单元格”旁边的行单元格。

这不能用从工作表中调用的用户定义函数完成。 这就是为什么你获得了#Value! 错误返回。

根据定义, 函数被devise为将值返回给函数所在的单元格。 它不应该被用来试图改变其他细胞。

如果你断点续行,你就是代码,你会发现它可能会在这条线上中止,如果不是早点的话:

 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 

您不能使用function或子例程来执行此操作。 你可以添加一个button或快捷方式来运行你的代码。 我想让你的代码更加优化。

  1. Sub例程生成乘法表。

     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 
  2. 根据用户input生成乘法表的子程序。

     Sub getMultiplicationTable() mynumber = InputBox("Enter the number.", "Enter number") Call Mul_Table(CInt(mynumber)) End Sub 
  3. 生成2的乘法表的子程序

     Sub getMultiplicationTableOfTwo() Call Mul_Table(2) End Sub 

对于你正在做的事情,你可以使用worksheet_change事件,当事件被input的时候会触发,然后你可以让代码检查目标地址(Target.Address),看他们是否在你想要的地方input数据,如果是的话执行你的任务。

这里是我刚刚为你敲的一个例子:

 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中input一个数字。

还有其他一些方法可以做到这一点,你可以一次性发布整个范围,而不是循环遍历(我说,你正在学习循环,而这正是你试图做的)

在那里没有任何错误检查,但我相信你可以根据你想要的标准来确定这个部分。

另外,你可以使用类似于B1的公式来做到这一点:

 =$A$1*ROW(B1) 

然后向下拖动并在A1中input一个数字