2017-02-28 125 views
2

我的数据提供程序在我得到的.XLSX文件中更改了一些内容。我添加了一个新的子根据该应用程序所期望的模型来修正数据:VBA Excel加载项:将列从一般格式更改为自定义日期的代码

Sub Feb27FixModel() 
    ActiveSheet.Range("H2").End(xlDown).NumberFormat = "dd-mmm-yyyy"   'change format of Processed Date 
    Dim colNum As Integer 
    colNum = ActiveSheet.Rows(1).Find(what:="Legacy code", lookat:=xlWhole).Column 
    ' Done twice to insert 2 new cols 
    ActiveSheet.Columns(colNum + 1).Insert 
    ActiveSheet.Columns(colNum + 1).Insert 
    ' New col headings 
    ActiveSheet.Cells(1, colNum + 1).Value = "Origin Code" 
    ActiveSheet.Cells(1, colNum + 2).Value = "Jurisdiction Code" 
    Range("A1").Select 
    ActiveCell.FormulaR1C1 = "County Name" 
    Range("B1").Select 
    ActiveCell.FormulaR1C1 = "State Abbreviation" 
    ActiveWorkbook.Save 
End Sub 

一切正常,但根据上述1号线的结果。在活动工作表中,H列的标题行值为“Processed Date”,H2单元格及其下面的单元格存储为常规值,例如11/15/2016。我需要将所有日期更改为自定义日期,格式为dd-mmm-yyyy。下面的语句未能得到这为我做的:

ActiveSheet.Range("H2").End(xlDown).NumberFormat = "dd-mmm-yyyy" 

EDIT(01March2017):

多亏了答案从下面@Jeeped,我增加了一个声明,这是是代码溶液:

With ActiveSheet 
    .Range(.Cells(2, "H"), .Cells(.Rows.Count, "H").End(xlUp)).NumberFormat = "dd-mmm-yyyy" 
    .Range(.Cells(2, "H"), .Cells(.Rows.Count, "H").End(xlUp)).Value = ActiveCell.Text 
End With 

EDIT(02March2017):

我由昨天错误。在调试中,我必须在工作表中选择一个好的单元格作为断点;因此,引用ActiveCell.Text“工作种类”。它的效果是在列H的每一行(第一行除外)中复制Text为“2016年10月14日”。这是微不足道的。

我真正需要的是一种声明,它将采用列H的所有行的文本并将存储的值从显示为2016年10月14日更改为2016年10月14日等等。仅仅是这样将格式更改为自定义。我也需要更改存储的值。我不知道该怎么做。

+0

请参阅[如何避免在Excel VBA宏中使用选择](http://stackoverflow.com/questions/10714251/how-to-avoid-using-select-in-excel-vba-macros)。 – Jeeped

回答

2

您只在列H中的值为最后一个单元格操作。从H2跨度到最后一个单元格以设置所有单元格的格式。

with ActiveSheet 
    .Range(.cells(2, "H"), .cells(.rows.count, "H").End(xlUp)).NumberFormat = "dd-mmm-yyyy" 
end with 
+0

谢谢。我用你的代码替换了我的上面的尝试,并运行了全新的插件。列H中的单元格的值保持如前(即典型值显示为11/22/2016)。然而,当我点击列H中的一个单元格并选择“格式单元格”时,格式确实已从普通格式更改为自定义格式和dd-mmm-yyyy。是否还需要另外声明实际将新格式“应用”到单元格值,以便显示为2016年11月22日? –

+0

看来你的日期不是真正的日期;只是看起来像日期的文字。选择列并使用数据,文本到列,然后在第三个屏幕上选择正确的MDY格式。此外,当您引入新数据时,这需要在将来进口时完成。 – Jeeped

+0

谢谢。见我上面的OP编辑。你的回答非常有帮助。 –

0

这四行循环应该有效。测试它。 ;)

For i = 2 To Columns("H").End(xlDown).Row 'from row nr 2 to the rownr of last cell of column H 
    Set currentCell = Cells(i, "h") 
    currentCell.Value = Format(currentCell.Value, "dd-mm-yyyy") 
Next i 

它逛尽管每个小区,在这些应用Format()功能的文本格式转换。让我知道这是否有帮助。

+0

谢谢。有编译错误(s)尝试你的建议。所以我补充说:昏暗我作为整数,然后昏暗currentCell作为对象在For循环前面。然后我得到错误代码6溢出。 –