在表格中按名称循环遍历每一列

时间:2015-03-10 15:36:38

标签: vba excel-vba excel-2010 excel

我有一个包含七个包含日期的列的表。每列都有使用每列不同公式分配的日期。我的最终目标是将日期与今天进行比较,如果是在一定时间内,则发送电子邮件,然后更新日期。我的问题首先是尝试获取每一行,然后遍历每一列。我试图通过尝试

在黑暗中刺伤
Dim ColWeekly, ColBiWeekly, ColMonthly, ColThMonth, _
ColSxMonth, ColYearly, ColBiYearly As Range
Dim ColVar As Variant
Dim PMTime As Long
Set ColWeekly = Range("PM[Weekly]")   

 For Each Row In [PM].Rows
    For Each Column In [PM].Columns
    Set ColVar = Column.Name
    Select Case ColVar

    Case ColWeekly
        If Date - Cell.Value = 1 Then
        Call Email
        Set Cell.Value = TODAY + 8
        End If

但我一直收到"类型不匹配错误"当它到达Case ColWeekly行时。如果我使用Case ColWeekly.name,它也不起作用。 我确信这实际上是一项非常简单的任务,但我一直在圈子里工作,所以你能提供的任何东西都会受到赞赏。

2 个答案:

答案 0 :(得分:1)

您的示例有很多问题。如果没有关于工作簿格式的更多细节,我将无法纠正它们。

相反,我将提供一个如何正确使用Select Case并进行简单列比较的简单示例。将范围名称WeeklyMonthly分配到列A:C中的某个位置,以便使用此示例。

Option Explicit
Public Sub IterateThroughColumns()
    ' Create some variables
    Dim col As Range, colWeekly As Long, colMonthly As Long

    ' Assigns the column number for each range
    colWeekly = Range("Weekly").Column
    colMonthly = Range("Monthly").Column

    For Each col In Sheet1.Range("A:C").Columns
        Select Case col.Column
            Case colWeekly
                MsgBox "Found Weekly range in column " & col.Column
            Case colMonthly
                MsgBox "Found Monthly range in column " & col.Column
            Case Else
                MsgBox "No range was found in column " & col.Column
        End Select
    Next
End Sub

这应该让您了解如何设置一个简单的For Each循环来迭代列,但是按列号进行比较而不是直接比较范围对象。

答案 1 :(得分:0)

如果标题行是静态的,而您的数据集很小(假设您要发送电子邮件,我会认为是这样),您可以使用这种检查方法。
在我的示例标题中,第5行,我使用了参数。

For i = 6 To LastRow
    For j = 1 To LastColumn
        Select Case True
            Case CStr(Cells(5, j).Value2) Like "*megjegyzés*" 'megjegyzések sortöréseinek eltüntetése
                Cells(i, j).Value = Replace(CStr(Cells(i, j).Value2), vbLf, "")
                Cells(i, j).Value = Replace(CStr(Cells(i, j).Value2), vbCr, "")
                Cells(i, j).Value = Trim(CStr(Cells(i, j).Value2))
            Case CStr(Cells(5, j).Value2) Like "*Tárgy*"
                Cells(i, j).Value = Replace(CStr(Cells(i, j).Value2), vbLf, "")
                Cells(i, j).Value = Replace(CStr(Cells(i, j).Value2), vbCr, "")
                Cells(i, j).Value = Trim(CStr(Cells(i, j).Value2))
            Case CStr(Cells(5, j).Value2) Like "*Kiállítás*" 'dátumok formátumváltása
                Cells(i, j).Value = Year(Cells(i, j).Value) & IIf(Len(Month(Cells(i, j).Value)) = 1, "0" & Month(Cells(i, j).Value), Month(Cells(i, j).Value)) & IIf(Len(Day(Cells(i, j).Value)) = 1, "0" & Day(Cells(i, j).Value), Day(Cells(i, j).Value))
                Cells(i, j).NumberFormat = "General"
            Case CStr(Cells(5, j).Value2) Like "*Esedékes*"
                Cells(i, j).Value = Year(Cells(i, j).Value) & IIf(Len(Month(Cells(i, j).Value)) = 1, "0" & Month(Cells(i, j).Value), Month(Cells(i, j).Value)) & IIf(Len(Day(Cells(i, j).Value)) = 1, "0" & Day(Cells(i, j).Value), Day(Cells(i, j).Value))
                Cells(i, j).NumberFormat = "General"
            Case CStr(Cells(5, j).Value2) Like "*Teljesítés*"
                Cells(i, j).Value = Year(Cells(i, j).Value) & IIf(Len(Month(Cells(i, j).Value)) = 1, "0" & Month(Cells(i, j).Value), Month(Cells(i, j).Value)) & IIf(Len(Day(Cells(i, j).Value)) = 1, "0" & Day(Cells(i, j).Value), Day(Cells(i, j).Value))
                Cells(i, j).NumberFormat = "General"
        End Select
    Next
Next