Sub 遍历()
Dim MyPath$, MyName$, m&, wb As Workbook
Application.ScreenUpdating = False
Application.DisplayAlerts = False
MyPath = ThisWorkbook.Path & "\"
MyName = Dir(MyPath, vbDirectory)
Do While MyName <> ""
If MyName <> "." And MyName <> ".." Then
If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
m = m + 1
With GetObject(MyPath & MyName & "\住房信息.xls")
If m = 1 Then
.Sheets(1).Copy
Set wb = ActiveWorkbook
wb.SaveAs ThisWorkbook.Path & "\合并.xls"
Else
.Sheets(1).Copy Before:=wb.Sheets(1)
wb.Save
End If
wb.ActiveSheet.Name = MyName
.Close False
End With
End If
End If
MyName = Dir
Loop
wb.Close True
Application.ScreenUpdating = True
MsgBox "ok"
End Sub
谁能帮我注释一下这段代码啊。VBA小白看不懂,,越详细越好,谢谢您了
答案:2 悬赏:0 手机版
解决时间 2021-02-05 22:55
- 提问者网友:伴风望海
- 2021-02-05 05:23
最佳答案
- 五星知识达人网友:渡鹤影
- 2021-02-05 06:50
根据代码,在一个目录中存在N个子目录,且每个目录下都有一个名为:住房信息.xls的文件,要将所以的文件合并到一个工作薄,并将工作表名称更改为子目录名称。将合并后的文件保存为:合并.xls,并保存到当前文件所在的目录。
Sub 遍历()
Dim MyPath$, MyName$, m&, wb As Workbook '变量声明 $为文本型,&为整数型
Application.ScreenUpdating = False '禁止屏幕刷新
Application.DisplayAlerts = False '禁止出现任何错误提示
MyPath = ThisWorkbook.Path & "\" '获取当前工作薄路径
MyName = Dir(MyPath, vbDirectory) '开始查找第一项
Do While MyName <> "" '遍历
If MyName <> "." And MyName <> ".." Then '检查是否到末尾
'判断当前是否是目录
If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
m = m + 1
'然后打开该目录里的:住房信息.xls
With GetObject(MyPath & MyName & "\住房信息.xls")
If m = 1 Then '如果第一次循环
.Sheets(1).Copy '则复制当前住户信息.xls的第一张工作表
Set wb = ActiveWorkbook '设定wb为活动工作薄
'并在当前路径存为:合并.xls
wb.SaveAs ThisWorkbook.Path & "\合并.xls"
Else '如果不是第一次循环
'则将 住户信息.xls的第一张工作表复制到 合并.xls的第一张工作表的最前面
.Sheets(1).Copy Before:=wb.Sheets(1)
wb.Save '保存wb
End If
wb.ActiveSheet.Name = MyName '当前工作表的名称命名为目录名称
.Close False '关闭wb
End With
End If
End If
MyName = Dir '下一个目录
Loop
wb.Close True '关闭wb
Application.ScreenUpdating = True '恢复屏幕更新
MsgBox "ok" '弹出对话框,表示完成。
End Sub
Sub 遍历()
Dim MyPath$, MyName$, m&, wb As Workbook '变量声明 $为文本型,&为整数型
Application.ScreenUpdating = False '禁止屏幕刷新
Application.DisplayAlerts = False '禁止出现任何错误提示
MyPath = ThisWorkbook.Path & "\" '获取当前工作薄路径
MyName = Dir(MyPath, vbDirectory) '开始查找第一项
Do While MyName <> "" '遍历
If MyName <> "." And MyName <> ".." Then '检查是否到末尾
'判断当前是否是目录
If (GetAttr(MyPath & MyName) And vbDirectory) = vbDirectory Then
m = m + 1
'然后打开该目录里的:住房信息.xls
With GetObject(MyPath & MyName & "\住房信息.xls")
If m = 1 Then '如果第一次循环
.Sheets(1).Copy '则复制当前住户信息.xls的第一张工作表
Set wb = ActiveWorkbook '设定wb为活动工作薄
'并在当前路径存为:合并.xls
wb.SaveAs ThisWorkbook.Path & "\合并.xls"
Else '如果不是第一次循环
'则将 住户信息.xls的第一张工作表复制到 合并.xls的第一张工作表的最前面
.Sheets(1).Copy Before:=wb.Sheets(1)
wb.Save '保存wb
End If
wb.ActiveSheet.Name = MyName '当前工作表的名称命名为目录名称
.Close False '关闭wb
End With
End If
End If
MyName = Dir '下一个目录
Loop
wb.Close True '关闭wb
Application.ScreenUpdating = True '恢复屏幕更新
MsgBox "ok" '弹出对话框,表示完成。
End Sub
全部回答
- 1楼网友:摆渡翁
- 2021-02-05 07:22
sub 宏1() '子程序 宏1()
dim i, mypath$ '定义变量 i,mypath$
mypath = thisworkbook.path & "\" '获取当前文件的路径 'mypath= 当前工作簿的路径 & "\"'获取当前文件的路径
for i = 2 to 35 '设定变量范围为i=2到35
range("b" & i).select '<单元格>区域("b" & i )的选定
activesheet.pictures.insert(mypath & "f\" & range("a" & i) & ".jpg").select ' 活动工作表的图片集的<插入>(mypath & "f\" & <单元格>区域("a" & i) & ".jpg" )的选定
'在选中的位置插入图片
'mypath 相位的路径
'range("a" & i) 相片的文件名,如果相片用b列命名也可以的
'要有相片路径+名称+后缀
next i '下一个i
end sub '子程序结束
sub 宏1() '子程序 宏1()
dim i, mypath$, a1, a2, b1, b2 '定义变量 i,mypath$,a1,a2,b1,b2
dim pa as picture '定义变量 pa 为 picture
mypath = thisworkbook.path & "\" '获取当前文件的路径 'mypath= 当前工作簿的路径 & "\"'获取当前文件的路径
application.screenupdating = false '关闭屏幕刷新(可以提高运行速度)
for each pa in activesheet.pictures '设定变量范围为每一个pa位于 活动工作表的图片集
pa.delete ' pa的删除
next '下一个
for i = 2 to 35 '设定变量范围为i=2到35
a1 = 0: a2 = 0: b1 = 0: b2 = 0 'a1=0:a2=0:b1=0:b2=0
range("b" & i).select '<单元格>区域("b" & i )的选定
a1 = activecell.left 'a1= 活动单元格的左侧
a2 = activecell.top 'a2= 活动单元格的顶部
b1 = activecell.width 'b1= 活动单元格的宽度
b2 = activecell.height 'b2= 活动单元格的高度
activesheet.pictures.insert(mypath & "f\" & range("a" & i) & ".jpg").select ' 活动工作表的图片集的<插入>(mypath & "f\" & <单元格>区域("a" & i) & ".jpg" )的选定
selection.shaperange.lockaspectratio = false ' 被选项的shaperange的lockaspectratio=false
selection.shaperange.left = a1 + 1 ' 被选项的shaperange的左侧=a1+1
selection.shaperange.top = a2 + 1 ' 被选项的shaperange的顶部=a2+1
selection.shaperange.width = b1 - 2 ' 被选项的shaperange的宽度=b1-2
selection.shaperange.height = b2 - 2 ' 被选项的shaperange的高度=b2-2
next i '下一个i
application.screenupdating = true '开启屏幕刷新
msgbox "完成!" '<消息框>:"完成!"
end sub '子程序结束
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