Excel 仅 pastespecial 值忽略目标格式
Excel pastespecial only values ignores target format
我有一个相当简单的 vba 脚本,可以将 sheet 范围内的换位值复制到另一个范围内,这里是相关代码:
wb.ActiveSheet.Range("D2", "D32").Copy
cwb.ActiveSheet.Range("B10").PasteSpecial Paste:=xlPasteValues, Transpose:=True
源范围是未格式化的文本(对此无法控制)但它是一个时间 (xx:xx)
,而目标已适当地预格式化为时间 (xx:xx)
。
目标范围内的值似乎被视为普通字符串,而不是根据指定规则进行格式化。只要我 select 一个单元格并按输入格式 就应用 。
在 vba 中粘贴范围时如何触发相同的行为?
不应要求用户确认每个单元格。
我应该补充一点,这也会导致一些计算失败,因为 excel 这些不是数字。
您可以尝试添加以下代码(未测试):
cwb.ActiveSheet.Range("B10").PasteSpecial Paste:=xlPasteFormats, Transpose:=True
在您的情况下,常规 Copy >> 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
Shai Rado 之前的回答有效,但有一个主要的倒退,它有我读 + 我写操作。我还建议使用 TimeValue
函数,但只有一个 read/write 如下:
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
我有一个相当简单的 vba 脚本,可以将 sheet 范围内的换位值复制到另一个范围内,这里是相关代码:
wb.ActiveSheet.Range("D2", "D32").Copy
cwb.ActiveSheet.Range("B10").PasteSpecial Paste:=xlPasteValues, Transpose:=True
源范围是未格式化的文本(对此无法控制)但它是一个时间 (xx:xx)
,而目标已适当地预格式化为时间 (xx:xx)
。
目标范围内的值似乎被视为普通字符串,而不是根据指定规则进行格式化。只要我 select 一个单元格并按输入格式 就应用 。
在 vba 中粘贴范围时如何触发相同的行为? 不应要求用户确认每个单元格。
我应该补充一点,这也会导致一些计算失败,因为 excel 这些不是数字。
您可以尝试添加以下代码(未测试):
cwb.ActiveSheet.Range("B10").PasteSpecial Paste:=xlPasteFormats, Transpose:=True
在您的情况下,常规 Copy >> 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
Shai Rado 之前的回答有效,但有一个主要的倒退,它有我读 + 我写操作。我还建议使用 TimeValue
函数,但只有一个 read/write 如下:
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