精华内容
下载资源
问答
  • @VBA字符串操作:从右向左截取特定分隔符内容 熟悉EXCEL函数朋友遇到截取字符串时候第一个想到肯定是FIND()、 LEN() 、LEFT()、**RIGHT()**这一套操作, 但很遗憾VBA里面FIND针对是Range对象,用到字符...

    @VBA字符串操作:从右向左截取特定分隔符后的内容

    熟悉EXCEL函数的朋友遇到截取字符串的时候第一个想到的肯定是FIND()LEN()LEFT()、**RIGHT()**这一套操作, 但很遗憾VBA里面的FIND针对的是Range对象,用到字符串类型的变量上只能会不停报错。此时需要请出的大神是VBA/Access里面的函数:

    InStr() 和 InStrRev()兄弟

    对于大量诸如“上海市浦东新区金桥街道某某路某某号”这样的结构化文本而言,可以把重复出现的“市、区、街道、路、号”看做“分隔符”,进而把内容分隔成我们需要的小板块。

    具体来说,InStr从左往右找,InStrRev从右向左,不涉及大小写区分的话直接填——(字符串,“分隔符”)即可,函数返回一个整数来表示分隔符在字符串中的下标。留意下,如果分隔符是“//”,“自治区”之类的多个字符组成,那么返回的下标永远是分隔符左起第一个字符在整个字符串里面的位置。

    举例说明

    待切片字符串: 北 京 > 海 淀 > 学 院 路 > 北 京 语 言 大 学
    对 应 的 下 标: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
    要 求: 把最后一个“>”右边的内容解出来

    步骤

    1. 字符串全长 = VBA.Len(“北京>海淀>学院路>北京语言大学”), 结果是16
    2. 找到最右边一个“>”的下标 = VBA.InStrRev(“北京>海淀>学院路>北京语言大学”, “>”),结果是10
      (有趣吧,InStrRev虽然是从右往左找,但下标并没有从右往左数,也不像python用负数,还是正序下标)
    3. 目标字符串=VBA.Right(“北京>海淀>学院路>北京语言大学”, 16-10), 右截取,搞定。
    4. 至于说有些列里面没有“>”, 那就IF判断下即可,没有的保持原样不切片即可

    下面上我的工作实例,要求写宏代码把原表O列中的样式改成仅存在最后一层机构名的形式:

    图1:原表0列的样子

    原表0列,由于系统导出时附带了完整的层级从属关系,因此多处了很多“>>”分隔符,层级多则三层,少则没有图2:清理后的样子
    没有“>>”的话维持不变,有“>>”的话只保留最右边的机构名

    代码如下

    代码是一个子过程,工作表对象w是由主过程传进来的。各个步骤的注释写的很详细,仅供和我一样的小白参考。重点在Do While Loop和里面的IF Else判断里。

    Sub Col_O_UserInstitute(w As Worksheet)
    
        w.Range("O1").ColumnWidth = 25
        
        Dim Delimiter_Sub As Integer '创建变量存储分隔符下标
        Dim ridx As Long '工作表w里的行标row index
        Dim FullStr, FullLen, Institute_Name '未截取前的字符串、未截取前的全长、机构名称,都是字符串
        
        ridx = 2 '第一行是表头,从第二行开始循环处理
        
        Do While w.Cells(ridx, 15) <> "" '只要不为空就接着循环
            
            FullStr = w.Cells(ridx, 15) '把全长的字符串读出来准备查找分隔符
            FullLen = VBA.Len(FullStr) '把全长字符串的长度读出来
            
            Rem 感谢VBA.InStrRev()函数,VBA里面的FIND找的是Range不是Str,不要和Excel函数搞混了
            
            Delimiter_Sub = VBA.InStrRev(FullStr, ">>") '找到以后输出下标
            
            Rem 很有意思的一点,VBA.InStrRev()函数返回的下标还是从左往右数的哦!
          
            Debug.Print "第" & ridx & "行数据里的分隔符出现在" & "" & Delimiter_Sub & "位"
            'VBE立即窗口内可以监视下跑的情况
            
            If Delimiter_Sub = 0 Then '如果InStrRev返回O说明从右往左找了字符串没有发现目标
            
                Institute_Name = FullStr '没找到就不需要截取,机构名就等于原字符串
                
            Else '如果InStrRev返回了大于0的数字,说明找到了分隔符,机构名一定在分隔符右边
            
                Institute_Name = VBA.Right(FullStr, FullLen - Delimiter_Sub - 1)
                '因为是从右边截取,所以截取的长度等于:“字符串全长 - 右起第一个分隔符的下标”
                '截取还要再减1,因为>>本身有长度,InStrRev返回的是“>>”里左边那个的下标
                '因此如果分隔符是由两个或以上字符串组成的话,截取长度为:
                '字符串全长 - InStrRev返回的分隔符下标 - (分隔符本身长度-1)
                
            End If
            
            Debug.Print "第" & ridx & "行数据里的学校名为:" & Institute_Name '输出到立即窗口便于调试
            
            w.Cells(ridx, 15) = Institute_Name
        
            ridx = ridx + 1
            
        Loop
    
    End Sub
    

    代码敲完,在VBE的立即窗口里欣赏下过程就好:

    在立即窗口里监视动态有利于排查原始文件里的问题

    展开全文
  • 我正在尝试在Excel中使用VBA来自动将.txt文件(制表符分隔)转换为.xlsx文件 . 这就是我所拥有:Set WB = Workbooks.Open(folder + file, , , 1)If Right(file, 3) = "txt" Or Right(file, 3) = "xls" ...

    我正在尝试在Excel中使用VBA来自动将.txt文件(制表符分隔)转换为.xlsx文件 . 这就是我所拥有的:

    Set WB = Workbooks.Open(folder + file, , , 1)

    If Right(file, 3) = "txt" Or Right(file, 3) = "xls" Then

    Application.DisplayAlerts = False

    WB.SaveAs filename:=folder + milestone + "_" + loadtype + "_" + Left(file, Len(file) - 4) + "_" + metricDate + "_.xlsx", _

    FileFormat:=51

    Application.DisplayAlerts = True

    Else

    Application.DisplayAlerts = False

    WB.SaveAs filename:=folder + milestone + "_" + loadtype + "_" + Left(file, Len(file) - 5) + "_" + metricDate + "_.xlsx", _

    FileFormat:=51

    Application.DisplayAlerts = True

    End If

    WB.Close

    当然,这只是一段代码,我认为代码的第一部分是最相关的 . 我只是开始检查转换后的.txt文件,因为它们是保存后应该是10%的大小 . 事实证明,二十列被压成三列,所有空格和标签都被删除了 . 不知道发生了什么,因为我不经常使用VBA .

    我在想钥匙在这里:

    Set WB = Workbooks.Open(folder + file, , , 1)

    最后的1表示制表符分隔 . 不知道它会对它打开的.xls文件做什么,但我会担心下一步 .

    感谢您提供的任何指示 .

    编辑 .

    我改变了代码来区别对待.txt和.xls,就像我本来应该做的那样 . 这是当前的代码:

    Dim WB As Workbook

    'Dim WBS As Workbooks

    If Right(file, 3) = "txt" Then

    Set WB = Workbooks.OpenText Filename:=folder + file, DataType:=xlDelimited, Tab:=True

    Application.DisplayAlerts = False

    WB(1).SaveAs filename:=folder + milestone + "_" + loadtype + "_" + Left(file, Len(file) - 4) + "_" + metricDate + "_.xlsx", _

    FileFormat:=51

    Application.DisplayAlerts = True

    WB.Close

    ElseIf Right(file, 3) = "xls" Then

    Set WB = Workbooks.Open(folder + file)

    Application.DisplayAlerts = False

    WB.SaveAs filename:=folder + milestone + "_" + loadtype + "_" + Left(file, Len(file) - 4) + "_" + metricDate + "_.xlsx", _

    FileFormat:=51

    Application.DisplayAlerts = True

    WB.Close

    Else

    Set WB = Workbooks.Open(folder + file)

    Application.DisplayAlerts = False

    WB.SaveAs filename:=folder + milestone + "_" + loadtype + "_" + Left(file, Len(file) - 5) + "_" + metricDate + "_.xlsx", _

    FileFormat:=51

    Application.DisplayAlerts = True

    WB.Close

    End If

    展开全文
  • split(application.worksheetfunciton.trim(string)," ")试试 转载于:https://www.cnblogs.com/zglyzi/p/3174119.html

    split(application.worksheetfunciton.trim(string)," ")试试

    转载于:https://www.cnblogs.com/zglyzi/p/3174119.html

    展开全文
  • 将带分隔符txt文件另存为xls格式 功能:批量另存为一个目录下XLS文件srcPath 源目录desPath 目标目录---------------------------------------Sub SaveAsExcelInPath(srcPath As String, desPath As String) If ...

      将带分隔符txt文件另存为xls格式

     

    '功能:批量另存为一个目录下的XLS文件
    'srcPath 源目录
    'desPath 目标目录
    '---------------------------------------
    Sub SaveAsExcelInPath(srcPath As String, desPath As String)
        If Right(srcPath, 1) <> "/" Then
            srcPath = srcPath + "/"
        End If
        If Right(desPath, 1) <> "/" Then
            desPath = desPath + "/"
        End If
       
        ChDir srcPath
        Dim f_name$
        f_name = Dir(srcPath + "*.xls")       
        While f_name <> ""
            SaveAsExcel srcPath, desPath, f_name
            f_name = Dir()
        Wend
    End Sub

    '---------------------------------------
    '功能:另存为一个XLS文件
    'srcPath 源目录
    'desPath 目标目录
    'FileName 文件名
    '---------------------------------------
    Sub SaveAsExcel(srcPath As String, desPath As String, FileName As String)
        If Right(srcPath, 1) <> "/" Then
            srcPath = srcPath + "/"
        End If
        If Right(desPath, 1) <> "/" Then
            desPath = desPath + "/"
        End If
       
        ChDir srcPath
            Workbooks.OpenText FileName:= _
                srcPath + FileName, _
                Origin:=936, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
                xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, _
                Comma:=False, Space:=False, Other:=False, FieldInfo:=Array(Array(1, 1), _
                Array(2, 1)), TrailingMinusNumbers:=True
            ChDir desPath
            ActiveWorkbook.SaveAs FileName:= _
                desPath + FileName, FileFormat:= _
                xlNormal, Password:="", WriteResPassword:="", ReadOnlyRecommended:=False _
                , CreateBackup:=False
            ActiveWindow.Close
    End Sub

    '调用将c:/下的txt另存为c:/xls目录下,并转换为xls格式

    SaveAsExcelInPath "C:/", _
            "C:/xls"

    展开全文
  • 学习Excel技术,关注微信公众号:excelperfect下面的自定义函数:...CountBlock函数的代码:' ----------------------------------------'参数strText:给出的文本字符串'参数strDelimiter:文本字符串中的分隔符...
  • 是这样的希望能够是现在写入的过程中,按照指定的分隔符,也就是逗号“,”来进行分割,一行数据就写在同一行场景简介其实如果是单个文件,数据量不是很大的话,上面的情况可以通过导入/写入数据...
  • 但是如果用EXCEL VBA workbooks.open打开, 会变成2012年12月2号, 自作主张. 当然如果是21/2/2012, 这种他就不预处理了, 因为无法识别原因吧. 然后又没有办法, 只好使用open for input 方式进行文件
  • 学习Excel技术,关注微信公众号:excelperfectQ:如下图1所示,一个名为“InputFile.csv”文件,每行有6个数字,每个数字使用空格分隔开。图1现在,我要将以60至69开头行放置到另一个名为“OutputFile.csv”文件...
  • VBA SPLIT函数详解

    万次阅读 多人点赞 2019-01-31 13:25:26
    VBA编程是经常会用到字符串拆分函数SPLIT,用法也不复杂,但是大家对于这个函数的参数未必完全了解,下面结合示例讲解一下参数的用法。...delimiter参数为拆分的分隔符,如果省略则使用空格做为分隔符 limit...
  •  另存为文本文件(制表符分隔) ,后文本内容如下,多了双引号 "a""b""c123" abc "abc""21.8.9""" 如何使生成文本文件不带多余双引号呢...
  • 学习Excel技术,关注微信公众号:excelperfect下面的自定义函数:ExtractString函数,来源于《VBA Developer’s Handbook》,对于分析字符串来说,...ExtractString函数代码如下:'指定默认的分隔符'可以指定多个分...
  • vba正确打开分号间隔csv文件

    千次阅读 2018-03-23 22:32:43
    导出到办公电脑上时发现这些csv文件的分隔符不是逗号,而是分号,如果用Excel直接打开,每行的内容会全部堆在第一列而没有分割开,虽然用Excel的分列功能可以简单地解决,但导出的文件非常多,故用vba写了个函数来...
  • 学习Excel技术,关注微信公众号:excelperfect下面的自定义函数:ExtractString函数,来源于《VBA Developer’s Handbook》,对于分析字符串来说,...ExtractString函数代码如下:'指定默认的分隔符'可以指定多个分...
  • vba文件名提取

    2020-11-27 10:40:28
    Sub shishi() Dim ad As String ad = GetFileName("a\20201602.xlss") MsgBox (ad) End Sub Function GetFileName(ByVal sName As String)... '判断后缀名分隔符.位置 iPos = Len(sTemp) - VBA.InStr(1, VBA....
  • excel vba实例

    2008-01-01 10:53:18
    导出带有逗号和引号分隔符的文本文件 计算包含公式、文本或数字单元格数量 计算所选单元格数量 VBA 代码
  • Application.CommandBars("Standard").Controls(2).BeginGroup = True '在常用工具栏第二个按钮前插入分隔符 Cells.WrapText = False '取消自动换行 If Len(Target) > 5 Then '如果当前单元格中字符数超过5个...
  • 下面用户自定义函数SuperMid函数能够在一段文本中提取两个字符、分隔符、单词等之间子文本(字符串)。其中,分隔符可以相同,也可以不同。SuperMid函数代码如下:'提取字符串中在两个子...
  • 适用范围:Microsoft ...本页内容引言 引言导出带有逗号和引号分隔符的文本文件 导出带有逗号和引号分隔符的文本文件计算包含公式、文本或数字单元格数量 计算包含公式、文本或数字单元格数量使用 Saved 属性确...
  • Function HB(rng, Optional ByVal fgf As String = ",") ...'第2参数为可选参数:字符分隔符,将被添加到不为空字符串末尾,忽略时缺省为“,” p = "" For Each cel In rng If cel <> "" Then p = p & fg...
  • VBA中,使用函数Split实现将一个字符串以指定分隔符拆分出多个字符串。 Split函数返回下标下界从零开始一维数组,包含以指定分隔符拆分后形成子字符串,其语法格式如下。 Split(expression[, delimiter[, ...
  • VBA Split()函数

    千次阅读 2018-02-13 14:57:00
    Split()函数返回一个数组,其中包含基于分隔符分割特定数量值。 语法 Split(expression[,delimiter[,count[,compare]]]) 参数说明 Expression - 必需参数。可以包含带分隔符的字符串字符串表达式...
  • VBA将xml格式excel另存为xlsx

    千次阅读 2019-06-15 01:46:26
    需要将从数据库提取数据交给用户,由于数据量较大(好几十万行),若导出为有固定分隔符的文本文件给用户,一来体验上不太好,二来若文本字符和分隔符号相同可能会出问题。于是想导出为Excel,若行数超出Excel行数...
  • 使用VBA在Excel中分列

    千次阅读 2015-02-06 01:48:48
    使用VBA在Excel中处理带分隔符的单元格,分列并形成与原表中”主键“多对一关系。
  • 日期数据在SQL表达式中的应用 在SQL表达式运算符条件中,要查询...也就是说年月日之间的分隔符可以用“-”或“/”。 例如表示2018年3月15日 可以采用以下表达式:年月日 #2018-03-15#年日月 #2018-15-03#年月日 #...
  • 日期数据在SQL表达式中的应用 在SQL表达式运算符条件中,要查询...也就是说年月日之间的分隔符可以用“-”或“/”。 例如表示2018年3月15日 可以采用以下表达式:年月日 #2018-03-15#年日月 #2018-15-03#年月日 #...
  • 使用 Excel 2003 工作表 VBA 示例 发布日期 : 11/4/2004 | 更新日期 : 11/4/2004 Frank Rice Microsoft Corporation 适用范围... 本页内容 引言 导出带有逗号和引号分隔符的文本文件
  • Split 函数 -- 来自微软官方文档返回包含指定数目的子字符串的从零开始的一维数组语法Split(expression,[定界符,[ limit,[ compare ]]])参数 含义express 需要拆分的字符串delimiter 参数为拆分的分隔符,如果...
  • 大家好,我们今日继续讲解VBA代码解决方案的第60讲内容:如何将文本内容转化为数组。这个问题的提出是因为我们在处理一些文字时往往...一:在处理字符串时可以使用Split 函数将字符串按指定的分隔符分开并以数组返回...

空空如也

空空如也

1 2 3 4 5 6
收藏数 114
精华内容 45
关键字:

vba的分隔符