【问题标题】:Taking over the date correctly to select the searching criteria正确接管日期以选择搜索条件
【发布时间】:2016-03-04 14:22:22
【问题描述】:

我尝试通过表单(期间)上的组合框让人们选择 2 个日期来搜索特定期间内的数据。所选日期用作在数据中搜索的选择标准。我通过这段代码来做:

Private Sub Datumok_Click()
Dim AA1 As String
Dim AA2 As String
Dim AA3 As String
Dim AA4 As String
Dim AA5 As String
Dim AA6 As String
Dim LastRow As Single

AA1 = Me.dag1.Value
AA2 = Me.maand1.Value
AA3 = Me.jaar1.Value
AA4 = Me.dag2.Value
AA5 = Me.maand2.Value
AA6 = Me.jaar2.Value

Application.ScreenUpdating = False

Sheets("Feuil2").Select
LastRow = Cells(Rows.Count, "a").End(xlUp).Row
Sheets("Start").Range("F7") = AA2 & "-" & AA1 & "-" & AA3
Sheets("Start").Range("G7") = AA5 & "-" & AA4 & "-" & AA6
Sheets("Start").Range("F8") = AA1 & "-" & AA2 & "-" & AA3
Sheets("Start").Range("G8") = AA4 & "-" & AA5 & "-" & AA6
Unload Periode
Sheets("Feuil2").Select
ActiveSheet.AutoFilterMode = False
Range(Cells(1, 1), Cells(LastRow, 10)).Select
Selection.AutoFilter
ActiveSheet.Range(Cells(2, 3), Cells(LastRow, 3)).AutoFilter Field:=3,                     ActiveSheet.Range(Cells(2, 3), Cells(LastRow, 3)).AutoFilter Field:=3, Criteria1:=">=" & Sheets("Start").Range("F8"), Operator:=xlAnd, Criteria2:="<=" & Sheets("Start").Range("G8")
Cells(1, 1).Select
Sheets("Start").Select
Cells(8, 5).Value = "Ok"

'Wel blad updaten
Application.ScreenUpdating = True
End Sub

可能有点讨厌的代码。选择被放到一个单元格中,这两个单元格用作选择标准。 有时 vba 或 Excel 不会接管日期,但是当我在过滤器中手动完成时,它可以工作。有谁知道如何改进代码,它总是有效的?

【问题讨论】:

  • 请阅读How to Ask。你甚至没有在这篇文章中提出任何问题!
  • 为什么在 F7、G7、F8 和 G8 中使用 2 种不同格式的 2 个日期?
  • 好问题。这是向用户显示的英文日期(用于过滤器)和(荷兰文)日期的差异。
  • 数据是数字和文本的混合体。第一列是行的标题(没有日期数据)。数据的日期放在第 3 行。我不太习惯这样过滤它。但它应该像这样占据整个部分(在我看来)。
  • 行是这样划分的:[2] [06] [38726](Excel格式的时间)[09] [bla] [0,61] [101,2] [74,3 ] [ok] [ok] [1:05] [88] [21]([] 是一列)。

标签: excel vba


【解决方案1】:

一个好的第一步是消除所有.Select 语句并直接使用您需要的对象。

下一步是删除代码中的 3 个(我认为).AutoFitler 语句,并且只使用一个。我已经对您的代码进行了一些重构(并放置了一些 cmets,以便我可以展示我对您的代码的解释)。

Private Sub Datumok_Click()

Dim AA1 As String
Dim AA2 As String
Dim AA3 As String
Dim AA4 As String
Dim AA5 As String
Dim AA6 As String
Dim sSE As String
Dim sEE As String
Dim LastRow As Single

'start date
AA1 = Me.dag1.Value 'day
AA2 = Me.maand1.Value 'month
AA3 = Me.jaar1.Value 'year

'end date
AA4 = Me.dag2.Value 'day
AA5 = Me.maand2.Value 'month
AA6 = Me.jaar2.Value 'year

Application.ScreenUpdating = False

With Sheets("Start")
    .Range("F7") = AA2 & "-" & AA1 & "-" & AA3
    .Range("G7") = AA5 & "-" & AA4 & "-" & AA6
    .Range("F8") = AA1 & "-" & AA2 & "-" & AA3
    sSE = .Range("F8").Value2
    .Range("G8") = AA4 & "-" & AA5 & "-" & AA6
    sEE = .Range("G8").Value2
End With

Unload Periode

With Sheets("Feuil2")

    .AutoFilterMode = False
    LastRow = .Cells(.Rows.Count, "a").End(xlUp).Row

    'filters columns A(1) through J(10) ... adjust based on your needs
    .Range(Cells(1, 1), Cells(LastRow, 10)).AutoFilter Field:=3, Criteria1:=">=" & sSE, Operator:=xlAnd, Criteria2:="<=" & sEE

End With

With Sheets("Start")
    .Select
    .Cells(8, 5).Value = "Ok"
End With

'Wel blad updaten
Application.ScreenUpdating = True

End Sub

【讨论】:

  • 您为什么使用 with / end with 部分?其余的你是对的。唯一奇怪的是 sSE 是一个数字(42005),而 sEE 是一个日期(30/11/2015),我不知道为什么(据我所知,Excelsheet 上的两个单元格都是日期格式)。
  • With blocks 允许更快的处理(和更容易的代码阅读 IMO)。数字 42005 只是 Excel 日期值格式中的日期。日期 30/11/2015 在美国日期中无法识别,因此根据您的区域设置,它可能无法将其识别为实际日期(这只是为您提供字符串)。
  • sSE = CDate(.Range("F8").Value2) sEE = CDate(.Range("G8").Value2) 更正日期部分,但您的过滤器会抛出“1004”错误.
  • @Helfenstein - 抱歉,我修复了过滤器,因此它将包含 A:J 列...根据需要进行调整。还假设第 1 行是列标题
  • 我回到了我的代码和你的部分代码,但显然使用 CDate 它仍然设法获得两种不同的日期作为选择标准(一种像 1-01-2015 和一种像2015 年 11 月 30 日)。
猜你喜欢
  • 1970-01-01
  • 2017-08-06
  • 2011-01-19
  • 2012-06-19
  • 2017-04-19
  • 1970-01-01
  • 2012-12-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多