【问题标题】:Converting day names to series将日期名称转换为系列
【发布时间】:2018-08-09 20:36:01
【问题描述】:

我正在寻找将日期转换为特定系列的代码。 例如。

If it is Monday I want - N/Y/N/N/N/N/N
If it is Wednesday I want - N/N/N/Y/N/N/N
if it is Sunday, Friday I want - Y/N/N/N/N/Y/N

有什么方法可以在 VBA 或 excel 中做到这一点。

提前致谢。

【问题讨论】:

  • 数据从哪里来,输出到哪里去?
  • 数据只是一个包含日期名称的列,我想将该列转换为这种格式。
  • 所以单元格将以逗号分隔工作日名称,您想将其更改为以/ 分隔的输出吗?
  • 是的,没错

标签: excel vba


【解决方案1】:

这使用数组来创建你想要的模式。

Sub trnsfrm()
Dim rang As Range
Set rang = Worksheets("Sheet4").Range("A1:A3") ' Change to your range and worksheet

Dim rng() As Variant
rng = rang.Value

Dim WeekDy As Variant
WeekDy = Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday")

Dim outArr(1 To 7) As Variant

Dim j As Long
For j = LBound(rng) To UBound(rng)
    Dim i As Long
    For i = LBound(WeekDy) To UBound(WeekDy)
        If InStr(rng(j, 1), WeekDy(i)) > 0 Then
            outArr(i + 1) = "Y"
        Else
            outArr(i + 1) = "N"
        End If
    Next i
    rng(j, 1) = Join(outArr, "/")
Next j

rang.Value = rng


End Sub

转弯:

进入:

【讨论】:

  • @ScottCraner 我相信我们俩都犯了一个错误,把时间花在一个写得不好的问题上,提问者只是利用我们来完成他的任务,他写道,对所有人都很有效答案(并且他们有效),而他甚至不费心为感谢人们时间的答案投票。我不会再犯同样的错误,我希望你也不要这样做
  • @Ibo 祝你好运。除非您停止回答,否则我建议您继续回答,因为您的许多答案都比公认的要好,包括这一个,否则您会觉得自己浪费了时间。我的答案比被忽略的公认答案更好,而且我的答案不如其他人接受的好。它是双向的。请记住,很多时候我们不会回答眼前的问题,而是回答以后可能有类似问题的人。
  • @ScottCraner 我听到你的声音,我同意你的说法,但我的意思是回答没有足够努力甚至写出一个好问题的问题是这里有经验的成员的错误,我会不要再这样做了,因为我觉得我已经被利用了
  • @Ibo 我明白了,大多数时候我不回答,我只回答了这个问题。我这样做是为了磨练我的技能。我想练习数组。
  • @Ibo 我感受到了你的痛苦。在这种情况下,我认为操作只需要我发布的 excel 非数组公式(措辞有问题)。无论如何,回答糟糕的问题,投入时间,却一无所获,这可能是一项吃力不讨好的工作。请记住,您也在此过程中磨练自己的技能。我认为回答问题有点像做填字游戏。我真的回答问题是为了我自己的娱乐。如果这让你感觉好一些,那么 OP 的分数会阻止他给你投票。我给了你一个勾号,因为你的回答很酷。 ✔️??‍♂️⚡️?
【解决方案2】:

我的想法与 Scott 的方法非常相似,但我找到了一种更短的方法来做到这一点。将代码放在模块中,您可以在工作表中作为函数访问它:

Function TagDays(rng As Range)
    strDays = "SUNDAY1MONDAY2TUESDAY3WEDNESDAY4THURSDAY5FRIDAY6SATURDAY7)"
    arr = Array("N", "N", "N", "N", "N", "N", "N")
    For Each cell In rng
        If cell <> "" Then
            i = InStr(strDays, UCase(cell))
            If i > 0 Then arr(Mid(strDays, i + Len(cell), 1) - 1) = "Y" '-1 since the LBOUND of arr is 0 not 1
        End If
    Next cell
    TagDays = Join(arr, "/")
End Function

调用函数并选择您想要的范围,它可以是多列,即使您添加或删除天数,结果也应该在现场更新。它也不区分大小写。此外,它会忽略空白单元格。

