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

时间:2015-04-06 18:29:26

标签: excel vba excel-vba

我在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" 但是我无法找到它出错的原因。

3 个答案:

答案 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的按钮或快捷方式来运行您的代码。我想让你的代码更加优化。

  1. 生成乘法表的子例程。

    
    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. 根据用户输入生成乘法表的子例程。

    
    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
    

答案 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中放一个数字