Excel 2010宏在单元格区域上强制“F2”+“Enter”

时间:2014-06-05 12:56:28

标签: excel vba excel-vba

希望有人可以提供帮助!

我有一个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

任何帮助都会非常感谢你 丹

12 个答案:

答案 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个单元格!