主题:弄的我睡不着的基础问题
恶少老七
[专家分:110] 发布于 2007-12-30 23:45:00
还是在 excel 里
我录制了一个关于生成图表的宏,其中源数据区的选择代码我认为是这一句
ActiveChart.SetSourceData Source:=Sheets("数据处理").Range(H5:H30), PlotBy:= _
xlColumns
我想实现通过代码控制 源数据区 选择问题
通过在网络上查找资料
将关于Range的部分修改成Range(Cells(x, 6), Cells(y, 6))
x=5,y=30都已经定义.
但是调试时提示:方法'Cells'作用于对象'_Giobal'失败
我承认VB基础薄弱..但我手里的那份VBA资料里也没提到 range 的基本句法..只好再来这里求助..
顺便请大家给我介绍一份比较不错的VBA资料
最后更新于:2007-12-31 10:56:00
回复列表 (共40个回复)
沙发
华山论剑 [专家分:5310] 发布于 2007-12-31 10:28:00
Range(Cells(x, 6), Cells(y, 6))
照这个描述,你的数据是:Fx:Fy,也就是说,假如你的x=1, y=10,这个范围是:F1:F10,一个单排坚列,这不太可能,一个单排的横列出现机率还是有的。
所以我推测,你对cells代替常规的Range("A1:F10")的表达方法不熟悉。
Range(Cells(x1, y1), Cells(x2, y2))
第一个cell是你要取的范围的最左上角的单元格,第二个cell是要取的最右下角的单元格。
Cells(x, y)
x表示第几行,y表示第几列,这和Range("A10")是反过来的,Range("A10")用cells表示就是:
Cells(10, 1)
其中的y,如是A列是1,B列是2......
板凳
恶少老七 [专家分:110] 发布于 2007-12-31 10:40:00
也就是说
取单排竖列的可行性不大了.
按照教材我换了一个方法
前面加上
Dim rCurrentRange As Range
Set rCurrentRange = Selection
把这句代码换成
ActiveChart. SetSourceData Source := rCurrentRange, PlotBy :=_
XlColumns
用来手动选择数据区域
虽然可行
但是,我不知道 Selection 怎么判断,当我不选的时候就会出错
我设想用一个分支结构提示我没选数据或者选择的区域不正确,比如没选中F列
那么 Selection 的条件怎么写呢?
3 楼
华山论剑 [专家分:5310] 发布于 2007-12-31 10:41:00
关于VBA学习的资料,好像没有太公认的好书。
VBA的语法和VB的基本相同,要用好它,主要是要熟悉VBA特有的对象、方法、事件,比如在Excel中,它有很多对象是它独有的,比如:Workbooks、ActiveWorkbook、sheets、Range、Cell、Row、Rows、Columns......
每个对象又有它独特的方法,比如Workbooks等的Add,大部分对象的Select、Activate等,这些也和标准VB有很大的不同。
再有就是事件,比如Workbook的:
Workbook_BeforeClose、Workbook_Open、Workbook_SheetChange
等等。
还有一个要点就是VBA的函数,它有很多独特的函数,要在学习过程中逐步熟悉。
我当初学习VBA就是工作中的需要时,就尝试去做,用录制对比,最重要的是要看VBA的Help,英文能看的懂就有较大的帮助。就这样一两年后,到书店里去买了本一个老外写的700多页的书,回去一看就后悔了,基本上都是实战中掌握的东西。
所以个人认为,最好的资料就是在线的VBA Help。
4 楼
恶少老七 [专家分:110] 发布于 2007-12-31 10:42:00
再一个,生成图表所用的数据几乎都是单排数列的...
看来今晚我要失眠着进入2008了...
5 楼
华山论剑 [专家分:5310] 发布于 2007-12-31 10:44:00
你用Selection还是得先用Range选取,又走回头了,还不如直接用Range,比如你要取"A1:F10":
Range("A1:F10").Select
或者:
Range(Cells(1,1), Cells(10, 6)).Select
然后的Selection就是上面的范围了。
6 楼
华山论剑 [专家分:5310] 发布于 2007-12-31 10:45:00
把你的图表用手工生成用附件放上来看看。
7 楼
恶少老七 [专家分:110] 发布于 2007-12-31 10:58:00
传完了.
必须先选中才能执行.....
我就是想加个IF进去
如果没选中或选错 那就
MSGBOX
8 楼
恶少老七 [专家分:110] 发布于 2007-12-31 11:01:00
因为是几千个数据
我需要反复抽一段数据来看其稳定性
所以不能定死A1:A10...
9 楼
华山论剑 [专家分:5310] 发布于 2007-12-31 11:15:00
如果直接录制很简单。但如果代码控制,这个Chart对象对代码的支持不是很好,要绕绕弯路。
1、声明一个Chart对象变量;
2、先设定它的Location为当前工作表;
3、然后用ActiveChart控制,用对象变量不能操纵。
参考代码:
[code=c]
Sub 图表()
Dim oChart As Chart
Set oChart = Charts.Add
oChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
ActiveChart.ChartType = xlColumnClustered
ActiveChart.SetSourceData Source:=Range("A1:A7"), PlotBy:= _
xlColumns '这里的Range和上面的ChartType可根据需要设
'参数可通过录制对比得到
Set oChart = Nothing
End Sub
[/code]
10 楼
恶少老七 [专家分:110] 发布于 2007-12-31 11:36:00
我把代码修改了一下,
仍使用当前选择的那段代码
Sub 图表2()
Dim oChart As Chart
Dim rCurrentRange As Range
Set rCurrentRange = Selection
Set oChart = Charts.Add
oChart.Location Where:=xlLocationAsObject, Name:="Sheet1"
ActiveChart.ChartType = xlColumnClustered
ActiveChart.SetSourceData Source:=rCurrentRange, PlotBy:= _
xlColumns '这里的Range和上面的ChartType可根据需要设
'参数可通过录制对比得到
End Sub
区域可变那是必须的.
但是 Selection 为空的条件仍然不会加...
类似于 if Selection = nothing then ...
我来回复