ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 5645|回复: 4

仍是有关空行删除以及VBA.INSTR函数

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-4-27 14:28 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

问题403.仍是有关空行删除以及VBA.INSTR函数

首先申明,我说的"空行"不是普通意义上的无字符的空行,而是无"可见字符"的行(即在WORD中"显示/隐藏编辑标记"处于隐藏状态时没有字符,但在处于显示状态下能见到只有空格的行).这是引起麻烦的关键. 我的"空行"是广义的,以下简称"广空",而通常理解空行的是狭义的,以下简称"狭空", "广空"="狭空"+"该行中的空格" 上次版主提供的删除空格程序(如下),

Option Explicit Sub Example() Dim i As Paragraph Application.ScreenUpdating = False For Each i In ActiveDocument.Paragraphs If Len(i.Range) <= 4 Or VBA.InStr(i.Range, "??") > 0 Then i.Range.Delete Next Application.ScreenUpdating = True End Sub 经试验,二个判断条件中仅前一个有效,而后一个(即VBA.InStr语句)无效,通过下述程序 For Each i In ActiveDocument.Paragraphs xx = VBA.InStr(i.Range, "??") MsgBox xx Next 证明所有行(不管是有"狭空"还是"广空"),xx的值恒为0.因此,该程序一旦碰到行中有三个以上空格的段落,就删不了(附上样本文件,请试试能否全部删除所有"广空").

另,VBA.INSTR与INSTR有何区别?我用后者代换前者,好象区别不大? VBA.InStr(i.Range, "??")中的??是何意义?版主的原意是否是将段中的各个字符与所有可见字符进行比较?

LITVPlsf.rar (2.89 KB, 下载次数: 18)

TA的精华主题

TA的得分主题

发表于 2005-4-27 19:41 | 显示全部楼层

用这个代码:

Set Doc1 = Documents.Open(FileName:="G:\007\dyg\好样的\A101.doc", Visible:=False)

For Each i In Doc1.Paragraphs(3).Range.Characters ' With i If i.Text = Chr(32) Then i.Delete Else End If ' End With Next i

''我测试时第3段是含15个空格的空行段

TA的精华主题

TA的得分主题

发表于 2005-4-28 05:09 | 显示全部楼层

哈哈,都怪我一时粗心,在复制时,没有使用我的"VBE中文代码复制器"(http://club.excelhome.net/viewthread.php?tid=71272)所造成的.在代码复制到网页,其中的两个全角空格变成了"¡¡",而这个在复制粘贴到WORD VBE中时,又变成了"??",着实让楼主很是焦急了一翻,有趣极了.

我初看此贴,我也纳闷得很啊,怎么会有这句代码呢?VBA.InStr(i.Range, "??"),没有这个用法啊,我晕,所有,查看了所有楼主的贴子后,才知道,都是粘贴惹的祸![em03]

以下是正确的代码:

'* +++++++++++++++++++++++++++++ '* Created By I Love You_Word!@ExcelHome 2005-4-28 5:00:54 '仅测试于System: Windows NT Word: 10.0 Language: 2052 '^The Code CopyIn [ThisDocument-ThisDocument]^' '* -----------------------------

Option Explicit Sub Example() Dim i As Paragraph Application.ScreenUpdating = False For Each i In ActiveDocument.Paragraphs If Len(i.Range) <= 4 Or VBA.InStr(i.Range, "  ") > 0 Then i.Range.Delete Next Application.ScreenUpdating = True End Sub '---------------------- 但是,象这种情况,WORD的自带的查找与替换,如楼主一楼的问题一样,可以解决,请参以下图片:

其中查找部分中,注意不区分全角/半角,其空格无论全半角,其中的^w即是指空格(空白),替换为^p(段落标记),全部替换.

然后,再使用查找与替换,查找^p^p,替换为^p,反复数次.

如果你觉得不爽,则自己按照思路,结合录制宏(空白部分的替换),自己写个小代码,OK!

仍是有关空行删除以及VBA.INSTR函数

仍是有关空行删除以及VBA.INSTR函数

TA的精华主题

TA的得分主题

发表于 2005-4-28 05:13 | 显示全部楼层

另:

前缀VBA是指INSTR函数的库VBA(隶属于VBA库)的一个函数,通常可以不写,但使用VBA.INSTR更直观,且能够根据VBA.自动列出成员,可以防止写错或者写误.

如:以下左边三个函数与右侧三个是完全等同的,一致的.

VBA.INSTR()=INSTR()

VBA.MID()=MID()

VBA.LEFT()=LEFT()

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-4-30 12:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

报歉,由于我的粗心,这个问题其实在前次已得解决。

与楼上方法不同,我的方案是

一。先将所有回车符换为手动分行符;

二、在寻找替换框内输入[ ^t]^l,并不使用区分全半角,其意义为将所有以制表符或空格开头,并重复若干次的行删除。

三。再将所有换行符换为回车符;

问题是能解决了,但我并不满意--速度还是慢,对一个200K的文件(7000行)处理时间得一分十秒,而用EDITPLUS仅仅十五秒,版主的方案能快一些么?(我得回家才能试)

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-13 15:01 , Processed in 0.038558 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表