如何用vba将文本数字改为数值?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何用vba将文本数字改为数值?相关的知识,希望对你有一定的参考价值。

单元格格式为文本类型,此时输入了数值"100",做自动求和时发现此100无法被计算,于是将其单元格格式改为数值类型,但自动求和仍然不能计算这100,应该是该单元格格式虽然纠正了,但其中的"100"仍然是文本类型,此时删除后重新输入一次就可以了,但这是人为纠正的,有没有办法使用vba来将这个仍然是文本类型的100变为数值类型?求高人指点,谢谢!

将文本转换为数值,推荐两种方法:

一是【分列】,选择需要转换的单列数据,点【数据】下面的【分列】按钮,弹出对话框后直接点【完成】即可。如果多列需要多次操作。【分列】按钮的位置如下图:

二是楼主要求的VBA办法,此方法主要用于解决太多列需要处理的情况,列不多的时候用不着这么复杂,先给出把全表转换为数值的程序代码:

sub 宏1()

    dim arr

    arr=activesheet.usedrange

    activesheet.usedrange=arr

end sub

注意,这个代码把全表都转换了,如果原来有部分区域有公式也会转换为数值,如果有部分区域是身份证号码等长数字,转换后会丢失内容。如果只转换某个区域(例如A2:F100),代码需要修改如下:

sub 宏1()

    dim arr

    arr=range("a2:f100")

    range("a2:f100")=arr

end sub

程序一次只处理一个连续区域,有多个区域(例如A2:F100, H3:L5)可以使用下面的循环办法:

sub 宏1()

    dim arr, rng

    for each rng in array("A2:F100",   "H3:L5")

        arr=range(rng)

        range(rng)=arr

    next rng

end sub

这个代码可以解决无数多个区域的情况,依次按格式写在后面即可。

追问

高手,再请教下,如何用vba实现将单元格中的内容强制转换为文本类型?

参考技术A

用VBA是可以的,但你这个情况,感觉没必要用VBA。

方法一:

    选中这一列设置为常规格式,

    选中这一列,进行替换,0全部替换为0、1全部替换为1,2全部替换为2,......,0至9这十个数字分别替换一次,共替换十次,以保证每一个单元格都被替换到。只要单元格被替换到(单元格有变更)就会重新识别单元格格式的。

方法二:

    找一列空列进行辅助,输入公式=--A1并下拉填充,这列得出的就是数值格式。

    选中辅助列,复制,再选中A列,右键---粘贴为值,将A列覆盖,A列就变成数值了。

    最后把辅助列删除或清空。

参考技术B 可采用Val函数可以将包含数值的字符型数据转化为Double(双精度)数值型数据类型,其语法为Val(string)演示代码如下:
Sub ShowFormatVal()
Dim num As Double, str As String
str = Format(Now, "Short Time")
num = Val(str)
'如果现在的时间是 1:45 AM,下面语句展示的结果为: 1:45 1
Debug.Print str, num
End Sub
说明:
1、字符型数值是不能进行四则运算的,只能通过Val函数将其转换后才能使用。
2、可以将8进制、16进制等转化为10进制数,如,Val(&o77)(8进制)、Val(&HFF)(16进制)分别转化为十进制的63和255追问

还是不懂,能按我的问题来回答么,谢谢!

追答

请问你是哪一块不了解?我给你的就是VBA的写法参考。

如何用VIM缓冲区中的文本替换整行?

【中文标题】如何用VIM缓冲区中的文本替换整行?【英文标题】:How to replace the whole line with the text in the buffer in VIM? 【发布时间】:2011-10-01 16:47:24 【问题描述】:

这是我正在处理的文本:

line1: 网站 = "a.com"; ... 第 3 行:网站 =“b.com”; ... 第5行:网站=“c.com”;

假设我想将所有网站更改为“***.com”,我可以这样做: - 将“a.com”更改为“***.com” - 拉动整行 (Y) - 转到第 3 行,按 p、k、dd 从缓冲区粘贴并删除旧的“b.com”行。

现在的问题是,由于 dd 将“b.com”放入缓冲区,为了替换 line5,我必须再次拉出整行。 有什么简单的方法可以让我快速用已经拉出的线替换 line3 和 line5 吗?

更新: 感谢您的回答,现在有几种方法可以做到这一点:删除到黑洞,从命名缓冲区中拉出等。我发现这是我最喜欢的方法(我使用键 R 而不是 r,因为有时我需要替换单个字符):

In Vim is there a way to delete without putting text in the register?

我在下面放了一些类似 SO 问题的链接:

How to Delete (desired text), delete (undesired text), and paste (desired text) in VimIn Vim is there a way to delete without putting text in the register?

【问题讨论】:

不要发布您自己的答案作为对问题的编辑。将其作为单独的答案发布。 【参考方案1】:

