vba时间轴日期为范围,根据日期在2个单元格值Excel2013中选择子范围

时间:2016-07-15 02:42:06

标签: vba excel-vba excel

我正在编写一个时间表,其中包含使用从事件的开始日期到结束日期的事件填充时间轴。

我的日期从“E19”开始一直到“RU19”(结束日期栏可以是任意的。日期是2016年4月3日至2017年7月31日。

事件有3列:

  • 开始日期:A22
  • 结束日期:B22
  • 活动名称:C22

我设置了从“E19”到文档“RU19”的最后一列的范围。是否可以根据将遍历主范围的单元格值设置子范围并从子范围的开始到结束返回值?

因此,例如,如果我在小区A22中的子范围开始日期是2016年4月5日,小区B22中的结束日期是2016年4月8日,我将选择子范围“G19:J19”。

目前的代码是:

Dim LastCol As Long
Dim startDate As Range
'find last column in the document
LastCol = Cells(19, Columns.Count).End(xlToLeft).Column
'set timeline range from start of date data to last column
Set startDate = Range(Cells(19, 5), Cells(19, LastCol))

2 个答案:

答案 0 :(得分:0)

你是否喜欢这样的事情:

Dim StartDate As Range
Dim EndDate As Range
Dim EventRange As Range

Set StartDate = Cells(19, 5 + Cells(22, 1) - Cells(19, 5))
Set EndDate = Cells(19, 5 + Cells(22, 2) - Cells(19, 5))
Set EventRange = Range(StartDate, EndDate)
EventRange.Value = Cells(22, 3)

那将会写出第19行的日期,所以我猜这并不完全是你所追求的,但希望它能为你提供一些线索来继续用。

并且,如果你实际上没有在E19:RU19中有日期,只需更换"细胞(19,5)和#34;在" Set StartDate"结束时和"设置EndDate"具有我在问题中想象的实际日期的陈述将在那里,即

Set StartDate = Cells(19, 5 + Cells(22, 1) - DateSerial(2016, 4, 3))
Set EndDate = Cells(19, 5 + Cells(22, 2) - DateSerial(2016, 4, 3))

在您的回答中发表评论后,以下内容将为第22至30行中的每一行选择子范围。(更改循环以满足您的需要。)

For rowToProcess = 22 To 30
    Set StartDate = Cells(rowToProcess, 5 + Cells(rowToProcess, 1) - Cells(19, 5))
    Set EndDate = Cells(rowToProcess, 5 + Cells(rowToProcess, 2) - Cells(19, 5))
    Set EventRange = Range(StartDate, EndDate)
    'Do whatever you need with the subrange here, e.g. fill in cells with black colour to make it look like a project plan
    range(Cells(rowToProcess, 5), Cells(rowToProcess, Cells.SpecialCells(xlCellTypeLastCell).Column).Interior.Color = xlNone
    EventRange.Interior.Color = vbBlack
Next

答案 1 :(得分:0)

感谢YowE3k的建议,但我想我已经找到了解决方案。

我创建3个范围,rngSelect,rngStart和rngEnd。

rngStart和rngEnd在主范围内找到我的开始和结束单元格的值,rngSelect只是放置找到的日期的地址值并选择它。

现在我可以继续将范围偏移到与事件相同的行并为范围着色。

代码如下:

LastCol = Cells(19, Columns.Count).End(xlToLeft).Column

Set startDate = Range(Cells(19, 5), Cells(19, LastCol))
Set rngStart = startDate.Find(Range("A22"))
Set rngEnd = startDate.Find(Range("B22"))
Set rngSelect = Range(rngStart.Address, rngEnd.Address)

    rngSelect.Select