EXCEL VBA 选择文件夹 2010-08-24 08:23:00| 分类: OFFICE | 标签: |字号大中小 订阅 .
进行文件操作时,经常要用VBA选择目标文件夹,现提供几种实现代码:
1.FileDialog 属性
MsoFileDialogType 可为以下 MsoFileDialogType 常量之一。
msoFileDialogFilePicker 允许用户选择一个文件。
msoFileDialogFolderPicker 允许用户选择一个文件夹。
msoFileDialogOpen 允许用户打开一个文件。
msoFileDialogSaveAs 允许用户保存一个文件。
Sub Sample1()
With Application.FileDialog(msoFileDialogFolderPicker)
If .Show = True Then
MsgBox .SelectedItems(1)
'txtFolder.Text = .SelectedItems(1)
End If
End With
End Sub
2.shell 方法
Sub Sample2()
Dim Shell, myPath
Set Shell = CreateObject("Shell.Application")
Set myPath = Shell.BrowseForFolder(&O0, "请选择文件夹", &H1 + &H10, "G:\")
If Not myPath Is Nothing Then MsgBox myPath.Items.Item.Path
Set Shell = Nothing
Set myPath = Nothing
End Sub
3.API 方法
Declare Function SHGetPathFromIDList Lib "shell32.dll" Alias "SHGetPathFromIDListA" _
(ByVal pidl As Long, ByVal pszPath As String) As Long
Declare Function SHBrowseForFolder Lib "shell32.dll" Alias "SHBrowseForFolderA" _
(lpBrowseInfo As BROWSEINFO) As Long
Declare Function GetDesktopWindow Lib "user32" () As Long
Public Type BROWSEINFO
hOwner As Long
pidlRoot As Long
pszDisplayName As String
lpszTitle As String
ulFlags As Long
lpfn As Long
lParam As Long
iImage As Long
End Type
Sub Sample3()
Dim buf As String
buf = GetFolder("请选择文件夹")
If buf = "" Then Exit Sub
MsgBox buf
End Sub
Function GetFolder(Optional Msg) As String
Dim bInfo As BROWSEINFO, pPath As String
Dim R As Long, X As Long, pos As Integer
bInfo.pidlRoot = 0&
bInfo.lpszTitle = Msg
bInfo.ulFlags = &H1
X = SHBrowseForFolder(bInfo)
pPath = Space$(512)
R = SHGetPathFromIDList(ByVal X, ByVal pPath)
If R Then
pos = InStr(pPath, Chr$(0))
GetFolder = Left(pPath, pos - 1)
Else
GetFolder = ""
End If
End Function
--------------
'存放所有城市区域的数组
Dim arrayArea As Variant
'存放所有excel路径的数组
Dim arrayExcelPath As Variant
Sub Main() '使用双字典,旨在提高速度
Dim MyName, Dic, Did, i, t, F, TT, MyFileName
'On Error Resume Next
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder(0, "选择文件夹", 0, 0)
If Not objFolder Is Nothing Then lj = objFolder.self.Path & "\"
Set objFolder = Nothing
Set objShell = Nothing
t = Time
Set Dic = CreateObject("Scripting.Dictionary") '创建一个字典对象
Set Did = CreateObject("Scripting.Dictionary")
Dic.Add (lj), ""
i = 0
Do While i < Dic.Count
Ke = Dic.keys '开始遍历字典
MyName = Dir(Ke(i), vbDirectory) '查找目录
Do While MyName <> ""
If MyName <> "." And MyName <> ".." Then
If (GetAttr(Ke(i) & MyName) And vbDirectory) = vbDirectory Then '如果是次级目录
Dic.Add (Ke(i) & MyName & "\"), "" '就往字典中添加这个次级目录名作为一个条目
End If
End If
MyName = Dir '继续遍历寻找
Loop
i = i + 1
Loop
For Each Ke In Dic.keys
MyFileName = Dir(Ke & "*.xls")
Do While MyFileName <> ""
Did.Add (Ke & MyFileName), ""
MyFileName = Dir
Loop
Next
For Each Sh In ThisWorkbook.Worksheets
If Sh.Name = "XLS文件清单" Then
Sheets("XLS文件清单").Cells.Delete
F = True
Exit For
Else
F = False
End If
Next
If Not F Then
Sheets.Add.Name = "XLS文件清单"
End If
mypath = Dic.keys
arrayArea = Dic.keys
' Debug.Print
'
' Debug.Print mypath(0)
' For Each ipath In mypath
' Debug.Print ipath
' Next ipath
arrayExcelPath = Did.keys
For i = 0 To Dic.Count
Debug.Print arrayExcelPath(i)
Next i
Dim area As String
For i = 2 To Dic.Count
Debug.Print mypath(i - 1)
Next i
Sheets("XLS文件清单").[A1].Resize(Did.Count, 1) = WorksheetFunction.Transpose(Did.keys)
End Sub
Sub test01()
Dim myexcel As Application
Rem 地域处理 即表头处理
For i = 1 To UBound(arrayArea)
'MsgBox arrayArea(i)
arr = Split(arrayArea(i), "\")
MsgBox arr(UBound(arr) - 1)
Next i
Rem 具体excel路径
For i = 0 To UBound(arrayExcelPath)
'arrayExcelPath(i)是每次循环excel的路径
MsgBox arrayExcelPath(i)
Next i
End Sub
Sub test02()
Application.ScreenUpdating = False
Application.ShowWindowsInTaskbar = False
Set MySourceBook = Workbooks.Open("d:\2013343531.xlsx", 0, True)
Set MySourceSheet = MySourceBook.Worksheets("Sheet1")
MySourceSheet.Activate
MySourceSheet.Cells(1, 3) = "cc"
MySourceBook.Close False
Application.ShowWindowsInTaskbar = True
Application.ScreenUpdating = True
End Sub
Sub testStr()
Dim str As Variant
str = "C:\Users\Administrator\Desktop\vba学习\vba demo\data\咸阳\2013343531.xlsx\"
arr = Split(str, "\")
MsgBox arr(UBound(arr) - 1)
'For i = 0 To UBound(arr)
' MsgBox arr(i)
' Next
End Sub
Sub test3()
Dim excel_App As Excel.Application
Dim excel_Book As Excel.Workbook
Dim excel_sheet As Excel.Worksheet
Set excel_App = CreateObject("Excel.Application") '引用程序对象实例
excel_App.Visible = False '设置Excel为不可见
'打开文件
Set excel_Book = excel_App.Workbooks.Open("d:\www.xlsx") '工作簿实例
Set excel_sheet = excel_Book.Worksheets("Sheet2") '数据表实例
excel_sheet.Range("C1").Value = "你好!" '设置单元格C1的值为"你好!"
Set excel_sheet = Nothing
excel_App.ActiveWorkbook.Close savechanges:=True '保存对EXCELL进行更改。
Set excel_Book = Nothing
excel_App.Quit
Set excel_App = Nothing
End Sub
Sub test4()
Dim excel_App As Excel.Application
Dim excel_Book As Excel.Workbook
Dim excel_sheet As Excel.Worksheet
Dim colunm As Variant
Set excel_App = CreateObject("Excel.Application") '引用程序对象实例
excel_App.Visible = False '设置Excel为不可见
'打开文件
Set excel_Book = excel_App.Workbooks.Open("C:\Users\Administrator\Desktop\vba学习\vba demo\data\咸阳\2013343531.xlsx") '工作簿实例
Set excel_sheet = excel_Book.Worksheets("Sheet1") '数据表实例
excel_sheet.Unprotect
ActiveSheet.Range("A1:G1") = excel_sheet.Range("A1:G1")
Set excel_sheet = Nothing
excel_App.ActiveWorkbook.Close savechanges:=True '保存对EXCELL进行更改。
Set excel_Book = Nothing
excel_App.Quit
Set excel_App = Nothing
End Sub
给出两个方法:
1. 在代码行 “Sheets(1).Range("A1").Select ”
之前加下面这个语句
Sheets(1).activate
2. Sheets(1).Range("A1").Select 改为 application.goto Sheets(1).Range("A1")
Sheets("Sheet3").Range("B1:B7").Copy
Sheets("Sheet1").Range("B9:B15").Select
ActiveSheet.Paste
333333333333333333333333333333333
我已经做了一个excel表格,我现在用的是最笨的方法,就是用了辅助的表格,把路径上的数据表一个个打开,贴到辅助表中,再关闭。处理得很慢。我想能不能不用辅助数据表,直接后台对路径上的excel文件读取数据呢?各位大侠帮帮忙吧。还有个小问题,下面的Observation1!,就是我建的辅助表,我现在要在指定单元格里面输出对辅助表中数据计算的值,如果没有辅助表,直接从路径上读取数据,这个countifs该怎么写呢。=COUNTIFS(Observation1!B:B,"*s*",Observation1!AG:AG,start!B1) 问题补充:
说简单点,请看代码Dim a As Stringa = Application.WorksheetFunction.CountIfs(Worksheets("Observation1").Range("AG:AG"), Worksheets("start").Range("B1"))Sheet4.Cells(2, 6).Value = a现在这个observation1这个sheet是我建的辅助表,从D:\ 打开,然后粘贴过来的。现在我想不打开,直接引用数据的话,这段程序该怎么改呢。不要打开引用数据的文件,不然速度实在太慢了。 我来帮他解答
推荐答案 2012-04-20 12:37 只能给你个几个参考,当然还有其他方法,希望能够帮到你 望采纳 getobject函数 本质是打开的,只是看不到窗口 Dim wb as workbook set wb = getobject(具体路径+文件) with wb .............(operation on wb) end with wb.close false set wb=nothing追问有没有不打开的方法啊,由于数据表很大,打开的话运行速度太慢了,谢谢你了!补充问题,请看代码Dim a As Stringa = Application.WorksheetFunction.CountIfs(Worksheets("Observation1").Range("AG:AG"), Worksheets("start").Range("B1"))Sheet4.Cells(2, 6).Value = a现在这个observation1这个sheet是我建的辅助表,从D:\ 打开,然后粘贴过来的。现在我想不打开,直接引用数据的话,这段程序该怎么改呢 回答不要纠结于打不打开表了,程序内部肯定是需要进行访问目标表的理论上,程序还是需要载入目标表内容的,不然怎么进行处理呢你不知道excel的源代码,是不可能做到直接去解析他的数据存储更何况你是用excel的vba来处理excel自己的数据,他当然用他自己的方式访问目标表在屏幕上显示或不显示打开的表只是一种形式过程无论所谓的打开和不打开表,本质上计算机都要进行载入操作的文件。可能你会觉得某些隐藏表,或者屏幕不显示表的方式会快一点,那是因为Screenupdate的速度肯定要比你机器内部处理速度要慢,隐藏或屏蔽了显示的处理过程,会是速度相对提高点 赞同2|评论(1)
求助知友Ronnie0812 | 当前分类:18 级 排名:633
擅长办公软件:18 级 排名:633 |来自团队Excel粉丝
按默认排序|按时间排序
其他回答 共4条
2012-04-24 13:36zhaochang168|当前分类:2 级
楼上说的是对的,不可能不打开,要读取excel数据,必须要打开excel进程,并读入文件数据只不过可以让进程在后台运行,看不到罢了赞同0|评论 2012-04-25 09:37燕翩然|当前分类:3 级
可以把辅助表,做成模板,然后在宏中加入到当前文件中,用后再删除,应该能快点
分享到:
相关推荐
AutoCAD VBA(Visual Basic for Applications)是一种强大的编程工具,专为AutoCAD用户设计,用于扩展和自动化CAD软件的功能。这个“AutoCAD-VBA命令大全.zip”文件包含了一个名为“AutoCAD-VBA命令大全.doc”的文档...
二维码小工具 - VBA_二维码vba_二维码_二维码生成_VBa_VBA二维码是一个使用VBA(Visual Basic for Applications)编程实现的Excel宏工具,它允许用户在Excel环境中生成二维码。VBA是Microsoft Office套件中内置的一...
本文将深入探讨WPS Office对于VBA(Visual Basic for Applications)的支持,特别是关于VBA 7.1版本及其相关的插件,以帮助用户更好地理解和利用这一功能。 VBA是Microsoft Office中内置的一种编程语言,允许用户...
VBA(Visual Basic for Applications)是Microsoft Office套件中内置的一种编程语言,它允许用户自定义各种应用程序的功能,包括Excel、Word、PowerPoint等。VBA代码助手专业版是一款专门针对VBA编程的辅助工具,...
VBA(Visual Basic for Applications)是一种在Microsoft Office套件中广泛使用的编程语言,允许用户自定义功能、创建宏和自动化工作流程。WPS Office,作为Microsoft Office的替代品,也开始支持VBA,尤其是VBA 7.1...
在Excel中结合VBA(Visual Basic for Applications)实现进销存管理,可以提供一种便捷且自定义化的解决方案,尤其适合中小企业或个人使用。下面将详细介绍这种系统的基本构成和关键功能,以及VBA在其中的应用。 ...
### CAD VBA开发人员手册(原) #### 第1章 VBA入门 **1.1 了解嵌入和全局VBA工程** 在AutoCAD VBA环境中,工程是指一系列代码模块、类模块以及窗体的集合,这些集合在一起实现特定功能。根据存储位置的不同,...
VBA手册是微软官方提供的关于Visual Basic for Applications(VBA)编程语言的指南,它主要面向使用MS Office 2010或MS Excel VBA进行自动化任务和创建宏的用户。VBA是为Office套件量身打造的编程语言,用于控制文档...
VBA(Visual Basic for Applications)是一种在Microsoft Office套件中广泛使用的编程语言,它允许用户自定义工作流程、创建宏和编写复杂的自动化脚本。VBA插件则是扩展这种功能的工具,通常由第三方开发者创建,以...
VBA(Visual Basic for Applications)是Microsoft Office套件中内置的一种编程语言,它允许用户自定义功能、自动化任务,极大地提升了工作效率。本教程主要聚焦于Excel VBA和Word VBA,这两个工具在日常办公中有着...
第001集:宏与VBA 第002集:VBA中的语句、对象、方法与属性 第003集:循环语句 第004集:判断语句 第005集:VBA变量 第006集:函数与公式 第007集: VBE编辑器 第008集:VBA分支与End语句 第009集: excel文件操作 第010集:...
AutoCAD VBA开发手册是一本专门针对CAD二次开发的教程,主要聚焦于使用Visual Basic for Applications(VBA)这一编程工具。VBA是Microsoft Office套件中的一个强大工具,也被集成在AutoCAD中,允许用户自定义CAD...
VBA(Visual Basic for Applications)是Microsoft Office套件中用于自动化和自定义应用程序的强大编程语言。在WPS Office 2019中,虽然它不是一个默认功能,但用户可以通过安装额外的模块来启用VBA支持。标题“VBA ...
VBA解析Outlook邮件 通过Outlook自带的VBA宏解析Outlook邮件,提取邮件的主题、抄送、正文等信息,我们可以使用VBA宏来自动化处理邮件信息。下面是相关知识点的详细解释: 1. VBA宏: VBA(Visual Basic for ...
VBA代码库收藏管理, VBA中文代码库输入提示, VBA变量名首字母输入提示 VBA函数过程输入提示, VBA代码自动对齐排版, VBA代码混淆, VBA工程密码破解, Excel VBA模块隐藏保护, VBA颜色修改器, VBA代码行号显示 ...
《WPSVBA与ExcelVBA编程实例(150例)》是一个综合性的学习资源,旨在帮助用户深入了解和掌握WPS表格与Excel中的VBA(Visual Basic for Applications)编程技术。VBA是一种强大的编程语言,它允许用户自定义工作簿、...
《兰色幻想VBA80集》是一部针对初学者到进阶者的VBA(Visual Basic for Applications)学习教程,旨在帮助用户深入理解并掌握Excel、Word等Microsoft Office套件中的编程技能。本教程的第6集重点讲解了“函数与公式...
《Office VBA 2013 CHM》是针对VBA(Visual Basic for Applications)编程在Office 2013套件中的全面指南。VBA是Microsoft Office中内置的一种编程语言,允许用户自定义功能,自动化任务,以及创建宏来提高工作效率...
标题中的“[VBA]《ActiveX 和 VBA 参考》由明经通道翻译_cadvba_明经cad通道”表明这是一份关于VBA(Visual Basic for Applications)和ActiveX技术的参考文档,由“明经通道”翻译。ActiveX是微软开发的一种技术,...
在IT行业中,VBA(Visual Basic for Applications)是一种强大的编程语言,主要用于自动化和扩展Microsoft Office应用程序的功能。在WPS Office中,VBA同样被用来创建宏,实现文档处理的自动化和自定义功能。本篇...