Excel 2010macros在单元格范围内强制“F2”+“Enter”

希望有人能帮助!

我有一个Excel 2010工作表,其macros设置为从其他工作表将数据复制到另一个工作表上的特定格式以供其他工作使用。 我需要的数据复制好,但我有一个单元格范围格式的问题,其中包含date或时间值。 数据来源于数据库提取,一切都是文本格式。 在我的工作表中,当我(通过VBA代码程序)复制date时,我使用了我们需要的格式,date是"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而不是15/04/2014 。 如果我去手动select单元格,然后按F2然后回车键格式显示为我所需要的。 这发生在整个范围内随机发生,可能有成千上万的行,所以拖动工作表手动按F2 + ENTER不可行。

我已经通过互联网上的帮助看了,发现我认为应该自动执行F2 + ENTER位与VBA编码,但它不工作,我不明白为什么(我是初学者在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 

当我运行代码时,数据会复制到我的工作表中,但date和时间仍然是混合格式。 通过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 

任何帮助将非常感谢你丹

我可以想出两个选项让Excel将格式应用到单元格中。

第一种是使用“ 文本到列”function,即使中没有任何内容可以分割。 第二个选项是复制值为1,并使用select性粘贴 – 相乘选项将其粘贴到单元格中。

尽pipe任何一种方法都应该强制更新单元格的格式,但我会倾向于第一种select。 这是因为你的一些date被存储为文本。

  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 

我使用这个简单的macros在当前select的范围上应用F2 + Enter

 Sub ApplyF2() Selection.Value = Selection.FormulaR1C1 End Sub 

我也努力得到这个工作。 我的问题不仅仅是date,还包括前面单引号的数据。 我一起砍的东西对我很好。 它非常快速地清理了超过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 

这对我有效。

 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 

这似乎很奇怪,你需要发送密钥F2 + Enter。 运行macros之前的格式是什么? 尝试以这种方式格式化整列(不会影响文本)。

 Columns("C:C").NumberFormat = "yyyy-mm-dd" 

我的变化

 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 

尝试按F9或文件选项公式 – 工作簿计算 – 自动