您可以为此使用命名缓冲区,而不是默认的未命名缓冲区:"lY 然后"lp 分别拉取。从寄存器l 粘贴,然后让dd 使用默认缓冲区。

【讨论】:

嗯,我是 VIM 新手,所以我对命名缓冲区不熟悉。 我刚刚给了你食谱。缓冲区名称是(在可移植的vi 中)单个字母;您在使用带有" 和缓冲区名称的缓冲区的命令之前,因此将Y 替换为"lYp"lp,正如我所说的(或使用任何其他字母;vim 可能允许其他字符也是如此,甚至可能支持更长的名称,但我无能为力)。 @AZ。别担心,即使“老了”,你也可能不熟悉 vim 的一半。【参考方案2】:

重读这个问题,我认为这更接近你所追求的:

In Vim is there a way to delete without putting text in the register?

例如而不是使用dd 使用"_dd

【讨论】:

替换将适用于示例文本,但实际上要为要替换的文本找到通用模式并不容易。我认为在这种情况下,基于行的方法比基于内容的方法更快。 我想我已经更好地理解了您的需求,现在我已经编辑了我的回复以反映它。【参考方案3】:

我认为,这不是对您问题的回答,而是对您真正问题的回答。

技巧1:你知道:s吗?如果您只想替换所有匹配项,则可以执行以下操作:

:%s/^website = "\zs.*\ze\.com";$/***/

由于您没有指定全部的精确格式以及是否要替换全部或仅替换部分,我不能说这是否是您想要的。

技术 1b: 即使您只想替换一些,:s 也有一个有用且不太广为人知的标志:c,“确认”。 (请参阅:help :s_flags,更具体地说是:help :s_c。)然后您可以决定是否要替换它。

:%s/^website = "\zs.*\ze\.com";$/***/c

技巧 2: 你也可以搜索、替换然后重复。 /^website = "\zs.*\ze\.com";$,然后 cw***Esc 将单词替换为“***”。然后n去下一场比赛,如果你想用“***”替换它,使用.

【讨论】:

第二种方法非常智能,符合“Bram Moolennar”va.mu/BdAn的“有效文本编辑的7个习惯”@ 我对否决票很好奇。我想这是因为我没有回答海报提出的确切问题?如果是这样,我认为您因此而受到惩罚是不公平的;重要的从来不是提问者问什么,而是他们的意思,我认为很可能回答了发问者的真正问题。【参考方案4】:

首要任务

不需要显式删除该行,您可以做得更好:

    将整行拉入寄存器x: "xY 转到下一行替换 可视选择整行:V 粘贴来自寄存器 x 的选择:"xp

现在删除的行和往常一样在寄存器 " 中,但被拉出的行仍然在寄存器 x 中,因此您可以重复步骤 2 到 4,而不必一遍又一遍地拉动。

重复的事情重复

很遗憾,您不能使用 . 重复步骤 3+4。因此,如果您必须为很多行执行此操作,请再插入几个步骤来录制宏:

    将整行拉入寄存器x: "xY 转到下一行替换 将宏记录到w 寄存器中:qw 可视选择整行:V 粘贴来自寄存器 x 的选择:"xp 停止录制:q 转到下一行替换 重播录制到w的宏:@w 转到下一行替换 现在终于可以像上次一样重播:@@

然后,您只需对接下来需要替换的 50 行重复步骤 9 和 10。

最后(重复)的事情最后

事实上,如果您通过搜索找到下一行,那么您也应该使用该搜索转到first行。因为你用来转到下一行的 n 可以作为宏的一部分包含在内——基本上你只需交换步骤 6 和 7。

然后您根本不必手动转到下一行进行替换,因为宏会将您发送到那里作为它所做的最后一件事。当您碰巧想跳过特定比赛时,您可以继续点击 @@ 以及任何偶尔的 n

参考

help " help registers help complex-repeat

【讨论】:

【参考方案5】:

"0 寄存器始终包含您最后拉出的文本。然后你可以这样做:

将“a.com”更改为“***.com” 拉整行 (Y) 转到第 3 行,点击“0p, k, dd 从缓冲区粘贴并删除旧的“b.com”行。 转到第 5 行,点击“0p, k, dd 从缓冲区粘贴并删除旧的“c.com”行。

【讨论】:

【参考方案6】: ci" - 改变"" ctrl-r 0 - 放置默认寄存器 jj - 向下移动两行 . - 重复上一个命令 jj .

【讨论】:

以上是关于如何用vba将文本数字改为数值?的主要内容,如果未能解决你的问题,请参考以下文章

vba中如何将单元格内容强制转换为文本类型?

如何用VBA将excel表导出成文本类型的文件?

Excel中如何用VBA判断行数?

请问,在Excel中如何用VBA提取数据后保留原格式不变?

excel vba将公式转为数值

vba中怎么用代码将单元格内容转换为文本类型?