用于删除不同单词和重新格式化文本的公式

时间:2016-01-23 01:28:12

标签: excel excel-vba excel-2010 vba

我使用excel对数据进行排序,需要清理并重新格式化一些列(所有当前基于文本的数据)为一致的新格式。

挑战在于,虽然“旧”的格式是数据相当一致,我不能简单地使用REPLACE,SUBSTITUTE或TRIM函数,因为字长的变化很大。

数据与日期有关。

例如:

July 2013 - Present (2 years 7 months) June 2013 - March 2014 (10 months) March 2008 - May 2016 (7 years 11 months) 1999 - 2012 (3 years)

我希望输出/重新格式化的版本为:

(Jul 2013 - Present) (Jun 2013 - Mar 2014) (Mar 2008 - May 2016) (1999 - 2012)

原始数据中的关键变量是: - “月份”的长度'字 - '月'并不总是使用 - 第二次约会有时候会出现#39; - 括号内显示的持续时间差异很大

而且我正在努力解决这个问题(我试图重做Formula to remove entire words that start with certain characters但没有成功)

完美的输出格式是: - 全部用括号括起来 - 仅显示为前三个字母的月份(1月,2月等) - 没有'持续时间'在约会之后 - 当第二个日期是“现在”时,公式应该能够处理实例。和/或没有几个月,只有几年。

有人可以帮忙吗?如果我使用查找/替换功能*,我可以这样做,但我在公式解决方案之后,我可以与同事分享。

谢谢, 小号

关于我:30岁左右的入门级黑客',始终坚信"必须是一种方式"。假设没有先验知识!

  • 如果它有助于我将使用的查找/替换功能的步骤:
  • 删除第一个括号
  • 之后的所有文字
  • 用3个字母的版本替换所有月份(即替换' 1月'用' Jan'等,12个不同的命令)
  • 为每一端添加括号(实际上我使用= CONCATENATE("(",AD11,")")公式)

2 个答案:

答案 0 :(得分:0)

如果您不是绝对需要使用函数,那么最简单的方法就是使用Excel的Text to Columns功能(位于功能区的Data选项卡中)。

以下是我要遵循的步骤:

  1. 选择日期范围列。
  2. 单击“文本到列”按钮。
  3. 选择分隔。
  4. 单击“下一步”。
  5. 在“其他”旁边,键入(
  6. 单击“完成”。
  7. 删除包含所有持续时间的列,例如“2年7个月”。
  8. 再次选择日期范围。
  9. 执行另一个文本到列,这次使用-代替(
  10. 执行查找/替换以删除任何空格(即,在“查找内容”中键入空格,并确保“替换为”没有输入任何内容)。
  11. 这将产生两列,一列具有开始日期,另一列具有完成日期。

    使用此格式的数据,现在您可以使用公式来获得您正在寻找的结果。如果您将开始日期放在A列中,将完成日期放在B列中,则公式将如下所示:

    ="("&IF(A1>10000,TEXT(A1,"MMM YYYY"),A1)&" - "&IF(B1>10000,TEXT(B1,"MMM YYYY"),B1)&")"
    

    这样做,检查每个日期值是否大于10,000(这与Excel日期值的年份不同)。多年来,只需采取细胞中已有的东西。对于日期,将它们格式化为“月份年”,其中​​月份是3个字母的缩写。其余的只是简单的连接括号和短划线。

答案 1 :(得分:0)

考虑以下用户定义函数(UDF)

Public Function KleanUp(r As Range) As String
   Dim inpt As String, outpt As String
   Dim L As Long, i As Long, CH As String
   Dim Pulling As Boolean, j As Long
   Dim ary, bry, cry

   bry = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December")
   cry = Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec")

   inpt = Trim(r.Text)
   L = Len(inpt)
   outpt = ""
   Pulling = True

   For i = 1 To L
      CH = Mid(inpt, i, 1)
      If CH = "(" Then
         outpt = outpt & CH
         Pulling = False
      Else
         If CH = ")" Then
            Pulling = True
         Else
            If Pulling Then
               outpt = outpt & CH
            End If
         End If
      End If
   Next i

   If Left(outpt, 1) = "(" Then outpt = Mid(outpt, 2)
   If Right(outpt, 1) = "(" Then outpt = Mid(outpt, 1, Len(outpt) - 1)
   ary = Split(outpt, "(")
   For i = LBound(ary) To UBound(ary)
      ary(i) = "(" & Trim(ary(i)) & ")"
      For j = LBound(bry) To UBound(bry)
         ary(i) = Replace(ary(i), bry(j), cry(j))
      Next j
   Next i

   KleanUp = Join(ary, " ")
End Function

以下是一些例子:

enter image description here

用户定义函数(UDF)非常易于安装和使用:

  1. ALT-F11调出VBE窗口
  2. ALT-I ALT-M打开了一个新模块
  3. 粘贴内容并关闭VBE窗口
  4. 如果保存工作簿,UDF将随之保存。 如果您在2003年之后使用的是Excel版本,则必须保存 该文件为.xlsm而不是.xlsx

    删除UDF:

    1. 按上述方式调出VBE窗口
    2. 清除代码
    3. 关闭VBE窗口
    4. 从Excel使用UDF:

      = KleanUp(A1)

      要了解有关宏的更多信息,请参阅:

      http://www.mvps.org/dmcritchie/excel/getstarted.htm

      http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

      有关UDF的详细信息,请参阅:

      http://www.cpearson.com/excel/WritingFunctionsInVBA.aspx

      必须启用宏才能使其生效!

      修改#1:

      将此版本替换为此版本:

      package application;
      
      import java.util.Random;
      
      import javafx.application.Application;
      import javafx.geometry.Pos;
      import javafx.scene.Node;
      import javafx.scene.Parent;
      import javafx.scene.Scene;
      import javafx.scene.layout.HBox;
      import javafx.scene.layout.VBox;
      import javafx.scene.paint.Color;
      import javafx.scene.shape.HLineTo;
      import javafx.scene.shape.MoveTo;
      import javafx.scene.shape.Path;
      import javafx.stage.Stage;
      
      public class Main extends Application {
        @Override
        public void start(Stage primaryStage) {
            try {
              VBox root = new VBox(10);
              root.setAlignment(Pos.CENTER);
              root.getChildren().addAll(getLine(10,30),getLine(10,30),getLine(10,30),
                      getLine(10,30),getLine(10,30),getLine(10,30),
                       getLine(10,30),getLine(10,30),getLine(10,30),getLine(10,30),
                      getLine(10,30),getLine(10,30),getLine(10,30));
              Scene scene = new Scene(root, 400, 400);
              scene.getStylesheets().add(getClass().getResource("application.css").toExternalForm());
              primaryStage.setScene(scene);
              primaryStage.show();
          } catch (Exception e) {
              e.printStackTrace();
          }
      }
      
      private Node getLine(int ponts,int pontLength){
          HBox root = new HBox(-1);
          root.setAlignment(Pos.CENTER);
          Random r = new Random();
          while(ponts !=0){
              Path p1 = new Path();
              p1.getElements().addAll(new MoveTo(), new HLineTo(pontLength));
              p1.setStroke(Color.rgb(r.nextInt(255), r.nextInt(255), r.nextInt(255)));
              root.getChildren().add(p1);
              ponts--;
          }
      
          return root;
      }
      
      @Override
      public void stop() throws Exception {
          // TODO Auto-generated method stub
          super.stop();
      }
      
       public static void main(String[] args) {
          launch(args);
       }
      }