一段EXCEL VBA代码不明白,请高手指教
点击要放入图形的单元格标签,点右键选“查看代码”,把下面代码复制进去。
第一次执行时,要先执行“添加形状”宏,只执行一次即可,就自动生成圆、矩形与直线,以后就不用再执行了。
只要改变A1\A2\A3格中数值,就可使三个形状显示或隐藏了。
Sub 添加形状()
With ActiveSheet.Shapes.AddShape(msoShapeOval, 180, 0, 72, 72) '添加一个圆形
.Name = "yuan" '命名
.Fill.ForeColor.RGB = RGB(0, 255, 0) '设置前景色
End With
With ActiveSheet.Shapes.AddShape(msoShapeRectangle, 180, 80, 72, 72) '添加一个矩形
.Name = "ju" '命名
.Fill.ForeColor.RGB = RGB(255, 0, 0) '设置前景色
End With
With ActiveSheet.Shapes.AddLine(180, 160, 280, 160) '添加一个直线
.Name = "xian" '命名
.Fill.ForeColor.RGB = RGB(255, 0, 0) '设置前景色
End With
End Sub
Private Sub Worksheet_Change(ByVal Target As Range)
If [a1] > 0 Then
ActiveSheet.Shapes("yuan").Visible = msoTrue
Else
ActiveSheet.Shapes("yuan").Visible = msoFalse
End If
If [a2] > 0 Then
ActiveSheet.Shapes("ju").Visible = msoTrue
Else
ActiveSheet.Shapes("ju").Visible = msoFalse
End If
If [a3] > 0 Then
ActiveSheet.Shapes("xian").Visible = msoTrue
Else
ActiveSheet.Shapes("xian").Visible = msoFalse
End If
End Sub
用公式就可以达到你要的效果
详见截图
A12输入 =OFFSET($A$2,MOD((ROW(A1)-1),8),0)
B12输入 =OFFSET($B$2,MOD((ROW(B1)-1),8),INT((ROW(A8)-8)/8))
C12输入 =OFFSET($B$1,0,INT((ROW(B8)-8)/8))
选中三公式,下垃即可
注释如下:
Sub 按钮1_单击()
'关闭屏幕更新,如果设置成true,那么会看到excel的值一个格子一个格子的填充。
Application.ScreenUpdating = False
'关闭显示警告信息框
Application.DisplayAlerts = False
For Each sh In Sheets
'判断sheet名字,在sheet名称中包含(0),(1),...,(9)的sheet名称
If Trim(sh.Name) Like "*(*[0-9])" Then
'将sheet名称按照(分隔成一维数组,以sheet名称是zg(1)为例,则取出的内容是 1)
'然后将第二个元素按照)分隔成一维数组,以sheet名称是zg(1)为例,则取出的内容是 1
'所以最后得到的xyz是1
xyz = Val(Split(Split(sh.Name, "(")(1), ")")(0))
'如果sheet的序号是偶数的时候
If xyz Mod 2 = 0 Then
'将这个sheet所有偶数页已经使用的单元格中的内容复制到前一页(奇数页)的第a列第15行
'例如,现在在第zg(2)中的内容会复制到zg(1)即,奇数页的第a列第15行开始的地方。
sh.UsedRange.Copy Sheets("zg" & " (" & xyz - 1 & ")").[a15]
With Sheets("zg" & " (" & xyz - 1 & ")")
'清空第a列15行内容
'.[a15] = ""
'将第1列的格式复制到第15列
sh.Rows(1).Copy
.Rows(15).PasteSpecial Paste:=xlPasteFormats
'将第2行到13行的格式复制到第16行到27行
sh.Rows("2:13").Copy
.Rows("16:27").PasteSpecial Paste:=xlPasteFormats
'将第14行的格式复制到第28行
sh.Rows(14).Copy
.Rows(28).PasteSpecial Paste:=xlPasteFormats
'循环结束
End With
'清空剪贴板
Application.CutCopyMode = False
'将sh的sheet删除
sh.Delete
End If
End If
’执行下一个For循环
Next
'关闭屏幕更新
Application.ScreenUpdating = False
'关闭显示警告信息框
Application.DisplayAlerts = False
End Sub
补充:
1.Split那句里的(1)和(0)是什么意思,为什么还有括号。 不应该是加-1 +1之类的吗,就像这样:Split("sdfdXijXei!", "x", -1, 1)
回答:
这句中的(1)和(0)是用来指定一维数组的第几个元素,相当于a(0),a(1
)因为slipt函数返回一个String型的数组。-1和+1是可选择的,前面的-1表示返回所有的子字符串,后面的+1表示 执行文字比较
详细的请参照slipt的语法http://baike.baidu.com/view/356808.html?wtp=tt
2.sh.UsedRange.Copy Sheets("zg" & " (" &xyz - 1 & ")").[a15] 这句的a15换成b15 f15怎么对执行结果没有影响,接我的理解起始列应该有变化.。
回答:
sh.UsedRange.Copy Sheets这句的意思是将这个sheet的第a列15行复制到剪切板中,真正粘贴出来的语句是
sh.Rows(1).Copy
.Rows(15).PasteSpecial Paste:=xlPasteFormats
sh.Rows("2:13").Copy
.Rows("16:27").PasteSpecial Paste:=xlPasteFormats
sh.Rows(14).Copy
.Rows(28).PasteSpecial Paste:=xlPasteFormats
这三句话将剪贴板中的第1行,第2行到13行,第16行到27行复制到他前面一个奇数的sheet中
补充2:
Split怎么还有括号外的参数。我只知道这种用法:Split("sdfdXijXei!", "x", -1, 1)
回答:
这种写法是很不规范的,他利用的split函数返回的是一个数组,而直接使用了返回值的某一个元素,这样做少定义了一个数组,但是却使代码不容易读懂,不推荐这样写代码。
里层的split的结果是1)、2)……6),外层的split函数继续从里层的结果中返回数值。至于函数后的(1)和(0),应该是表示(1)返回子字符串右边的字符串,(0)表示返回子字符串左边的字符串。
不懂
薄虏达力: arr = .Range("a2:b" & r) 这一句呀,r是上面一句获取的最后一个行号,反正是个数值,这里假如r是100 那么arr = .Range("a2:b" & r) 就可以写成 arr = .Range("a2:b100") 意思就是把Range("a2:b100") 把区域的数据放到一个叫arr的二维...
分宜县13134266421: 我在Excel中的宏阅读一段VBA程序中,碰到一些语句,有点不是很懂,求解释下,回答的详细,另外还有加分. - ?
薄虏达力: 第一句本意是获得最后记录行号,但语句中有错误,1 改为 l ,xlup .finalrow = [a1].CurrentRegion.Rows.Count 或 = [A65536].End(xlUp).Row 更简洁.第二句获得一个地址,假设 finalrow 等于5,则 v1 等于 $C$6,即 a5 偏移 (1,2)位置,改用=...
分宜县13134266421: excel vba 求解释这段代码 - ?
薄虏达力: C 判断最后一个非单元格 cells(rows.count,3).end(3).row 复制使用:range("a1:B100").copy range("a1") 参照,地址自己修改
分宜县13134266421: 受累帮我解释一下这段excel的vba代码吧,谢谢您了,越详细越好,用//在每行后面写吧,再次谢谢, - ?
薄虏达力: Dim i&, Myr&, r%, Arr, Arr1(), ks, js, j& '声明变量 Application.ScreenUpdating = False '关闭屏幕更新 Sheet1.Activate '激活sheet1表为活动表 Myr = [f65536].End(xlUp).Row '记录当前表里数据区域最末行的行号至Myr Arr = Range("a1:q" & Myr) ...
分宜县13134266421: excel2007 vba 代码读不明白. - ?
薄虏达力: R = sh.Range("C65536").End(xlUp).Row + 1表示R等于C列最后非空行的下一行,换成Range("a65536")就取A列最后非空行....
分宜县13134266421: excel中的宏VBA编程怎样快速读懂 - ?
薄虏达力: 首先要学习VB的常用命令语句,如for...next...,if...then...,do while...loop等. 其他的,查字典吧(英汉字典即可),当然如果英语水平好,另说. 程序内部都是英语单词的组合.如:ColumnWidth,就是Column + Width 就是指列宽.
分宜县13134266421: excel VBA 下面这段代码是为了把B列零值行删除,可是搞不清楚为什么不循环,每执行一次只删除一行? - ?
薄虏达力: Sub fsadfs() Dim RR%, r% Range("A1").CurrentRegion.Select RR = Selection.Rows.Count Range("B2").Select For r = 1 To RR - 1 If ActiveCell = 0 Then Selection.EntireRow.DeleteRR = RR - 1Else ActiveCell.Offset(1, 0).SelectEnd IfNext r End Sub
分宜县13134266421: 求一段excel vba循环代码 - ?
薄虏达力: Sub FontFormat() Dim rngSelect As Range Set rngSelect = Worksheets("Sheet1").Range("A1:G10")For Each Cell In rngSelectWith Cell.Characters(Start:=8, Length:=1).Font.Name = "宋体".FontStyle = "常规".Size = 16End WithNext End Sub代码基本上是这样的,可以根据你的需要修改一下.
分宜县13134266421: VBA代码求解释,我是新手 - ?
薄虏达力: 1、'这里请解释一下:我理解的SPLIT()是一个根据分隔符分离字符串得到一维数组,比如split("我,是,中,国,人“,”,“)会得到一个{我,是,中,国,人}这个一个数组,可是他的这个代码没有分割符,我就想知道,如果我在B2输入 ...
分宜县13134266421: 请人解释下excel中vba的代码段含义~~~~谢谢了哈 - ?
薄虏达力: Range("D:D,E:E").Select 选择第D E 列 Range("E1").Activate Charts.Add 添加图表 ActiveChart.ChartType = xlColumnClustered ActiveChart.SetSourceData Source:=Sheets("1Y").Range("D:D,E:E") ActiveChart.Location Where:=...