如何使用宏在Excel中将列范围设置为变量?

时间:2017-06-01 13:57:07

标签: excel excel-vba date vba

我有一个日期矩阵,每个日期代表一个不同的任务,项目,计划/实际的开始/结束。请参阅附图:

Screenshot of data

由于实际名称对我的公司是保密的,因此我已将所有内容保留为一般条款。无论如何,每一行和每列都会提供不同的信息。每两行告诉一个日期属于哪个项目,每一行都告诉该日期是开始日期还是结束日期。每两列都会告诉日期属于哪个任务,每列都说明日期是预测日期还是实际日期。

另外,我要对此数据进行的操作是创建一个宏,该宏将搜索用户设置的范围内的所有这些日期,并使用上述信息列出每个日期。到目前为止,我有一个代码为单个行执行此操作:

Sub Sort_By_Date()

Dim StartDate As Date
Dim EndDate As Date
Dim i As Integer


StartDate = Range("F61").Value
EndDate = Range("G61").Value

'Clears out cells
Range("Z74:AD200").Value = ""

m = 74

For i = 71 To 200
If Range("C" & i).Value >= StartDate And Range("C" & i).Value <= EndDate Then
Range("Z" & m).Value = Range("C" & i).Value
Range("AA" & m).Value = Range("A" & i).Value
Range("AB" & m).Value = Range("C69")
Range("AC" & m).Value = Range("B" & i)
Range("AD" & m).Value = Range("C70")
m = m + 1
End If

If Range("D" & i).Value >= StartDate And Range("D" & i).Value <= EndDate Then
Range("Z" & m).Value = Range("D" & i).Value
Range("AA" & m).Value = Range("A" & i).Value
Range("AB" & m).Value = Range("D69")
Range("AC" & m).Value = Range("B" & i)
Range("AD" & m).Value = Range("D70")
m = m + 1
End If

If Range("E" & i).Value >= StartDate And Range("E" & i).Value <= EndDate Then
Range("Z" & m).Value = Range("E" & i).Value
Range("AA" & m).Value = Range("A" & i).Value
Range("AB" & m).Value = Range("E69")
Range("AC" & m).Value = Range("B" & i)
Range("AD" & m).Value = Range("E70")
m = m + 1
End If

... ... ... 希望你能看到这里的模式。

我可以继续复制并粘贴每个列的If Then语句,但必须有一个更有效的方法来完成它。我对Excel宏很新(其他人实际上写了代码的基础),所以我不知道如何让它做我想要的。我想它会将列字母变成数字,然后变成变量,但我只是不知道。我已经尝试过查找,但是我无法将我发现的内容应用到我的特定应用程序中。

所以我的主要问题是:我如何获得If Then语句重复我拥有的每一列数据而无需复制和粘贴数百万次?

2 个答案:

答案 0 :(得分:0)

好像你只需要一个嵌套的for循环:

install.packages("stringr", method = "curl")

答案 1 :(得分:0)

原来我想要的是这个:

Sub Sort_By_Date()

Dim StartDate As Date
Dim EndDate As Date
Dim rwMin As Integer
Dim colMin As Integer
Dim rwMax As Integer
Dim colMax As Integer
Dim rwIndex As Integer
Dim colIndex As Integer

StartDate = Range("F61").Value
EndDate = Range("G61").Value

rwMin = 4
colMin = 3
rwMax = 37
colMax = 68

Range("L44:R2600").Value = ""

m = 44

For colIndex = colMin To colMax

    For rwIndex = rwMin To rwMax

    If Cells(rwIndex, colIndex).Value >= StartDate And Cells(rwIndex, colIndex).Value <= EndDate Then
    Range("L" & m).Value = Cells(rwIndex, colIndex).Value
    Range("M" & m).Value = Cells(rwIndex, 1).Value
    Range("N" & m).Value = Cells(2, colIndex).Value
    Range("O" & m).Value = Cells(1, colIndex).Value
    Range("P" & m).Value = Cells(rwIndex, 2).Value
    Range("Q" & m).Value = Cells(3, colIndex).Value
    m = m + 1
    End If

    Next rwIndex


Next colIndex

End Sub

基本上,我需要从使用Range.Value切换到Cells.Value,然后使用索引。但是,我现在似乎有一个单独的问题,导致运行时错误与我想要包含的另一个函数,但这是一个不同帖子的主题。但是现在它没有那个功能。感谢您的投入!