【问题标题】:Filtering the months range in VBA by not using the ranges通过不使用范围过滤 VBA 中的月份范围
【发布时间】:2020-02-24 23:03:42
【问题描述】:

我是 VBA 代码的新手,我有一个下拉列表,其中包含从 1 月到 12 月的值。我已经手动添加了直到 12 月的日期。在我编写的当前代码中,如果我选择 Jan,它将复制我输入的范围.当我选择 Jan 或任何其他月份而不指定范围值时,我需要自动选择 jan 整个月的日期。这可能吗?

For Each cel In Range("D2")

If cel.Value = "Jan" Then
Sheets("Actuals").Range("K1:AO1").Select
'copy required data to new sheet
Sheets("Actuals").Range("K1:AO1").Copy

【问题讨论】:

  • 请与我们分享您的数据样本或您的工作成果。
  • 是的,可以通过附加信息来实现。如果只输入月份名称,如何知道使用哪一年?
  • 现在我添加了当年的月份@Ron Rosenfeld
  • 如果 Jan 第 1 行的 K 到 AO(31 列)是 2 月(2020 年)第 2 行的 K 到 AM(29 列)?
  • @CDP1802 - 二月将从同一行开始,排除一月的一个单元格(即一月 K1 到 AO,二月将从 AQ1 到 BS1)

标签: excel vba


【解决方案1】:

使用datediff 函数计算范围的开始 并使用月末eomonth 函数结束范围。

Option Explicit
Function CalcAddress(yr As Integer, mth As String, Jan1 As String) As String

    Dim dt As Date, n As Integer, i As Integer

    ' set date to 1st of month
    dt = Format(yr & "-" & mth & "-01", "yyyy-mmm-dd")

    ' calc days in month
    n = Day(WorksheetFunction.EoMonth(dt, 0))

    ' calculate days from Jan 1
    i = DateDiff("d", DateSerial(yr, 1, 1), dt)
    i = i + Month(dt) - 1 ' add spacer columns

    CalcAddress = Range(Jan1).Offset(0, i).Resize(1, n).Address

End Function

Sub test()

    Dim yr As Integer, mth As String, addr As String

    yr = Year(Date) ' current year
    mth = InputBox("Enter month [Jan,Feb,Mar,..]")
    addr = CalcAddress(yr, mth, "K1")
    MsgBox "Range is " & addr, vbInformation, UCase(mth) & " - " & yr

    'Dim ws1 As Worksheet, ws2 As Worksheet
    'Set ws1 = ThisWorkbook.Sheets("Sheet1")
    'Set ws2 = ThisWorkbook.Sheets("Sheet2")
    'ws1.Range(addr).Copy ws2.Range(addr)

End Sub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-08-30
    • 2015-03-03
    • 1970-01-01
    • 1970-01-01
    • 2014-09-01
    • 2018-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多