替换后Excel VBA值保持字符串格式

Posted

技术标签:

【中文标题】替换后Excel VBA值保持字符串格式【英文标题】:Excel VBA value remains string format after replacment 【发布时间】:2014-09-13 16:15:18 【问题描述】:

我是 Excel VBA 的新手。我找到了一个脚本,可以帮助我将数据从一个工作表映射到另一个工作表,但映射完成后,值格式就发生了变化。

我有两张表,表 1 是原始数据表,主数据表是存储映射数据的位置。请看下表结构:

表 1:说明: 家用 企业主 专业 首席财务官 秘书

主数据表:代码说明 001 家用 002 企业主 003专业 004 首席财务官 005秘书

您可能会看到主数据表中第一列中的值是文本格式,即 001、002 等

下面的代码可以映射主数据表第一列中的数据,并使用它们替换表 1 中的描述。

Sub mapping()

Dim rng1 As Range, rng2 As Range, cel As Range  
Dim StrMyChar As String, StrMyReplace As String

With ActiveWorkbook.Worksheets("Master Data")
    Set rng1 = .[B1:B5]
End With

With ActiveWorkbook.Worksheets("Sheet1")
    Set rng2 = .[A2:A6]
End With

'loop down list of texts needing replacing
For Each cel In rng1.Cells
    StrMyChar = cel.Value
    StrMyReplace = cel.Offset(0, -1).Value

    'replace text
    With rng2
        .Replace What:=StrMyChar, Replacement:=StrMyReplace,_  
         SearchOrder:=xlByColumns, MatchCase:=False
    End With
    'Next word/text to replace
Next cel

End Sub  

运行代码后,我发现所有的 001、002 等都变成了 1、2 等。 有没有办法让我保留 001 字符串格式? 谢谢。

【问题讨论】:

您很可能需要将每个单元格的 .NumberFormat 属性设置为“@”(@ 表示文本),否则 Excel 会尝试将其转换为数字,而 001 会转换为 1 嗯,你能帮我指出我应该把 .NumberFormat 放在代码的什么地方吗?我是一个完全编码的处女。谢谢。 其实我只是发现这行不通。事实上,如果您尝试使用 control-h 进行替换并手动进行,将其设置为文本格式的事件会替换数字。你只需要说数字格式可以是 00#(表示它仍然是数字,但显示前导零)或者你可以做一个 vlookup 并让它直接从另一张纸上显示值 嗯,我知道 vlookup 或索引/匹配,但上面的示例只是从一个非常琐碎的数据集中提取的一个,其中包含许多要映射的列。这项工作需要反复进行,因此我想要一个自动化的解决方案。 查看我的答案,替换格式“@”不适用于内置替换。但我们可以在定义的范围内编写自己的替换 【参考方案1】:

在下面试试这个。请注意,它仍然强制替换格式,因此单元格中的值在技术上仍然是数字。这是 Excel 替换功能的一个缺点——它的工作原理正是因为它想假设一切都是数字的。

请注意,您也将 rng1 设置为错误的范围,应该是 b2-b6 而不是 b1-b5

        With ActiveWorkbook.Worksheets("Master Data")
            Set rng1 = .[B2:B6] ' Note that you had the wrong range here
        End With

        'this will force two leading zeros if necessary call it before the replace
        Application.ReplaceFormat.NumberFormat = "00#" 

        'then add ReplaceFormat:=true to your replace string
        .Replace What:=StrMyChar, Replacement:=StrMyReplace, _
                 SearchOrder:=xlByColumns, MatchCase:=False, ReplaceFormat:=True

很遗憾,ReplaceFormat.NumberFormat = "@" 不适用于 Excel 的内置替换。如果我们不想弄乱 Excel 的内置替换方法,更好的选择是我们可以自己做,又快又简单:

Option Compare Text 'use this for case insensitive comparisons
Sub Mapping()

    Dim rngLookup As Range
    Set rngLookup = ActiveWorkbook.Worksheets("Master Data").[B2:B6]

    Dim rngReplace As Range
    Set rngReplace = ActiveWorkbook.Worksheets("Sheet1").[A2:A6]

    Dim cell As Range, cellLookup As Range
    For Each cell In rngReplace
        Dim val As String
        val = cell.Value
        For Each cellLookup In rngLookup
            If cellLookup.Value = val Then
                cell.NumberFormat = "@"
                cell.Value = cellLookup.Offset(0, -1).Value
                Exit For
            End If
        Next
    Next
End Sub

此代码循环遍历工作表 1 中的每一行,然后在主工作表中搜索正确的条目,但在复制之前将数字格式设置为“@”。你应该很好。

如果您将不得不处理大量单元格,请考虑在运行程序之前关闭Application.ScreenUpdating,然后再重新打开。这将加快速度,因为它不必担心在工作时渲染到屏幕。

另一个非 VBA 想法,既保留原始值,又在其旁边添加数据:

您也可以使用没有任何 VBA 代码的 Vlookup 获取此信息(尽管在不同的列中)。如果您在主工作表上将说明切换到 A 列,将代码切换到 B 列,则可以转到 Sheet1,突出显示 B 列 中的单元格并输入以下公式:

=VLOOKUP(A2:A6,'Master Data'!A2:B6,2,FALSE)

不要按 Enter,而是按 Control+Shift+Enter。这将创建所谓的数组公式。这不会代替您,但会在旁边的列中提供数据。如果您需要另一种获取方式,只需将其作为一些额外信息扔掉即可。

您还可以使用 Range.Formula 属性为 VBA 中的单元格设置公式,并将其设置为上面的 vlookup 公式

【讨论】:

嗯,我该怎么做?标记答案左上角的绿色勾号?我已经这样做了。这意味着赞成还是接受? 接受是复选标记。赞成票是灰色的小箭头。谢谢 嗨,你帮我写了这么好的代码已经一年多了。我现在遇到另一个障碍:在Sheet1中的源数据中,还有一些主数据中没有的其他值,例如在主数据表中找不到标题“Director”,如果找不到,如何删除它?谢谢。

以上是关于替换后Excel VBA值保持字符串格式的主要内容,如果未能解决你的问题,请参考以下文章

excel中vba中Selection.Replace的用法,及参数的含义

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

如何使用 VBA 在 Excel 注释中查找和替换日期格式

保存工作簿 Excel VBA 时删除非法字符

用excel中的VBA,然后根据excel中单元格中内容,批量替换一个word的模板doc中的字符。字符有很多处。

Excel VBA查找,用字符串中的日期替换纪元时间戳