如何在vba excel中的列中基于日期替换文本

时间:2016-06-08 13:45:26

标签: excel-vba vba excel

我有一个包含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的所有单元格值的文本并仅删除一些列。

enter image description here enter image description here

请有人帮助我。 注意:在图片中找不到180 days,因为它位于16000行的某个位置。

1 个答案:

答案 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