Excel仅使用pastespecial值忽略目标格式

时间:2018-03-30 09:02:31

标签: excel vba excel-vba excel-2016

我有一个相当简单的vba脚本,它将一个工作表范围内的trasposed值复制到另一个,这里是相关的代码:

wb.ActiveSheet.Range("D2", "D32").Copy
cwb.ActiveSheet.Range("B10").PasteSpecial Paste:=xlPasteValues, Transpose:=True

源范围是未格式化的文本(无法控制此格式)但是时间(xx:xx),而目的地已适当预先格式化为时间(xx:xx)

似乎目标范围中的值被视为纯字符串,而不是根据指定的规则进行格式化。只要我选择一个单元格并按下输入,就会应用格式

当我在vba中粘贴范围时,如何触发相同的行为? 不应要求用户确认每个单元格。

我应该补充说,这会导致一些计算失败,因为要优于那些不是数字。

3 个答案:

答案 0 :(得分:2)

在您的情况下,常规复制>> PasteSpecial 不起作用,您需要将输入为String的时间转换为时间格式,实际上是从0到1的十进制值。您可以使用TimeValue函数来实现它。

因此,您需要Set CopyRng个对象到您要复制的范围,并循环遍历它,每个单元格都使用TimeValue将字符串转换为时间格式。

<强> 代码

Dim CopyRng As Range
Dim i As Long

Set CopyRng = wb.ActiveSheet.Range("D2", "D32") ' <-- I would try to avoid using Active Sheet

' loop through all cells in your range
For i = 1 To CopyRng.Cells.Count
    cwb.ActiveSheet.Range("B10").Offset(0, i - 1).Value = TimeValue(CopyRng.Cells(i, 1).Value)    
Next i

答案 1 :(得分:2)

Shai Rado之前的回答是有效的,但有一个重大的回归,它是我阅读+我写作业。我还建议使用TimeValue函数,但只有一个读/写如下:

Function transposeAsTime(SourceRng As Range, TargetRng As Range)

Dim x As Variant
Dim y As Variant
x = SourceRng
ReDim y(1 To 1, 1 To UBound(x, 1))


For i = 1 To UBound(x, 1)
   y(1, i) = TimeValue(x(i, 1))
Next i

TargetRng.Resize(1, 1).Resize(1, UBound(y, 2)) = y

End Function

执行:

Sub test()
transposeAsTime ThisWorkbook.Sheets(1).Range("D2:D32"), 
ThisWorkbook.Sheets(1).Range("D10")

End Sub

答案 2 :(得分:0)

您可以尝试添加以下代码(未经测试):

cwb.ActiveSheet.Range("B10").PasteSpecial Paste:=xlPasteFormats, Transpose:=True