精华内容
下载资源
问答
  • 这是VBA入门只需3天的第2篇,第1篇讲得是vba中Range的用法。...3天之后,我们将可以使用VBA进行多Sheet...C:甥敳獲AdministratorDesktopMerge_Sheet而相对路径,表示的是一个文件相对另外一个文件位置。大家可以参...
    09ab9babb266bab09b2e213d030a69d4.png

    这是VBA入门只需3天的第2篇,第1篇讲得是vba中Range的用法。点击阅读!

    3天之后,我们将可以使用VBA进行多Sheet汇总。

    今天我们需要了解的是VBA中的相对路径和绝对路径。

    绝对路径,顾名思义,完整的磁盘路径就是绝对路径。

    例如这样完整的磁盘路径就是绝对路径。

    C:甥敳獲AdministratorDesktopMerge_Sheet

    而相对路径,表示的是一个文件相对另外一个文件的位置。

    大家可以参考一下每个编程语言(但是VBA却没有)相对路径表示方式。

    1) ./ 代表当前目录,html中可以省略

    2) ../ 代表上级目录

    3) ../../代表上上级目录

    4) ../../../ 以此类推

    5) / 代表根目录

    因为VBA不支持这样的写法,所以我们必须用另外一种方式来表示相对路径。

    这里用一个具体的例子再深入阐述一下绝对路径与相对路径。

    现在有一个文件夹,层级目录如图所示:

    58ccd9369562ba0073d4efbd85225709.png

    现在我们需要在【test.xlsm】中使用VBA打开【重要信息.xlsx】这个excel来进行一些数据清洗的工作。

    我们可以将代码写成这样:

    Sub test() Dim path As String path = "C:甥敳獲AdministratorDesktopest重要信息.xlsx" Workbooks.Open (path) Debug.Print "开始整理数据……"End Sub

    经过测试,我们可以顺利的打开【重要信息.xlsx】这个文件。

    但是假设我们需要把我们的文件发送给我们的同事,帮助我们的同事也处理一下手头的数据。同事将文件存在了D盘,运行我们的代码时打不开需要的EXCEL,因为这边的路径出现了错误。正确的路径已经是:

    D:est重要信息.xlsx

    我们可以帮一个同事改一下代码,但我们无法帮整个部门30个同事都按着路径改成正确的代码。所以我们极度需要,不管发给谁,不管这位同学把文件存在哪里,我们都可以顺利的整理我们的数据。

    这里我们就需要使用我们的相对路径。

    我们需要知道【重要信息.xlsx】相对于【test.xlsm】这个文件位于哪个位置。

    【test.xlsm】的所处路径为:

    C:甥敳獲AdministratorDesktoptest

    而【重要信息.xlsx】也是在test文件下的。

    所以我们只需要知道【test.xlsm】的文件路径,就可以顺利的找到【重要信息.xlsx】。

    这边我们便需要:

    ThisWorkbook.path

    我们可以试着运行一下:

    978d5bbc04d44a095632f92545bd5c72.png

    这样不管发给谁,只要保证最大层级目录不变,

    即同在test文件夹中,我们就可以轻松的与他人展开协作了。

    550eb3a8af5f046bfb419c2ccc7cc308.png

    具体要这样修改:

    Sub test() Dim path As String path = ThisWorkbook.path & "" & "重要信息.xlsx" Workbooks.Open (path)End Sub

    这来再解释一下其他几句代码的意思:

    Dim path As String

    这个代表声明一个变量为字符串("XXX" → 只要是在引号里的,都可以理解成字符串),

    声明变量需用使用Dim关键字。

    假设如果我们想声明一个长整型变量,我们就应该这么写:

    Dim num As Long

    而 Workbooks.Open (path),这个就是打开文件的方法了。我们需要把文件所处的位置作为参数传递给方法,这样才可以顺利的打开文件。

    本期内容到此结束,明天将探讨一下循环等知识点,然后我们就可以着手开始批量汇总sheet的工作了。

    展开全文
  • 前面两篇博客,我们介绍了VBA和使用VBA获取当前工作表和另一个工作簿的工作表中的数据。这篇我们来说说如何使用VBA模糊查找当前工作表中有用的数据。我们有时会遇到这样的情况。我们手头有很多很多老的excel文件,...

    前面两篇博客,我们介绍了VBA和使用VBA获取当前工作表和另一个工作簿的工作表中的数据。这篇我们来说说如何使用VBA模糊查找当前工作表中有用的数据。

    我们有时会遇到这样的情况。我们手头有很多很多老的excel文件,他们都是关于提供的内容是类似的,但是他们的格式还有不同,因为表格的样式调整过,或是从别的地方复制过来的,导致格式不尽相同。但值得庆幸的是,你所要的数据在表格中的大致位置是可以确定的。

    现在的任务是:把大量类似的excel文件进行整理,从中提取若干字段的值,并汇总到一个新的excel表格中。

    比如挑选两种原始文件中的数据:
    A类表格:
    这里写图片描述
    B类表格:
    这里写图片描述

    我们如何使用VBA批量从文件获取“姓名”、“性别”、“出生日期”和“年龄等呢?

    处理实际任务时,可能会有很多种表格格式需要兼容。这里为了方便演示,我举出如下几个场景。

    1. 字段名和字段值位于前后两个单元格中
    字段名和字段值分开的情况,一般都是字段值在字段名的邻近靠后的单元格,类似上图中的姓名。

    查找思路:
    1. 确认可能出现的区域
    2. 在区域内查找包含字段名的单元格
    3. 获取字段名单元格水平后面的单元格
    4. 获取字段值

    示例代码:

    '姓名字段名出现的范围是:A3到A5的区域内
    With sheet.Range("A3:A5")
        '查找包含“姓名”的单元格
        Set c = .Find("姓名", LookIn:=xlValues)
        '如果找到
        If Not c Is Nothing Then
            '获取匹配单元格水平后面一个单元格的内容
            PName = sheet.Cells(c.Row, c.Column + 1).Value
        End If
    End With

    2. 字段名和字段值在一个单元格中
    对于字段名和字段值在一个单元格中的情况,则需要把字段名和间隔符去掉,留下的值视为字段值

    查找思路:
    1. 确认可能出现的区域
    2. 在区域内查找包含字段名的单元格
    3. 去除字段名和间隔符
    4. 获取字段值

    示例代码:

    '姓名字段名出现的范围是:A3到A5的区域内
    With sheet.Range("A3:A5")
        '查找包含“姓名”的单元格
       Set c = .Find("姓名", LookIn:=xlValues)
       '如果找到
       If Not c Is Nothing Then
           '获取第一个匹配的单元格的内容
           PName = c.Value
           '去除字段名“姓名”
           If Mid(PName, 1, 2) = "姓名" Then PName = Mid(PName, 3, Len(PName))
           '去除分隔符“:”(英文分隔符)和“:”(中文分隔符)
           If Mid(PName, 1, 1) = ":" Then PName = Mid(PName, 2, Len(PName))
           If Mid(PName, 1, 1) = ":" Then PName = Mid(PName, 2, Len(PName))
       End If
    End With

    3. 混合1和2两种情况
    对于有的字段(比如:性别)出现了上述两种情况,则程序需要同时兼容。

    查找思路:
    1. 确认可能出现的区域
    2. 在区域内查找包含字段名的单元格
    3. 去除字段名和间隔符,判断剩下的值是否为空
    4. 如果为空,则获取单元格水平后面的单元格的内容

    示例代码:

    '性别字段名出现的范围是:E3到G4的区域内
    With sheet.Range("E3:G4")
        '查找包含“性别”的单元格
       Set c = .Find("性别", LookIn:=xlValues)
       '如果找到
       If Not c Is Nothing Then
           '获取第一个匹配的单元格的内容
           PName = c.Value
           '去除字段名“性别”
           If Mid(PName, 1, 2) = "性别" Then PName = Mid(PName, 3, Len(PName))
           '去除分隔符“:”(英文分隔符)和“:”(中文分隔符)
           If Mid(PName, 1, 1) = ":" Then PName = Mid(PName, 2, Len(PName))
           If Mid(PName, 1, 1) = ":" Then PName = Mid(PName, 2, Len(PName))
    
            If PName = "" Then
                '获取匹配单元格水平后面一个单元格的内容
                PName = sheet.Cells(c.Row, c.Column + 1).Value
            End If
       End If
    End With

    4. 无字段名, 仅有字段值
    对于没有字段名的情况,获取字段值可能会比较麻烦一些。这要看字段值是否有一定规律。比如“出生日期”,是日期格式,获取还是相对比较容易的。又或者是有固定几个枚举值的字段,比如“性别”。

    查找思路:
    1. 确认可能出现的区域
    2. 在区域内查找符合某一规律的一个或多个单元格
    3. 如果确认完全满足字段值的要求,则获取成功
    4. 否则继续校验其他符合规律的单元格

    示例代码:

      '出生日期字段名出现的范围是:C3到E4的区域内
        With sheet.Range("C3:E4")
            '查找包含“19”的单元格
            Set c = .Find("19", LookIn:=xlValues)
            '如果找到
            If Not c Is Nothing Then
                '保存第一个匹配的单元格地址,用于循环判断(因为FindNext方法找到最后一个匹配后,还可以跳到第一个匹配的单元格)
                cAddress = c.Address
    
                Do
                    '获取匹配的单元格的内容
                    PBirthDay = c.Value
    
                    '精确匹配:如果字段值的长度小于8个字符,或者第五个字符不是斜杠“/”、连接符“-”或反斜杠“/”中的一个,则匹配失败
                    If Len(PBirthDay) < 8 Or Not (Mid(PBirthDay, 5, 1) = "/" Or Mid(PBirthDay, 5, 1) = "-" Or Mid(PBirthDay, 5, 1) = "\") Then
                        PBirthDay = ""
                    End If
    
                    '查找下一个匹配的单元格
                    Set c = .FindNext(c)
                Loop While Not c Is Nothing And c.Address <> cAddress And PBirthDay = ""
            End If
    End With

    5. 混合1、2和4的情况
    上面已经分析了1、2和4的情况,我们只要把代码合并到一起,即可能兼容两种情况了。

    查找思路:
    1. 确认可能出现的区域
    2. 在区域内查找符合某一规律的一个或多个单元格
    3. 如果确认完全满足字段值的要求,则获取成功
    4. 否则继续校验其他符合规律的单元格
    5. 如果没有找到符合条件的字段值,则查找字段名
    6. 判断字段名的单元格是否包含字段值
    6. 如果不包含,获取字段名单元格水平后面的单元格

    示例代码:

    '出生日期字段名出现的范围是:C3到E4的区域内
    With sheet.Range("C3:E4")
        '查找包含“19”的单元格
        Set c = .Find("19", LookIn:=xlValues)
        '如果找到
        If Not c Is Nothing Then
            '保存第一个匹配的单元格地址,用于循环判断(因为FindNext方法找到最后一个匹配后,还可以跳到第一个匹配的单元格)
            cAddress = c.Address
    
            Do
                '获取匹配的单元格的内容
                PBirthDay = c.Value
    
                '精确匹配:如果字段值的长度小于8个字符,或者第五个字符不是斜杠“/”、连接符“-”或反斜杠“/”中的一个,则匹配失败
                If Len(PBirthDay) < 8 Or Not (Mid(PBirthDay, 5, 1) = "/" Or Mid(PBirthDay, 5, 1) = "-" Or Mid(PBirthDay, 5, 1) = "\") Then
                    PBirthDay = ""
                End If
    
                '查找下一个匹配的单元格
                Set c = .FindNext(c)
            Loop While Not c Is Nothing And c.Address <> cAddress And PBirthDay = ""
        End If
    
        '忙活了半天,没找到,再试试用字段名查找下吧。。
        If PBirthDay = "" Then
        '查找包含“出生日期”的单元格
            Set c = .Find("出生日期", LookIn:=xlValues)
            '如果找到
            If Not c Is Nothing Then
                '获取匹配单元格水平后面一个单元格的内容
                PBirthDay = Trim(c.Value)
    
                '去除字段名和分隔符
                If PBirthDay <> "" Then If Mid(PBirthDay, 1, 4) = "出生日期" Then PBirthDay = Mid(PBirthDay, 5, Len(PBirthDay))
                If PBirthDay <> "" Then If Mid(PBirthDay, 1, 1) = ":" Then PBirthDay = Mid(PBirthDay, 2, Len(PBirthDay))
                If PBirthDay <> "" Then If Mid(PBirthDay, 1, 1) = ":" Then PBirthDay = Mid(PBirthDay, 2, Len(PBirthDay))
    
                '获取匹配单元格水平后面一个单元格的内容
                If PBirthDay = "" Then
                    PBirthDay = sheet.Cells(c.Row, c.Column + 1)
                End If
            End If
        End If
    End With

    最后展示下整体效果。
    EXCEL VBA 模糊查询

    展开全文
  • Excel_VBA教程

    2014-09-22 11:36:34
    1.获取当前文件夹的名称(CURDIR函数) 144 2.更改文件或文件夹名称(NAME函数) 145 3.检查文件或文件夹是否存在(DIR函数) 145 4.获得文件修改的日期和时间(FILEDATETIME函数) 147 5.获得文件大小(FILELEN函数...
  • VBA常用技巧

    2014-12-21 16:39:28
    77-2 获取选定文件的文件名 12 77-3 使用“另存为”对话框 12 技巧78 调用操作系统“关于”对话框 12 第7章 菜单和工具栏 12 技巧79 在菜单中添加菜单项 12 技巧80 在菜单栏指定位置添加菜单 12 技巧81 屏蔽和删除...
  • VBA编程技巧大全

    2013-08-05 09:03:19
    77-2 获取选定文件的文件名 186 77-3 使用“另存为”对话框 188 技巧78 调用操作系统“关于”对话框 190 第7章 菜单和工具栏 192 技巧79 在菜单中添加菜单项 192 技巧80 在菜单栏指定位置添加菜单 195 技巧81 屏蔽和...
  • ExcelVBA程序设计.doc

    2011-04-05 21:32:51
    1.获取当前文件夹的名称(CURDIR函数) 144 2.更改文件或文件夹名称(NAME函数) 145 3.检查文件或文件夹是否存在(DIR函数) 145 4.获得文件修改的日期和时间(FILEDATETIME函数) 147 5.获得文件大小(FILELEN函数...
  • Excel VBA 基础教程

    2019-01-01 18:51:06
    目 录 一、VBA语言基础...................................................................................................................1 第一节 标识符....................................................
  • 01003获取当前用户名称 01004获取注册组织名称 01005获取当前操作系统的名称和版本号 01006获取启动Excel的路径 01007获取打开Excel文件时的默认路径 01008获取模板保存的默认路径 01009获取库文件夹的路径 01010...
  • EXCEL编程VBA高级教程

    2015-04-16 11:40:55
    一、VBA语言基础...................................................................................................................1 第一节标识符...........................................................
  • 6.按SplitType取得RangeName串值中的起始位置 7.将金额数字转成中文大写 8.计算某种税金 9.人民币大、小写转换 10.查汉字区位码 11.把公元年转为农历 12.返回指定列数的列标 13.用指定字符替换某字符 14.从右边开始...
  • 函数作用:按SplitType取得RangeName串值中的起始位置12 '7.函数作用:将金额数字转成中文大写....................13 '8.函数作用:计算某种税金..............................18 '9.函数作用:人民币大、小写转换......
  • Excel百宝箱9.0无限制破解版

    热门讨论 2012-02-03 19:05:29
    【插入Flash动画】:将Flash动画插入工作表中并播放,自动获取Flash大小,可以自定义Flash的大小和位置,Flash动画嵌入工作表中 【提取Flash文件】:将嵌入Excel或者Word中的Flash文件提取出来,保存为Swf文件 【播放...
  • Excel百宝箱

    2012-10-27 17:09:21
    【插入Flash动画】:将Flash动画插入工作表中并播放,自动获取Flash大小,可以自定义Flash的大小和位置,Flash动画嵌入工作表中 【提取Flash文件】:将嵌入Excel或者Word中的Flash文件提取出来,保存为Swf文件 【播放...
  •  如果不带任何参数,chkdsk 将显示当前驱动器中的磁盘状态。 drive: 指定要 chkdsk 检查的驱动器。 /p 即使驱动器不在 chkdsk 的检查范围内,也执行彻底检查。该参数不对驱动器做任何更改。 /r 找到坏扇区并...
  • 【繁简转换】 可视化的繁简体GB与BGK码以及GB2与BIG5码相互转换,可以复制文本到当前窗体中文本进行转换,也可以实现单个文件或批量文件的转换。在窗体中双击文本字符串尾即可实现自动选定文本并自动复制功能。本...
  • 6.3.1 与当前数据库连接 118 6.3.2 与另一个数据库连接 119 6.4 使用ADO创建记录集 120 6.4.1 打开简单的记录集 120 6.4.2 循环搜索和编辑记录集 122 6.4.3 创建永久记录集 124 6.4.4 使用RecordCount, ...
  • 【繁简转换】 可视化的繁简体GB与BGK码以及GB2与BIG5码相互转换,可以复制文本到当前窗体中文本进行转换,也可以实现单个文件或批量文件的转换。在窗体中双击文本字符串尾即可实现自动选定文本并自动复制功能。本...
  • EXCEL集成工具箱V6.0

    2010-09-11 01:44:37
    常 用 工 具 【繁简转换】 可视化的繁简体GB与BGK码以及GB2与BIG5码相互转换,可以复制文本到当前窗体中文本进行转换,也可以实现单个文件或批量文件的转换。在窗体中双击文本字符串尾即可实现自动选定文本并自动...
  • 6.3.1 与当前数据库连接 118 6.3.2 与另一个数据库连接 119 6.4 使用ADO创建记录集 120 6.4.1 打开简单的记录集 120 6.4.2 循环搜索和编辑记录集 122 6.4.3 创建永久记录集 124 6.4.4 使用RecordCount, BOF和...
  • excel 工具箱

    2012-01-22 15:04:34
    【插入Flash动画】:将Flash动画插入工作表中并播放,自动获取Flash大小,可以自定义Flash的大小和位置,Flash动画嵌入工作表中 【提取选区唯一值】:将选择区域的数据,置于当前列中,忽略重复值。 【清除列中重复值...
  • 【插入Flash动画】:将Flash动画插入工作表中并播放,自动获取Flash大小,可以自定义Flash的大小和位置,Flash动画嵌入工作表中 【提取Flash文件】:将嵌入Excel或者Word中的Flash文件提取出来,保存为Swf文件 ...
  • 常 用 工 具 【繁简转换】 可视化的繁简体GB与BGK码以及GB2与BIG5码相互转换,可以复制文本到当前窗体中文本进行转换,也可以实现单个文件或批量文件的转换。在窗体中双击文本字符串尾即可实现自动选定文本并自动...
  • 【繁简转换】 可视化的繁简体GB与BGK码以及GB2与BIG5码相互转换,可以复制文本到当前窗体中文本进行转换,也可以实现单个文件或批量文件的转换。在窗体中双击文本字符串尾即可实现自动选定文本并自动复制功能。本...
  • 【插入Flash动画】:将Flash动画插入工作表中并播放,自动获取Flash大小,可以自定义Flash的大小和位置,Flash动画嵌入工作表中 【提取Flash文件】:将嵌入Excel或者Word中的Flash文件提取出来,保存为Swf文件 【播放...
  • Excel百宝箱8.0

    2011-06-07 21:32:17
    【生成系统图标】【获取内置命令】【修复Excel】【破解VBA密码】【删除空单元格】【转置选区】【按列倒置】【按列倒置】【字母大小写转换】【小写金额转大写】【大写金额转小写】【区域数据加密】【多区域复制】【按...
  • 获取内置命令ID】VBA编程人员常用的工具。可以查询Excel内部命令的ID号 【按颜色筛选】让Excel 2003也可以按背景色筛选数据,2007或者2010用户不需要使用 【按颜色排序】让Excel 2003也可以按背景色筛选排序,2007...
  • 指定单机应用项目的FactoryTalk Directory位置 4-3 为分布式应用项目设置FactoryTalk Directory 服务器计算机 4-3 为分布式应用项目设置网络上的其它计算机 4-4 5 章 使用分布式应用项目 5-1 关于分布式应用项目 5-1...
  • EXCEL百宝箱8.0终极版

    2011-11-05 16:48:02
    【插入Flash动画】:将Flash动画插入工作表中并播放,自动获取Flash大小,可以自定义Flash的大小和位置,Flash动画嵌入工作表中 【提取选区唯一值】:将选择区域的数据,置于当前列中,忽略重复值。 【清除列中重复值...

空空如也

空空如也

1 2
收藏数 40
精华内容 16
关键字:

vba获取当前文件位置