Excel VBA在列上更改时间/日期格式

时间:2019-05-30 13:33:38

标签: excel vba

我必须更改9000多个提供商记录的日期/时间格式。我是vba的新手,因此不确定该怎么做,因为提供方的办公时间有100多种。

我考虑过使用一个按钮来创建一个新列,以填充正确的信息,但是我不确定这是正确的方法。我曾考虑过做If条语句,但由于办公时间的不同,我知道那会超过100条If条语句。

在Excel中生成的当前日期/时间格式为:

M 8:30 AM-5:30 PM 
T 8:30 AM-5:30 PM 
W 8:30 AM-5:30 PM 
R 8:30 AM-5:30 PM 
F 8:30 AM-5:30 PM

我需要将其转换为M-F 8:30 AM-5:30 PM

这是另一个例子

M 7:30 AM-11:00 PM
T 7:30 AM-11:00 PM
W 7:30 AM-11:00 PM
R 7:30 AM-11:00 PM
F 7:30 AM-11:00 PM
S 8:00 AM-9:00 PM

所需的最终结果:

M-F 7:30 AM - 11:00 PM; SA 8:00 AM - 9:00 PM

2 个答案:

答案 0 :(得分:0)

如果Excel解决方案可能适合您,也许您可​​以根据需要调整它:

enter image description here

注意:要使此公式生效:

  1. 您的数据必须从第2行或更低行开始,但无论如何都不能从第1行开始,否则公式将无法正常工作。
  2. 数据必须按照您发布的数据进行排序(所有时间都分组在一起,否则将无法正常工作)

还有公式:=IF(IF(TRIM(MID(A2;3;99))=TRIM(MID(A1;3;99));"";ROW())="";"";LEFT(INDEX($A:$A;IF(TRIM(MID(A2;3;99))=TRIM(MID(A1;3;99));"";ROW()));1)&"-"&LEFT(INDEX($A:$A;IF(TRIM(MID(A2;3;99))=TRIM(MID(A1;3;99));"";ROW())+COUNTIFS($A$2:$A$12;"*"&TRIM(MID(A2;3;99))&"*")-1);1)&" "&TRIM(MID(A2;3;99)))

您可能会在图片中注意到,最后的结果不符合您的需求(您发布了SA 8:00 AM - 9:00 PM,我的公式得到了S-S 8:00 AM-9:00 PM,因为老实说,我不知道那个{{1 }}来自。

由于公式的复杂性,我已将文件上传到我的Gdrive中,在文件中您会发现2张纸:一张包含该公式仅位于1个单元格中,一张包含该公式位于多列中,emulatin逐步解决问题,以防您有兴趣检查其背后的想法。

https://drive.google.com/open?id=1pmrpPqMWwtFtdzt3-lQoK5npd_JeQs0m

尝试使其适应您的需求。

答案 1 :(得分:0)

步骤
1用空格替换-(列C的公式为= SUBSTITUTE(B6,“-”,“”))
2周中的某天的提取(具有公式= TIMEVALUE(TRIM(MID(SUBSTITUTE(C6,“”,REPT(“”,LEN(C6)))的D列),(1)* LEN(C6)+ 1,LEN(C6 )))&“”&TRIM(MID(SUBSTITUTE(C6,“”,REPT(“”,LEN(C6))),(2)* LEN(C6)+ 1,LEN(C6))))
3提取时间开始(E列,公式= TIMEVALUE(TRIM(MID(SUBSTITUTE(C25,“”,REPT(“”,LEN(C25))),(1)* LEN(C25)+ 1,LEN(C25) ))&“”&TRIM(MID(SUBSTITUTE(C25,“”,REPT(“”,LEN(C25))),(2)* LEN(C25)+ 1,LEN(C25))))
4提取时间结束(具有公式= TIMEVALUE(TRIM(MID(SUBSTITUTE(C25,“”,REPT(“”,LEN(C25)))的f列),(3)* LEN(C25)+ 1,LEN(C25) ))&“”&TRIM(MID(SUBSTITUTE(C25,“”,REPT(“”,LEN(C25))),(4)* LEN(C25)+ 1,LEN(C25))))
5确定是否包含星期六(D32,公式= IF(COUNTIF(D25:D30,“ S”),“是”,“否”))
6获取最短时间开始(E32,公式为= MIN(E25:E29))
7获取最长时间(F32的公式为= MAX(F25:F29))
9获得最终结果(带有公式= IF(D32 =“ No”,(“ MF”&TEXT(E32,“ hh:mm AM / PM”)&“-”&TEXT(F32,“ hh:mm AM / PM” )),(“ MF”&TEXT(E32,“ hh:mm AM / PM”)&“-”&TEXT(F32,“ hh:mm AM / PM”)&(“,SA”&TEXT(VLOOKUP(“ S” ,D25:F30,2,FALSE),“ hh:mm AM / PM”)&“-”&TEXT(VLOOKUP(“ S”,D25:F30,3,FALSE),“ hh:mm AM / PM”))) )))
假设
1所有原始文本的格式都相同
2您正在寻找数组中最早的开始时间
3您正在寻找数组中的最新结束时间

注意
1这些是excel中的步骤。您可以选择将它们复制到VBA并放入循环中
2“公式很复杂,但是很灵活,可以在原始数据更改时用作模板。”
3您可以组合各种公式来创建一个摘录,但是很难理解它们
4就我个人而言,我将在excel中执行此操作,因此我可以查看结果(并查找不符合要求的模式),以便可以根据需要进行调整。
5验证数据后,我将复制并粘贴结果。
6这是我第一次在这个论坛上回答问题,所以我希望这是贴切的。

XLSX Example 我会附上电子表格,但看不到办法。它可能不被允许在论坛上。