我是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字符串格式?
感谢。
答案 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公式