Excel VBA 8.40 含有文本的单元格 如何计算

含有文本的单元格 如何计算


点击上方“Excel和VBA”,选择“置顶公众号”

致力于原创分享Excel的相关知识,源码,源文件打包提供

一起学习,一起进步~~


最近几天,我们也是分享了一些公式在VBA当中的运用,这不,前几天又有小伙伴丢给我一个问题,主要是文本的计算的,其实文本的计算,我们完全可以利用函数来实现的,不过函数要写的公式就比较的长,而且并不是很好理解。

既然VBA那么强大,是不是可以有简单一点的方法来实现呢?

场景说明

不管简单不简单,我们先来看看场景

今天我们模拟的这个场景,也是非常简单,但是还是符合今天的场景需要的,我们可以看到这里分为两个场景,最上面三个是一种场景,纯粹的数字搭配运算符的模式,

后面三行,则是更加复杂的一种数据登记方法,数字+文字

总体来说,这种登记方法肯定是不规范的,也是不提倡的,但是事在人为,有些仓库或者出入库管理也不得不这样登记,那么在这样的情况,我们要如何针对这个单元格的内容来进行计算呢?

既然是两个场景,我们分开来两段代码

代码区

先来看看第一个 场景,比较简单的,纯粹的数字+运算符的计算,不知道函数大神会用什么样的方法来实现,这里我们来看看VBA的方法

Sub tests3()Dim rng As Range, a As RangeSet rng = Application.InputBox("请选择单元格区域", "区域的选择", , , , , , 8)For Each a In rng    a.Offset(0, 1) = Application.Evaluate(a.Value)NextEnd Sub

看看效果

第一个场景比较简单,利用相对较少的代码,也实现了

来看看第二个场景,稍微有点复杂,不过我们可以搭配前面学习过的正则来实现

Sub tests33()Dim rng As Range, a As RangeSet rng = Application.InputBox("请选择单元格区域", "区域的选择", , , , , , 8)For Each a In rng     With CreateObject("VBSCRIPT.REGEXP")    .Pattern = "[\u4e00-\u9fa5]"    .IgnoreCase = True    .Global = True    If .test(a) Then      s = .Replace(a, "")    End If    End With    a.Offset(0, 1) = Application.Evaluate(s)NextEnd Sub

来看看效果如何

也是成功的实现了我们的要求,那么我们来看看代码吧

代码解析

首先,我们来看第一个场景,这个场景下,我们如果要计算单元格内的数据的结果,我们需要如何来实现呢?

这里我们利用VBA中的方法evaluate就可以实现。

其实他本身也是也算是Excel自带的函数,应该是宏表函数,他的使用方法,手工操作是比较复杂的,需要新建一个区间,然后才可以使用 具体的使用方法,大家可以自行搜索下,是比较繁琐的,至少需要6个步骤才可以得到结果。

但是在VBA中就非常的简单,就一句代码

a.Offset(0, 1) = Application.Evaluate(a.Value)

Evaluate加上单元格的内容就可以了

特别注意,Evaluate前面的这个application不能丢,一定要带上,不然代码是出错的,会提示变量不存在的。

有了Evaluate的使用基础,我们就可以进入第二个场景了。

多了很多不必要的文字,那么我们直接将这些文字替换掉,不就可以了嘛?

要想替换文字,肯定要找到文字,那么如何找到单元格中的文字呢?

前面我们不是学习过利用正则提取单元格中的文字嘛?能提取,自然就能替换了,

是不是一些字思路就有了。那么就可以上代码了。

With CreateObject("VBSCRIPT.REGEXP") .Pattern = "[\u4e00-\u9fa5]" .IgnoreCase = True

比较一下,上下两个场景,有什么区别

.Global = True If .test(a) Then s = .Replace(a, "") End If End With

这一段代码就是标准的正则表达式了

相信大家通过之前的学习,应该能够知道大部分的代码意思了。

进入重点,之前我们学习的是正则表达式提取中文,今天稍微改动下,变成替换

If .test(a) Thens = .Replace(a, "")End If

如何替换呢?

replace方法,这是通用的替换模式了。

来看看代码执行的 效果

成功的将所有的中文替换为了空值,那么我们得到的s的内容就和上面的场景一一致了,后面的方法就和之前一样了。

这样前后知识一连贯,是不是就简单了很多,比花费时间去分析那个长长的行数公式更好理解呢?

(0)

相关推荐