无法在函数中将VBA数据写入Excel 2007/2010中的单元格

时间:2012-02-28 04:15:19

标签: excel excel-vba excel-2007 excel-2010 vba

我想通过VBA为单元格设置值。我用谷歌搜索,并看到一些决议:

Sheets("SheetName").Range("A1").value = someValue
Sheets("SheetName").Cells(1,1).value = someValue

使用这种代码,我只能从单元格A1中读取数据,但我无法为其设置新值。

更新

设置单元格A1值的代码放在Function内,如下所示。

Function abb()
    Sheets("SheetName").Range("A1").value = 122333
    abb = 'any thing'
End Function

在单元格B2中,我设置=abb()并按Enter键。我得到了#VALUE,但在A1没有任何事情发生。

将此代码放在宏中,它可以正常工作。

我的问题是,如何使A1在函数中具有值?

4 个答案:

答案 0 :(得分:13)

从上面的评论中你想尝试这种方法

如果输入
=abb()
进入任何细胞

然后该片的单元格A1将被设置为12333

这是要更新以选择要更新的单元格并在其中放置值的行 Range("A1").Value = 122333

来自I don't want my Excel Add-In to return an array (instead I need a UDF to change other cells)

  

我正在Kevin Jones aka Zorvek放置behind the EE Paywall中的这段魔法(如果有人有权限,则附上链接)

     

虽然Excel严格禁止UDF更改任何单元格,工作表,   或者工作簿属性,有一种方法可以实现这样的更改   使用Windows计时器和Application.OnTime计时器调用UDF   序列。 Windows计时器必须在UDF中使用,因为   Excel忽略UDF中的任何Application.OnTime调用。但是因为   Windows计时器有限制(如果是,Excel将立即退出   如果正在编辑单元格,则Windows计时器会尝试运行VBA代码   对话框已打开),它仅用于计划Application.OnTime   计时器,一个安全计时器,Excel只允许在单元格被触发时触发   没有被编辑,没有对话框打开。

     

下面的示例代码说明了如何从中启动Windows计时器   在UDF中,如何使用该计时器例程来启动   Application.OnTime计时器,以及如何传递已知的信息   UDF到后续的定时器执行例程。下面的代码必须是   放在常规模块中。

Declare Function SetTimer Lib "user32" ( _
      ByVal HWnd As Long, _
      ByVal nIDEvent As Long, _
      ByVal uElapse As Long, _
      ByVal lpTimerFunc As Long _
   ) As Long

Private Declare Function KillTimer Lib "user32" ( _
      ByVal HWnd As Long, _
      ByVal nIDEvent As Long _
   ) As Long

Private mCalculatedCells As Collection
Private mWindowsTimerID As Long
Private mApplicationTimerTime As Date

Public Function abb()

' This is a UDF that returns the sum of two numbers and starts a windows timer
' that starts a second Appliction.OnTime timer that performs activities not
' allowed in a UDF. Do not make this UDF volatile, pass any volatile functions
' to it, or pass any cells containing volatile formulas/functions or
' uncontrolled looping will start.

   abb = "Whatever you want"

   ' Cache the caller's reference so it can be dealt with in a non-UDF routine
   If mCalculatedCells Is Nothing Then Set mCalculatedCells = New Collection
   On Error Resume Next
   mCalculatedCells.Add Application.Caller, Application.Caller.Address
   On Error GoTo 0

   ' Setting/resetting the timer should be the last action taken in the UDF
   If mWindowsTimerID <> 0 Then KillTimer 0&, mWindowsTimerID
   mWindowsTimerID = SetTimer(0&, 0&, 1, AddressOf AfterUDFRoutine1)

End Function

Public Sub AfterUDFRoutine1()

' This is the first of two timer routines. This one is called by the Windows
' timer. Since a Windows timer cannot run code if a cell is being edited or a
' dialog is open this routine schedules a second safe timer using
' Application.OnTime which is ignored in a UDF.

   ' Stop the Windows timer
   On Error Resume Next
   KillTimer 0&, mWindowsTimerID
   On Error GoTo 0
   mWindowsTimerID = 0

   ' Cancel any previous OnTime timers
   If mApplicationTimerTime <> 0 Then
      On Error Resume Next
      Application.OnTime mApplicationTimerTime, "AfterUDFRoutine2", , False
      On Error GoTo 0
   End If

   ' Schedule timer
   mApplicationTimerTime = Now
   Application.OnTime mApplicationTimerTime, "AfterUDFRoutine2"

End Sub

Public Sub AfterUDFRoutine2()

' This is the second of two timer routines. Because this timer routine is
' triggered by Application.OnTime it is safe, i.e., Excel will not allow the
' timer to fire unless the environment is safe (no open model dialogs or cell
' being edited).

   Dim Cell As Range

   ' Do tasks not allowed in a UDF...
   Application.ScreenUpdating = False
   Application.Calculation = xlCalculationManual
   Do While mCalculatedCells.Count > 0
      Set Cell = mCalculatedCells(1)
      mCalculatedCells.Remove 1
      Range("A1").Value = 122333
   Loop
   Application.Calculation = xlCalculationAutomatic
   Application.ScreenUpdating = True
   End Sub

答案 1 :(得分:5)

您无法使用B2中的函数更改单元格A1。

访问:Description of limitations of custom functions in Excel 。该文本包括:

“工作表单元格中的公式调用的用户定义函数无法更改Microsoft Excel的环境。这意味着此类函数无法执行以下任何操作:

  • 在电子表格中插入,删除或格式化单元格。
  • 更改其他单元格的值。 [我的突出显示]
  • 移动,重命名,删除或向工作簿添加工作表。
  • 更改任何环境选项,例如计算模式或屏幕视图。
  • 将名称添加到工作簿。
  • 设置属性或执行大多数方法。“

为什么要以这种方式更改单元格A1?解释你的目标,也许有人可以提供帮助。

答案 2 :(得分:2)

如果要使用一个公式修改两个单元格,可能需要考虑从函数返回一个数组。这是一个例子:

Function abb()
    Dim arr As Variant
    ReDim arr(1 To 2)
    arr(1) = "aardvark"
    arr(2) = "bee"
    abb = arr
End Function

选择单元格A2到B2。键入=abb()并按 Shift Ctrl 输入以指定它是数组公式。然后该公式同时修改两个单元格(A2和B2)。

也许您可以自定义此选项以执行您想要的操作。

答案 3 :(得分:0)

它应该工作 - 试试这个

  1. 打开新的Excel工作表
  2. 创建新宏
  3. 添加此Sheets("Sheet1").Range("A1").Value2 = "value"
  4. 您可以同时使用.Value.Value2,确保工作表名称正确无误。