replace后,Excel VBA值保持string格式

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

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

第1页:
描述:
家庭使用
业主
专业的
首席财务官
秘书

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

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

下面的代码可以将主数据表中第一列的数据映射到数据表中,并用它们replace表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等。
有没有办法保存001string格式?
谢谢。

试试下面。 请注意,它仍强制replace格式,以便单元格中的值仍然是技术上的数字。 这是Excel的replacefunction的一个缺点 – 它只是如何工作,因为它想要假设所有东西都是数字的。

请注意,您也将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的内置replace。 更好的select,如果我们不想混乱Excel的内置replace方法,我们可以自己做,快速和容易:

 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 

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

如果您将必须使用很多单元格,请考虑在运行过程之前closuresApplication.ScreenUpdating ,然后重新开始。 这将加快速度,因为它不必担心在工作时渲染到屏幕上。

另一个非VBA的想法是保留原始值并在其旁边添加数据:

你也可以使用没有任何VBA代码的Vlookup获得这些信息(尽pipe在不同的列中)。 如果您将说明切换到A栏,将您的代码切换到主页上的B栏,则可以转到Sheet1,突出显示B栏中的单元格并键入以下公式:

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

不要点击input,而是点击Control + Shift + Enter 。 这创build了所谓的数组公式。 这不会替代你,但提供旁边的列中的数据。 如果您需要另一种获取方法,只需将其作为一些额外的信息扔在那里。

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