加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

[Excel.VBA]批量修改批注背景色+适应不确定现象(多表合并+多版本兼容)

(2012-12-21 16:15:36)
标签:

excel

vba

实例

分类: Excel
[整理/2012-04-08: ]
案例1: 批量修改批注背景色
一般方案 - 遍历A列所有单元格

--Sub 批量修改批注框背景色()

Dim rng As Range

On Error Resume Next '防错'

For Each rng In Range([a1], Cells(Rows.Count, 1).End(xlUp))

'遍历A列所有非空单元格'

Debug.Print rng.Comment.Text '导出批注文字'

If Err=0 Then '如果没有错误 - 表示有批注'

rng.Comment.Visible=True '让批注可见 - 批注只能在可见状态下编辑设置'

rng.Comment.Shape.Fill.ForeColor.SchemeColor=10 '指定 批注背景颜色'

rng.Comment.Visible=False '恢复隐藏属性'

End If

Err.Clear '清楚错误'

Next

End Sub

优化方案 - 换位思考 - 批注少于已使用的单元格

--Sub 批量修改批注框背景色() '通过改变循环对象提速 - 批注少于已使用单元格数量'

Dim com As Comment

For Each com In ActiveSheet.Comments '遍历所有批注'

If Not Intersect(com.Parent, [a:a]) is Nothing Then

com.Visible=True '批注可见'

com.Shape.Fill.ForeColor.SchemeColor=10 '指定 批注背景色'

com.Visible=False '隐藏批注'

End If

Next

End Sub

-----------------------------------------------------------
案例2: 适应不确定现象 - 多表合并
一般方案 - 要求将各班的成绩合并到"总表"中,并将工作薄另存为"已合并"(准备: 工作表"一班"、"二班"、"三班"和"四班"的A1:D13区域存放各班的成绩表)

--Sub 合并所有工作表()

'创建工作表 "总表"'

With Sheets.Add(after:=Sheets(Sheets.Count))

.Name="总表"

End With

'合并四个班级的成绩'

Sheets("一班").[a1:d13].Copy Sheets("总表").Cells(Rows.Count,1).End(xlUp)

Sheets("二班").[a1:d13].Copy Sheets("总表").Cells(Rows.Count,1).End(xlUp).Offset(1,0)

Sheets("三班").[a1:d13].Copy Sheets("总表").Cells(Rows.Count,1).End(xlUp).Offset(1,0)

Sheets("四班").[a1:d13].Copy Sheets("总表").Cells(Rows.Count,1).End(xlUp).Offset(1,0)

ActiveWorkbook.SaveAs ActiveWorkbook.Path & "\已合并.xlsm", xlOpenXMLWorkbookMacroEnabled

End Sub

优化方案 - 对可能错误、冲突进行判断,并将硬编码区域改为动态引用。(创建工作表前判断"总表"是否存在,让用户自行选择标题行数,动态引用工作表,动态引用已用区域,另存文件前判断当前表是否保存等)

--Sub 合并所有工作表()

Dim i As Integer, sht As Worksheet, bt As Integer '声明变量'

'如果当前工作薄已经是 已合并 则退出程序'

If ActiveWorkbook.Name="已合并.xlsm" Then Exit Sub

On Error Resume Next

'手法1 创建工作表中判断是否有同名工作表,避免出错'

Set sht=Sheets("总表") '将 总表 工作表赋予变量'

If err<>0 Then '如果出错 表示不存在 总表 工作表'

With Sheets.Add(after:=Sheets(Sheets.Count)) '新建 工作表 命名为 总表'

.Name="总表"

End With

Else

Sheets("总表").Move Sheets(Sheets.Count) '将 总表 工作表移至最后'

Sheets("总表").Cells.Clear '手法2 如果已有 总表,清除其原有数据'

End If

'手法3 让用户选择标题行数'

bt=Application.InputBox("标题行数为","请指定标题行数",1,,,,,1)

If bt>0 And bt< 10 Then '如果标题行数在1到10之间,则执行复制'

Sheets(1).Row("1:" & bt).Copy Sheets("总表").[a1] '先复制标题'

'手法4 利用Sheets.Count计算待汇总工作表数量'

For i=1 To Sheets.Count-1 '循环 总表 以外的所有工作表'

'手法5 如果非空表则复制 否则跳过'

If Not IsEmpty(Sheets(i).UsedRange) Then '如果工作表为 非空'

Intersect(Sheets(i).UsedRange,Sheets(i).UsedRange.Offset(bt,0)).Copy Sheets("总表").Cells(Rows.Count,1).End(xlUp).Offset(1,0)

End If

Next i

'手法6 判断当前工作薄是否保存过。如果没有则让用户选择保存路径,否则另存到当前文件相同路径下'

If Len(Dir(ActiveWorkbook.Path,vbDirectory))<2 Then '如果工作薄没有保存'

With Application.FileDialog(msoFileDialogFolderPicker) '显示打开文件夹对话框'

If .Show=-1 Then '如果选择了文件夹 则将当前工作薄保存到该文件夹'

ActiveWorkbook.SaveAs .SelectedItems(1) & IIf(Right$(.SelectedItem(1),1)="","","") & "\已合并.xlsm",xlOpenXMLWorkbookMacroEnabled

End If

End With

Else '否则 当前工作薄另存到当前工作薄相同路径下,工作薄名为 已合并.xlsm'

ActiveWorkbook.SaveAs ActiveWorkbook.Path & "\已合并.xlsm",xlOpenXMLWorkbookMacroEnabled

End If

End If

End Sub

-----------------------------------------------------------
案例3: 适应不确定现象 - 多版本兼容
为了体现兼容性,通常采用3种思路: 1 让程序自动判断Excel版本变化后的实际数据,例如行列数变化; 2 写两段代码,让程序根据当前Excel版本调用对应的一段代码; 3 使用低版本的方式,因为通常高版本向下兼容。

--对于行列数不同引起的兼容性问题,可以利用动态引用的方式处理。通常采用[a65536].end(xlUp)和[a1048576].end(xlUp)引用最后一个非空行。然而这两种方式都不能兼容多个版本,较好的方式如下:

* Cells(Rows.Count,1) 第一列最后一个非空单元格

* Cells(1,Columns.Count) 第一行最后一个非空单元格

-----------------------------------------------------------

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有