替换后,Excel VBA值仍为字符串格式

时间:2014-09-13 16:15:18

标签: excel vba excel-vba

我是Excel VBA的新手。我发现一个脚本可以帮助我将数据从一个工作表映射到另一个工作表,但在映射完成后,值格式才会改变。

我有两张纸,第1页是原始数据表,主数据表是存储地图数据的地方。请参阅下面的表结构:

表1:
说明
家庭用途
企业主
专业
CFO

主数据表:
代码说明
001家庭用途
002业主
003专业
004 CFO
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字符串格式?
感谢。

1 个答案:

答案 0 :(得分: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公式