粘贴显示的值
Pasting Values as Displayed
我在 excel 中有一列单元格具有以下格式:“0000.00”
仅供参考,引号不是格式的一部分。
基本上,四位数字后跟两位小数。但是,当数字像“600”时,需要显示为“0600.00”。但是,提供给我的数字列表是通过格式化显示的,所以如果我尝试 VLOOKUP,它无法处理它;它看到的是“600”,而不是显示给我的“0600.00”。
我知道 PasteSpecial Paste:=xlPasteValues
,但这粘贴的是“600”,而不是显示给我的“0600.00”。目前,我可以通过复制值并将它们粘贴到记事本中来实现这样的结果——这对我来说是有办法做到这一点的——但我想创建一个宏来为我做这个。
抱歉任何多余的解释,只是想避免获得仅与粘贴值相关的答案,这不是我要找的。
如您所说,要使用带格式文本的 VLOOKUP 作为查找值,您需要单元格的值与查找值的值相匹配,因此您必须将值转换为像这样的单元格到文本(单个单元格的示例):
Dim rng As Range
Set rng = Range("A1")
rng.PasteSpecial xlPasteFormulasAndNumberFormats
Dim TextValue As String
TextValue = Format(rng, rng.NumberFormat)
rng.NumberFormat = "@" 'We need this line to turn the cell content into text
rng.Value2 = TextValue
我很确定没有 PasteSpecial 选项可以让您在一次操作中完成您想要的操作,因此此解决方案是一种分两步完成的解决方法。
多个单元格大小写:
我意识到上面的代码没有解决粘贴多个单元格的问题,所以这里有一个过程可用于将格式化数字作为文本从一个范围复制到另一个范围:
Sub CopyAsFormattedText(ByRef SourceRange As Range, ByRef DestinationRange As Range)
'Load values into an array
Dim CellValues() As Variant
CellValues = SourceRange.Value2
'Transform values using number format from source range
Dim i As Long, j As Long
For i = 1 To UBound(CellValues, 1)
For j = 1 To UBound(CellValues, 2)
CellValues(i, j) = Format(CellValues(i, j), SourceRange.Cells(i, j).NumberFormat)
Next j
Next i
'Paste to destination by using the top left cell and resizing the range to be the same size as the source range
Dim TopLeftCell As Range
Set TopLeftCell = DestinationRange.Cells(1, 1)
Dim PasteRange As Range
Set PasteRange = TopLeftCell.Resize(UBound(CellValues, 1), UBound(CellValues, 2))
PasteRange.NumberFormat = "@" 'We need this line to turn the cells content into text
PasteRange.Value2 = CellValues
End Sub
基本上是一样的思路,只是有一个循环。
请注意,如果格式始终相同,您可以将其设为变量并将其应用于数组中的每个值,而不是在每个单元格上调用 .NumberFormat
,这不可避免地会增加一些开销。
旁注
有人可能会问为什么我不建议使用:
SourceRange.Cells(i, j).Text
而不是
Format(CellValues(i, j), SourceRange.Cells(i, j).NumberFormat)
这将是一个很好的问题!我想,当列的大小不正确时 .Text
可以 return "###..." 的事实总是让我害怕使用它,但它在代码。但是,我不确定在性能方面会更好。 (查尔斯·威廉姆斯的Relevant article)
我在 excel 中有一列单元格具有以下格式:“0000.00” 仅供参考,引号不是格式的一部分。
基本上,四位数字后跟两位小数。但是,当数字像“600”时,需要显示为“0600.00”。但是,提供给我的数字列表是通过格式化显示的,所以如果我尝试 VLOOKUP,它无法处理它;它看到的是“600”,而不是显示给我的“0600.00”。
我知道 PasteSpecial Paste:=xlPasteValues
,但这粘贴的是“600”,而不是显示给我的“0600.00”。目前,我可以通过复制值并将它们粘贴到记事本中来实现这样的结果——这对我来说是有办法做到这一点的——但我想创建一个宏来为我做这个。
抱歉任何多余的解释,只是想避免获得仅与粘贴值相关的答案,这不是我要找的。
如您所说,要使用带格式文本的 VLOOKUP 作为查找值,您需要单元格的值与查找值的值相匹配,因此您必须将值转换为像这样的单元格到文本(单个单元格的示例):
Dim rng As Range
Set rng = Range("A1")
rng.PasteSpecial xlPasteFormulasAndNumberFormats
Dim TextValue As String
TextValue = Format(rng, rng.NumberFormat)
rng.NumberFormat = "@" 'We need this line to turn the cell content into text
rng.Value2 = TextValue
我很确定没有 PasteSpecial 选项可以让您在一次操作中完成您想要的操作,因此此解决方案是一种分两步完成的解决方法。
多个单元格大小写:
我意识到上面的代码没有解决粘贴多个单元格的问题,所以这里有一个过程可用于将格式化数字作为文本从一个范围复制到另一个范围:
Sub CopyAsFormattedText(ByRef SourceRange As Range, ByRef DestinationRange As Range)
'Load values into an array
Dim CellValues() As Variant
CellValues = SourceRange.Value2
'Transform values using number format from source range
Dim i As Long, j As Long
For i = 1 To UBound(CellValues, 1)
For j = 1 To UBound(CellValues, 2)
CellValues(i, j) = Format(CellValues(i, j), SourceRange.Cells(i, j).NumberFormat)
Next j
Next i
'Paste to destination by using the top left cell and resizing the range to be the same size as the source range
Dim TopLeftCell As Range
Set TopLeftCell = DestinationRange.Cells(1, 1)
Dim PasteRange As Range
Set PasteRange = TopLeftCell.Resize(UBound(CellValues, 1), UBound(CellValues, 2))
PasteRange.NumberFormat = "@" 'We need this line to turn the cells content into text
PasteRange.Value2 = CellValues
End Sub
基本上是一样的思路,只是有一个循环。
请注意,如果格式始终相同,您可以将其设为变量并将其应用于数组中的每个值,而不是在每个单元格上调用 .NumberFormat
,这不可避免地会增加一些开销。
旁注
有人可能会问为什么我不建议使用:SourceRange.Cells(i, j).Text
而不是
Format(CellValues(i, j), SourceRange.Cells(i, j).NumberFormat)
这将是一个很好的问题!我想,当列的大小不正确时 .Text
可以 return "###..." 的事实总是让我害怕使用它,但它在代码。但是,我不确定在性能方面会更好。 (查尔斯·威廉姆斯的Relevant article)