Excel 基于当前年份和月份查找文本字符串yyyymm

Excel 基于当前年份和月份查找文本字符串yyyymm,excel,vba,Excel,Vba,我需要定位L列中包含yyyymm+2(202009)的第10行开始的所有单元格。 换句话说,我要查找包含当前月份前2个月的所有日期的单元格。自2020年7月起,有效值将为20200901至20200930 列L包含文本格式的值,如20201120、20210102等。所有值都是列L中的日期,格式为“yyyymmdd” 我试图使用下面的代码,但它显然是错误的,因为如果年份发生变化,+2将不会显示正确的年份或月份 Dim strSearchText As String Dim y As Intege

我需要定位L列中包含yyyymm+2(202009)的第10行开始的所有单元格。 换句话说,我要查找包含当前月份前2个月的所有日期的单元格。自2020年7月起,有效值将为20200901至20200930

列L包含文本格式的值,如20201120、20210102等。所有值都是列L中的日期,格式为“yyyymmdd”

我试图使用下面的代码,但它显然是错误的,因为如果年份发生变化,+2将不会显示正确的年份或月份

Dim strSearchText As String
Dim y As Integer
Dim m As Integer
m = DatePart("mm", Date) + 2
y = DatePart("yyyy", Date)
strSearchText = y & m
Dim rngSearchArea As Range
Set rngSearchArea = ws.Range(Range("L10"), ws.Range("L" & ws.Range("L:L").Cells.Count).End(xlUp))

有什么办法解决这个问题吗?

请测试下一个代码。由于您没有回答我的上述问题,它将在N:N列中返回处理日期的范围,从第十行开始:

Sub GetDateTwoMonthMore()
 Dim sh As Worksheet, arr As Variant, arrF As Variant, lastRow As Long
 Dim El As Variant, k As Long, currMonth As Long
 
  Set sh = ActiveSheet 'use here your sheet
  lastRow = sh.Range("L" & Rows.count).End(xlUp).row
  currMonth = CLng(Month(Date))   'the current month reference
  arr = sh.Range("L10:L" & lastRow).Value 'load the range to be processed in an array
  ReDim arrF(1 To UBound(arr, 1)) 'Redim the final array at the initial dimension of all the range rows
  For Each El In arr
    If CLng(Mid(El, 5, 2)) = currMonth + 2 Then
    'If CLng(Month(El)) = currMonth + 2 Then 'if your cells are date formatted...
        k = k + 1: arrF(k) = El 'fill the final array with the appropriate dates
    End If
  Next
  ReDim Preserve arrF(k) 'Keep only the non empty array elements
  'Drop the array content in the columnn N:N, at once:
  sh.Range("N10").Resize(UBound(arrF)).Value = WorksheetFunction.Transpose(arrF)
End Sub
如果您的L:L范围是日期格式的,则只能注释/删除该行

If CLng(Mid(El, 5, 2)) = currMonth + 2 Then

对下一个问题发表评论…

也许你只是在寻找类似的东西? 以yyyydd格式包含今天+2个月的字符串:

str=Format(DateAdd(“m”,2,Now()),“yyyymm”)

与其将当前日期转换为文本,不如根据当前日期到日期的数据转换单元格数据以进行比较

Sub testDate()

    Dim y As Integer, y1 As String
    Dim m As Integer, m1 As String, d1 As String
    Dim sDate As Date, eDate As Date
    Dim TargetDay As Date
    Dim rngDB As Range, rng As Range
    Dim Ws As Worksheet
    
    Set Ws = ActiveSheet
    
    y = Year(Date)
    m = Month(Date)
    
    sDate = DateSerial(y, m + 2, 1)
    eDate = DateSerial(y, m + 3, 0) 'Last day
    
    With Ws
        Set rngDB = .Range(Range("L10"), .Range("L" & Rows.Count).End(xlUp))
    End With
    
    For Each rng In rngDB
        y1 = Left(rng, 4)
        m1 = Mid(rng, 5, 2)
        d1 = Right(rng, 2)
        TargetDay = DateSerial(y1, m1, d1)
        If TargetDay >= sDate And TargetDay <= eDate Then
            Debug.Print rng.Address(0, 0, xlA1)
        End If
    Next rng
End Sub
子测试日期()
Dim y为整数,y1为字符串
Dim m为整数,m1为字符串,d1为字符串
Dim sDate作为日期,eDate作为日期
Dim TargetDay作为日期
变暗rngDB As范围,rng As范围
将Ws设置为工作表
设置Ws=ActiveSheet
y=年份(日期)
m=月(日)
sDate=DateSerial(y,m+2,1)
eDate=日期序列(y,m+3,0)'最后一天
与Ws
设置rngDB=.Range(Range(“L10”),.Range(“L”和Rows.Count).End(xlUp))
以
对于rngDB中的每个rng
y1=左侧(rng,4)
m1=Mid(rng,5,2)
d1=右侧(rng,2)
TargetDay=日期序列(y1、m1、d1)

如果TargetDay>=sDate和TargetDay如何以及在何处返回已处理的单元格范围?但是,您确定讨论中的日期格式像字符串一样吗?例如,如果你把一个像
=Day(L2)
这样的公式放进去,它会返回什么?它不会返回任何东西。(您输入的参数太少)。所以,是的,这些不是日期。如何不归还任何东西?如果是字符串,则应返回“NUM!”。如果它是一个日期,它将返回其日期,或者如果该单元格中没有任何内容,则返回零。。。您是否在“L2”中有上述范围之一(如20200901)?哦现在我可以看到您的范围从第10行开始。所以在
=Day(L11)
中更改它。它返回#NUM!所以,请测试我的代码答案。它会满足你的需要。从第十行开始,处理结果将被丢弃在N:N列中。。。请确认它是否符合(我理解)您的要求。@smgrd:这只意味着分析的单元格没有从第五个字符加上下一个字符开始的数字。当代码因错误而停止时,将光标移动到
El
上,会显示什么?请尝试填写上述推荐公式(
=Day(L10)
,直到最后一行的L:L列中有数据)。它是否也返回#NUM!在整个范围内?@smgrd:还活着吗?你能回答我上面的问题吗?对不起,我正在处理其他与代码无关的东西,所以我反应很慢。El显示格式为文本的最后一个单元格。格式实际上是L列中所有“日期”的通用格式。标题格式为文本,这就是显示的内容。@smgrd:很难理解相关内容。。。此“最后一个单元格”是否包含要处理的相同类型的字符串?如果没有,标题是否在范围的末尾?我拿不到……:)如果是这种情况,请尝试使用
arr=sh.Range(“L10:L”和lastRow)
更改
arr=sh.Range(“L10:L”和lastRow-1)
。或者你想说你的射程从第十一行开始,第十行确实存在一个标题?