我有一个包含16000行和40列的基本数据。其中我必须将具有日期的列(A)与日期(今天的日期加上3个月)进行比较,并替换另一列(B)中的文本。
如果今天的日期加上3个月大于列(A),则应将90 days
替换为180 days
,我们在列(B)中有180 days
。我附上了一张带有两列的图片。
问题:它仅替换少数单元格的文本,也不删除小于Today's date plus 3months
的行。
我从用户表单中取出日期。这是userform的代码
userform代码:
Option Explicit
Public Function UserEnteredValue(Optional Prompt As String = "Please choose current date", Optional Default As String) As String
With Me
.DTPicker1.Value = Date
.DTPicker1.SetFocus
.Show
End With
With UserForm1
If .Tag = "Ok" Then
UserEnteredValue = .DTPicker1.Value
End If
End With
Load UserForm1
End Function
Private Sub Cancel_Click()
Unload UserForm1.DTPicker1.Value
End Sub
Private Sub Label1_Click()
With Label1
'to display text
.caption.Text = "Date is for folder"
'text alignment set to center
.TextAlign = fmTextAlignCenter
End With
End Sub
Private Sub Ok_Click()
Me.Tag = "Ok"
Me.Hide
End Sub
Private Sub userform_initialize()
Me.DTPicker1.Value = Date
End Sub
我的代码:
sub vba()
Dim wkb as workbook
Dim p as integer
Dim Fdate as string
Dim uiResult As String
UserForm1.Show
uiResult = UserForm1.DTPicker1.Value
If uiResult = vbNullString Then
MsgBox "canceled"
Els
End If
Fdate = Format(DateAdd("m", 3, uiResult), "dd.mm.yyyy")
With wkb.Worksheets("abc").Cells(1, 1)
For p = .Cells(Rows.Count, "A").End(xlUp).row To 2 Step -1
If Fdate > .Cells(p, "A").Value Then
.Cells(p, "B").Replace What:="(c) <= 180 Days", Replacement:="(c) <= 90 Days", LookAt:=xlPart, SearchOrder:=xlByRows, MatchCase:=False, SearchFormat:=False, _
ReplaceFormat:=False
Else
If Future_date < .Cells(p, "A").Value Then
.Rows(p).EntireRow.Delete
End If
End If
Next p
End With
end sub
问题是。它没有显示我想要的确切结果。如果90 days
大于列(A)日期,则我需要的宏必须将180 days
替换为Fdate
。如果Fdate
小于,则必须删除整行。
当我遇到问题时,替换我们拥有180 days
的所有单元格值的文本并仅删除一些列。
请有人帮助我。
注意:在图片中找不到180 days
,因为它位于16000行的某个位置。
答案 0 :(得分:0)
我认为问题的一部分在于这一行:Fdate = Format(DateAdd("m", 3, uiResult), "dd.mm.yyyy")
Format
函数返回一个字符串值,而不是日期,因此当您将其与单元格中的值进行比较时,它会进行字符串比较。字符串比较基于从左到右的步进。例如,以下测试将导致错误:"01.01.2016" > 02.01.1999"
显然,2016年大于1999年,但字符串不识别年份,只识别2大于1.
快速解决方法是使用类似于以下内容的代码解析循环中的日期字段:
Sub TestDate()
Dim a As Variant
Dim dDate As Date
a = Split(ActiveCell, ".")
dDate = DateSerial(a(2), a(1), a(0))
MsgBox dDate
End Sub