制作一个excel VBA宏来更改日期和格式

时间:2017-06-19 01:11:36

标签: excel vba excel-vba

我是宏的新手,但我找不到我需要的确切解决方案,并且在组合它们时遇到更多麻烦。我得到这个原始数据报告,需要进行一些更改才能将其输入我们的主数据集进行报告。这些事情需要发生(请参考图片):

  1. 日期需要在编队中表达" mmm-yy"。我试图添加" 01 /"制作" 01/04/2017" (我是澳大利亚人,所以这是4月1日),但出于某种原因,它会自动更改为04/01/2017。最后,我需要04/2017到4月17日才能获得
  2. 栏中的所有数据
  3. " Medical Div"改为"医疗"和#34;心理健康部门"改为"心理健康" - 我已经为此排序了一个宏,但不知道如何将它与另一个宏组合用于我想要的其他功能。
  4. 如果有人可以帮助提供良好资源的代码或链接,这将允许我使用一个非常棒的宏一次执行所有这些功能。

    由于

    Raw data

3 个答案:

答案 0 :(得分:0)

使用Power Query而不是VBA可以轻松完成此操作。 Power Query是Microsoft for Excel 2010和2013的免费插件,并作为“获取和转换”内置于Excel 2016中。从概念上讲,步骤是:

  • 加载数据
  • 插入一个新列,其中包含将文本“1 /”与Month-Year
  • 列组合在一起的公式
  • 将新列的类型更改为日期
  • 删除旧的Month-Year列
  • 选择分部列
  • 将“Div”替换为“
  • 保存查询

将新数据添加到原始数据源时,只需刷新查询即可。所有这些都可以通过单击用户界面中的图标和按钮来实现。无需编码。

答案 1 :(得分:0)

那么,对于第2点,如何录制宏并使用“查找和替换”两次? 这应该将它们组合成一个宏。然后你可以复制其他地方的粘贴。

至于日期,Excel具有转换为美国格式的倾向。首先尝试这个(假设“月 - 年”列是B)

Range("B2") = DateValue(Range("B2"))

然后再应用格式。

答案 2 :(得分:0)

Private Sub mySub()
    Dim myRng As Range
    Dim r As Range
    Dim LastRow As Long

    Dim mySheet As Worksheet
    Dim myFind1, myFind2 As Variant
    Dim myReplace1, myReplace2 As Variant

    'This will get the number of rows with value in the sheet
    LastRow = Sheets("Sheet1").UsedRange.Rows.Count

    'This is for the first find and replace. It will search all cells with exact value of "Medical Div" in the sheet and change it to "Medical".
    myFind1 = "Medical Div"
    myReplace1 = "Medical"

    'This is for the second find and replace. It will search all cells with exact value of "Mental Health Div" in the sheet and change it to "Mental Health".
    myFind2 = "Mental Health Div"
    myReplace2 = "Mental Health"

    'This will loop through the entire column with the date that needs to have the format mmm-yy. It will convert the 04/2017 to date format first before making it Apr-17.
    With Sheets("Sheet1")
        Set myRng = Sheets("Sheet1").Range("A2:A" & LastRow)
        For Each r In myRng
            r.Value = CDate(r.Value)
        Next r
    End With

    myRng.NumberFormat = "mmm-yy"

    'This will loop through the active worksheet and apply the find and replace declared above.
    For Each mySheet In ActiveWorkbook.Worksheets
        mySheet.Cells.Replace what:=myFind1, Replacement:=myReplace1, _
            LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False, _
            SearchFormat:=False, ReplaceFormat:=False

        mySheet.Cells.Replace what:=myFind2, Replacement:=myReplace2, _
            LookAt:=xlWhole, SearchOrder:=xlByRows, MatchCase:=False, _
            SearchFormat:=False, ReplaceFormat:=False
    Next mySheet

End Sub

以下是您可以尝试的代码。

  • 它会将Month-Year的列的日期格式更改为 " APR-17"无论当前日期格式如何。
  • 它还将查找并替换Medical Div和Mental Health Div 到"医疗"和#34;心理健康"。

您需要更改范围以满足您的需求。我已将月份列的列设置为A列。如果这是您的日期,则必须将其更改为B列。

这是运行宏之前的数据:

enter image description here

这是运行宏后的数据:

enter image description here