输出:

编辑:下面的代码也可以处理一个单元格中用逗号分隔的日期,空格无关紧要

Function TagDays(rng As Range)
    strDays = "SUNDAY1MONDAY2TUESDAY3WEDNESDAY4THURSDAY5FRIDAY6SATURDAY7)"
    arr = Array("N", "N", "N", "N", "N", "N", "N")
    For Each cell In rng
        If cell <> "" Then
            arr2 = Split(cell.Value, ",")
            For j = LBound(arr2) To UBound(arr2)
                strday = Trim(UCase(arr2(j)))
                i = InStr(strDays, strday)
                If i > 0 Then arr(Mid(strDays, i + Len(strday), 1) - 1) = "Y" '-1 since the LBOUND of arr is 0 not
            Next j
        End If
    Next cell
    TagDays = Join(arr, "/")
End Function

输出:

将函数单独应用于单元格(如 Scott 的示例)将为您提供:

【讨论】:

  • 根据 OP,他希望它不在另一个单元格中,并且每个单元格可能包含用逗号划定的一天以上。见 cmets。
  • @ScottCraner 我觉得你建议替换原处的值,这实际上不是一个好主意,因为没有 UNDO 机会。提问者似乎并不清楚他想要什么。他回答是,因为他不想失去寻求帮助的机会。老实说,在我们提供免费代码之前,我们应该让他编辑他的问题
  • 我添加了一个编辑,也可以处理逗号分隔的情况
【解决方案3】:

您实际上并不需要 VBA 来执行此操作。只需使用此公式(假设它是 A 列)。提醒alt enter 可让您输入公式以提高可读性。

=IF(ISERROR(MATCH("Sunday",A:A,0)),"N","Y")&"/"&
 IF(ISERROR(MATCH("Monday",A:A,0)),"N","Y")&"/"&
 IF(ISERROR(MATCH("Tuesday",A:A,0)),"N","Y")&"/"&
 IF(ISERROR(MATCH("Wednesday",A:A,0)),"N","Y")&"/"&
 IF(ISERROR(MATCH("Thursday",A:A,0)),"N","Y")&"/"&
 IF(ISERROR(MATCH("Friday",A:A,0)),"N","Y")&"/"&
 IF(ISERROR(MATCH("Saturday",A:A,0)),"N","Y")

如果您必须在“星期一,星期二”等单元格中进行搜索,则可以使用此公式。 这是一个数组公式,您必须按 CTL SHFT ENTER 才能起作用。

=IF(OR(NOT(ISERROR(FIND("Sunday",A:A,1)))),"Y","N")&"/"&
IF(OR(NOT(ISERROR(FIND("Monday",A:A,1)))),"Y","N")&"/"&
IF(OR(NOT(ISERROR(FIND("Tuesday",A:A,1)))),"Y","N")&"/"&
IF(OR(NOT(ISERROR(FIND("Wednesday",A:A,1)))),"Y","N")&"/"&
IF(OR(NOT(ISERROR(FIND("Thursday",A:A,1)))),"Y","N")&"/"&
IF(OR(NOT(ISERROR(FIND("Friday",A:A,1)))),"Y","N")&"/"&
IF(OR(NOT(ISERROR(FIND("Saturday",A:A,1)))),"Y","N")&"/"

【讨论】:

  • 这不适用于在一个单元格中以逗号分隔的多个单元格,如 cmets 中所述的 OP。
  • 如果用户有 Office 365 Excel:=TEXTJOIN("/",,IF(ISNUMBER(FIND(TEXT(ROW($1:$7),"dddd"),E1)),"Y","N")) 作为数组公式。
  • 哦,天哪,他在说什么??好吧,我会做一个数组没有vba的解决方案......
  • 我不同意将文本公式与日期结合起来。 stackoverflow.com/questions/48155382/…
  • @ScottCraner 是的,这确实有些道理。我现在保留我的答案。也许有一天有人会想做一个数组搜索并给我一个??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-04-26
  • 2022-11-22
  • 2021-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-10-17
相关资源
最近更新 更多