我使用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岁左右的入门级黑客',始终坚信"必须是一种方式"。假设没有先验知识!
答案 0 :(得分:0)
如果您不是绝对需要使用函数,那么最简单的方法就是使用Excel的Text to Columns功能(位于功能区的Data选项卡中)。
以下是我要遵循的步骤:
(
。-
代替(
。这将产生两列,一列具有开始日期,另一列具有完成日期。
使用此格式的数据,现在您可以使用公式来获得您正在寻找的结果。如果您将开始日期放在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
以下是一些例子:
用户定义函数(UDF)非常易于安装和使用:
如果保存工作簿,UDF将随之保存。 如果您在2003年之后使用的是Excel版本,则必须保存 该文件为.xlsm而不是.xlsx
删除UDF:
从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);
}
}