我有一个Excel 2010工作表,其中设置了宏以将其他工作表中的数据复制到另一个工作表上的特定格式以供其他进程使用。我需要的数据复制好,但我有一个问题,单元格范围的格式保存日期或时间值。数据源自数据库提取,一切都是文本格式。在我的工作表中,当我复制日期时(通过VBA代码程序),我应用了我们需要的格式,日期为"yyyy-mm-dd"
,时间为"hh:mm.ss.ss"
。
我们不会使用固定数量的行,因此我已将vba代码设置为将格式应用于单元格范围,例如:
AssDateLastRow = shAss.Range("C" & Rows.Count).End(xlUp).Row
shAss.Range("C4:C" & AssDateLastRow).NumberFormat = "yyyy-mm-dd"
到目前为止,这项工作正常!出于某种原因,虽然并非所有范围内的单元格都应用了正确的格式,但它们将显示为15/04/2014
而不是2014-04-15
。如果我手动选择单元格并按 F2 然后按 ENTER 键,格式将显示为我需要的格式。这种情况在整个范围内随机发生,可能有数千行,所以虽然工作表在每一行上手动点击 F2 + ENTER ,但拖网不实用。
我已经在互联网上寻求帮助,并发现我认为应该自动使用vba编码执行 F2 + ENTER 位,但它不起作用,我不明白为什么(我是VBA的初学者!)
下面的代码粘贴是我到目前为止所提供的,它是从更大的代码行中提取的,因此dim
语句等在实际副本中更进一步,但这应该显示方式到目前为止,我已经解决了这个问题。
Dim shAss As Worksheet
Dim AssDateLastRow As Long
Dim c As Range
'enter method to format 'Date Craftperson Assigned' and 'Time Craftperson Assigned' in Assignments sheet
'column "C" and "D", to formats required by Archibus: date "yyyy-mm-dd", time "hh:mm.ss.ss"
AssDateLastRow = shAss.Range("C" & Rows.Count).End(xlUp).Row
shAss.Range("C4:C" & AssDateLastRow).NumberFormat = "yyyy-mm-dd"
'ensure format is applied by forcing F2 edit of cell
For Each c In shAss.Range("C4:C" & AssDateLastRow).Cells
c.Select
SendKeys "{F2}", True
SendKeys "{ENTER}", True
'Selection.NumberFormat = "yyyy-mm-dd"
Next
当我运行代码时,数据会复制到我的工作表中,但日期和时间仍然是混合格式。通过VBA强制 F2 + ENTER 的尝试似乎没有做任何事情。再次,如果手动执行它可以正常工作。
以下是从工作表
中的结果中复制的数据示例Work Request Code Date Assigned Time Assigned
92926 19/05/2014 14:30.00.00
92927 19/05/2014 15:00.00.00
92928 2014-05-19 15:15.00.00
92934 2014-05-19 14:00.00.00
92527 12/05/2014 07:30
92528 12/05/2014 08:00
92804 2014-05-12 16:15
92805 2014-05-12 16:20.00.00
任何帮助都会非常感谢你 丹
答案 0 :(得分:7)
我使用这个简单的宏在当前选择的范围内应用 F2 + Enter :
Sub ApplyF2()
Selection.Value = Selection.FormulaR1C1
End Sub
答案 1 :(得分:3)
我可以想到两个选项让Excel在一步中将格式应用于单元格。
第一种是使用文本到列功能,即使列中没有任何内容可以拆分。 第二个选项是复制值1并使用选择性粘贴 - 乘法选项将其粘贴到单元格中。
虽然任何一种方法都应该强制更新细胞形成,但我会倾向于第一种选择。 这是因为你的一些日期被存储为文本。
Sub Format_Text_to_Columns()
Dim AssDateLastRow As Long
AssDateLastRow = ActiveSheet.Range("C" & Rows.Count).End(xlUp).Row
ActiveSheet.Range("C4:C" & AssDateLastRow).NumberFormat = "yyyy-mm-dd;@"
'Set the format
Range("C4:C" & AssDateLastRow).Select
Selection.TextToColumns DataType:=xlDelimited, ConsecutiveDelimiter:=True, _
Space:=True, FieldInfo:=Array(1, 5)
'Use text to columns to force a format update
End Sub
Sub Format_Paste_Special_Multiply()
Dim AssDateLastRow As Long
AssDateLastRow = ActiveSheet.Range("C" & Rows.Count).End(xlUp).Row
ActiveSheet.Range("C4:C" & AssDateLastRow).NumberFormat = "yyyy-mm-dd;@"
'Set the format
Range("C1").FormulaR1C1 = "1"
Range("C1").Copy
Range("C4:C" & AssDateLastRow).Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlMultiply
Application.CutCopyMode = False
Range("C1").ClearContents
'Multiply the dates by 1 to force a format update
End Sub
答案 2 :(得分:3)
我也努力让这个工作起来。我的问题不仅仅是日期,还有前面有单引号的数据。我一起攻击的对我来说很有用。它可以非常快速地清理超过70,000个细胞。希望它对你有用:
(您将更改范围等,以满足您的需求)
Dim MyRange As Range
Set MyRange = Range(Cells(2, 7), [G1].End(xlDown))
For Each MyRange In MyRange.Cells
'Mimic F2 without SendKeys
MyRange.Value = MyRange.Value
Next
答案 3 :(得分:2)
这对我有用。
Dim r As Range
Dim n As Integer
Dim AssDateLastRow As Long
AssDateLastRow = ActiveSheet.Range("E" & Rows.Count).End(xlUp).Row
Set r = Range("E2:E" & AssDateLastRow)
r.Select
r.NumberFormat = "ddmmyyyy;@"
r.Select
For n = 1 To r.Rows.Count
SendKeys "{F2}", True
SendKeys "{ENTER}", True
Next n
答案 4 :(得分:0)
您需要发送密钥F2 + Enter似乎很奇怪。运行宏之前的格式是什么?尝试以这种方式格式化整个列(它不会影响文本)。
Columns("C:C").NumberFormat = "yyyy-mm-dd"
答案 5 :(得分:0)
我的变化
n = Selection.Rows.count
Dim r1 As range, rv As range
Set r1 = Selection.Cells(1, 1)
For I = 1 To n
Set rv = r1.offset(I - 1, 0)
vali = rv.value
IsNumeric(vali) Then
vali = CDbl(vali)
rv.value = 0
rv.value = vali
End If
答案 6 :(得分:0)
尝试按F9或文件选项公式 - 工作簿计算 - 自动
答案 7 :(得分:0)
我只是将顶部条目右侧的单元格设置为等于问题单元格乘以1的公式。新单元格是正确的数字,然后双击手柄将其向下延伸到整个列,将它们全部修复!
答案 8 :(得分:0)
TCustomButton.Create;
TCustomButton.childObjectType:=TClass1;
答案 9 :(得分:0)
发送密钥不稳定。更好的方法是将文本存储在剪贴板中并粘贴。
See here on how to store values in the clipboard
Sub CopyText(Text As String)
Dim MSForms_DataObject As Object
Set MSForms_DataObject = CreateObject("new:{1C3B4210-F441-11CE-B9EA-00AA006B1A69}")
MSForms_DataObject.SetText Text
MSForms_DataObject.PutInClipboard
Set MSForms_DataObject = Nothing
End Sub
Sub Test()
CopyText (ActiveCell.Value)
ActiveCell.PasteSpecial
End Sub
'In place of active cell, you may pass a range
答案 10 :(得分:0)
可以使用文本到列来解决此问题
1)突出显示数据列
2)转到数据-> 文本到列-> 定界->(取消选择所有内容)-> 下一步< / em>
3)在向导的第3页上,设置列数据格式 YMD
4)确定
答案 11 :(得分:-2)
我明白了,简单
选择要击中F2的所有单元格,然后输入并运行以下简短宏:
Sub AutoF2Enter()
Selection.Value = Selection.Value
结束
处理日期和数字!
每秒50.000个单元格!