Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 4710|回复: 12

[已解决]输入公式问题

[复制链接]
发表于 2014-1-14 00:10 | 显示全部楼层 |阅读模式
本帖最后由 不二周助 于 2014-1-14 23:37 编辑

对于A1,B1,C1,运行宏时会先清空其内容,输入A1和B1,能根据公式得到C1,如C1=A1+B1,这要如何实现,直接在程序中对C1输入公式的话因为A1和B1在运行程序时已被清空,这时会提示出错,难道要设置触发事件吗,当A1和B1输入时再对C1输入公式?
求高手指教
最佳答案
2014-1-14 08:46
楼主所说的宏运行时先清空内容是其他宏还是这个宏?如果是其他宏,可以用工作表事件:
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     If Target.Column > 2 Then Exit Sub
  3.     If Target.Row <> 1 Then Exit Sub
  4.     If Target.Column = 1 Then
  5.         If Target <> "" And Target.Offset(0, 1) <> "" Then
  6.             Target.Offset(0, 2) = Target + Target.Offset(0, 1)
  7.         Else
  8.             Target.Offset(0, 2) = ""
  9.         End If
  10.     Else
  11.         If Target <> "" And Target.Offset(0, -1) <> "" Then
  12.             Target.Offset(0, 1) = Target + Target.Offset(0, -1)
  13.         Else
  14.             Target.Offset(0, 1) = ""
  15.         End If
  16.     End If
  17. End Sub
复制代码
发表于 2014-1-14 05:48 | 显示全部楼层
不太明白楼主想要达到的目的
可以试着先把A1,B1的值装入内存数组中,再在内存数组中求得C的值,完了输出到单元格中就可以了,这样子就算在宏中清空了单元格A1,B1中的值也不要紧,因为C1在内存数组中计算时使用的是存在内存数组中的值,而不再调用工作表中单元格的值,这也是为什么把数据存入数组比直接调用单元格更快速
回复

使用道具 举报

发表于 2014-1-14 05:57 | 显示全部楼层
期举例比如:
Sub test()
Dim arr
Dim c
    Range("a1") = 1
    Range("b1") = 2
    arr = Range("a1:b1")
    Range("a1") = 100
    Range("b1") = 200
    c = arr(1, 1) + arr(1, 2)
Range("c1") = c
End Sub
最后得到的C1中的值为3,而不是300
回复

使用道具 举报

发表于 2014-1-14 08:17 | 显示全部楼层
先對A1 B1賦值才可以的 ,像 SUB  D()
dim a,b
a=10
b=20
range(A1).VALUE=10
range(b1).value=20

range(c1).value="=a1+b1"
end  sub
不聲明也可以的
回复

使用道具 举报

发表于 2014-1-14 08:46 | 显示全部楼层    本楼为最佳答案   
楼主所说的宏运行时先清空内容是其他宏还是这个宏?如果是其他宏,可以用工作表事件:
  1. Private Sub Worksheet_Change(ByVal Target As Range)
  2.     If Target.Column > 2 Then Exit Sub
  3.     If Target.Row <> 1 Then Exit Sub
  4.     If Target.Column = 1 Then
  5.         If Target <> "" And Target.Offset(0, 1) <> "" Then
  6.             Target.Offset(0, 2) = Target + Target.Offset(0, 1)
  7.         Else
  8.             Target.Offset(0, 2) = ""
  9.         End If
  10.     Else
  11.         If Target <> "" And Target.Offset(0, -1) <> "" Then
  12.             Target.Offset(0, 1) = Target + Target.Offset(0, -1)
  13.         Else
  14.             Target.Offset(0, 1) = ""
  15.         End If
  16.     End If
  17. End Sub
复制代码
回复

使用道具 举报

发表于 2014-1-14 09:10 | 显示全部楼层
不信这样还重名 发表于 2014-1-14 05:57
期举例比如:
Sub test()
Dim arr


你这段代码中如果将arr=range("a1:b1")这一句挪到c=arr(1,1)+arr(2,1) 之后就是C就等于300了。
在你把A1和b1赋值为1和2之后,加上arr=range("a1:b1")之后,arr的值已经定了,后面即使A1与B1 改变了赋值,arr也不会因为他们的改变而重新赋值的。
所以c的值就是3,而不是300.
回复

使用道具 举报

 楼主| 发表于 2014-1-14 10:06 | 显示全部楼层
fffox 发表于 2014-1-14 08:46
楼主所说的宏运行时先清空内容是其他宏还是这个宏?如果是其他宏,可以用工作表事件:

如果清空内容和计算是在同一个宏内,而且希望当A1和B1输入的内容改变时C1会自动根据公式改变,这个有没有办法实现呢
回复

使用道具 举报

 楼主| 发表于 2014-1-14 10:07 | 显示全部楼层
不信这样还重名 发表于 2014-1-14 05:57
期举例比如:
Sub test()
Dim arr

我不是这个意思,A1和B1的值是直接在工作表上录入的,而不是在程序中指定

点评

楼主应该给个附件,即使不成功,别人也好理解你的需求。  发表于 2014-1-14 11:26
回复

使用道具 举报

发表于 2014-1-14 11:31 | 显示全部楼层
不二周助 发表于 2014-1-14 10:07
我不是这个意思,A1和B1的值是直接在工作表上录入的,而不是在程序中指定

A1、B1的值是在工作表中录入的啊
回复

使用道具 举报

发表于 2014-1-14 12:04 | 显示全部楼层
不二周助 发表于 2014-1-14 10:06
如果清空内容和计算是在同一个宏内,而且希望当A1和B1输入的内容改变时C1会自动根据公式改变,这个有没有 ...

刚才看错了。
清空内容与计算貌似不能在同一个宏内。
change事件,当单元格内容发生变化时确发。当在相应单元格输入内容时确发change事件,若在代码开头加上清除单元格内容的语句,随即又触发change事件,导致程序出错。
换一种方法可能可以解决。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-17 14:57 , Processed in 0.301035 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表